From fe3711e57c9d6628d8596aad87e6563986771af0 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Sat, 2 May 2026 11:29:26 +0200 Subject: [PATCH] 39 - Add multi-arch build pipeline, fix prod Dockerfile, add .dockerignore --- .dockerignore | 13 ++++++++++ .forgejo/workflows/build.yml | 47 ++++++++++++++++++++++++++++++++++ docker/production/Dockerfile | 10 ++++---- docker/production/start-app.sh | 6 +++-- 4 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 .dockerignore create mode 100644 .forgejo/workflows/build.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..21f6281 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules +vendor +.git +.forgejo +docker/dev +.env +.env.* +.env.testing +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +tests diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml new file mode 100644 index 0000000..1635d45 --- /dev/null +++ b/.forgejo/workflows/build.yml @@ -0,0 +1,47 @@ +name: Build and Push Docker Image + +on: + push: + branches: [main] + tags: ['v*'] + +jobs: + build: + runs-on: docker + container: + image: catthehacker/ubuntu:act-latest + + steps: + - uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Set up QEMU + uses: https://data.forgejo.org/docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: https://data.forgejo.org/docker/setup-buildx-action@v3 + + - name: Login to Forgejo Registry + uses: https://data.forgejo.org/docker/login-action@v3 + with: + registry: forge.lvl0.xyz + username: ${{ github.actor }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Determine tags + id: meta + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + TAG="${{ github.ref_name }}" + echo "tags=forge.lvl0.xyz/myrmidex/incr:${TAG},forge.lvl0.xyz/myrmidex/incr:latest" >> $GITHUB_OUTPUT + else + echo "tags=forge.lvl0.xyz/myrmidex/incr:latest" >> $GITHUB_OUTPUT + fi + + - name: Build and push + uses: https://data.forgejo.org/docker/build-push-action@v5 + with: + context: . + file: docker/production/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index 2cc673a..249e87c 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -7,7 +7,7 @@ WORKDIR /app COPY package*.json ./ # Install Node dependencies -RUN npm ci --only=production +RUN npm ci # Copy frontend source COPY resources/ resources/ @@ -21,7 +21,7 @@ COPY eslint.config.js ./ RUN npm run build # PHP runtime stage -FROM php:8.2-fpm-alpine +FROM php:8.3-fpm-alpine # Install system dependencies RUN apk add --no-cache \ @@ -61,9 +61,9 @@ RUN composer install --no-dev --optimize-autoloader --no-interaction COPY --from=frontend-builder /app/public/build/ ./public/build/ # Copy nginx and supervisor configurations -COPY docker/nginx.conf /etc/nginx/http.d/default.conf -COPY docker/supervisord.conf /etc/supervisord.conf -COPY docker/start-app.sh /usr/local/bin/start-app +COPY docker/production/nginx.conf /etc/nginx/http.d/default.conf +COPY docker/production/supervisord.conf /etc/supervisord.conf +COPY docker/production/start-app.sh /usr/local/bin/start-app # Set proper permissions RUN chown -R www-data:www-data storage bootstrap/cache public/build \ diff --git a/docker/production/start-app.sh b/docker/production/start-app.sh index d617f29..166e047 100644 --- a/docker/production/start-app.sh +++ b/docker/production/start-app.sh @@ -16,8 +16,10 @@ until php artisan tinker --execute="DB::connection()->getPdo();" 2>/dev/null; do done echo "Database is ready!" -# Generate app key if not set -php artisan key:generate --force +# Generate app key only if not already set +if ! grep -q "APP_KEY=base64:" /var/www/html/.env 2>/dev/null; then + php artisan key:generate --force +fi # Laravel optimizations php artisan config:cache