From 854952d4487826031273a352ee9972f06f280f97 Mon Sep 17 00:00:00 2001 From: tristan Date: Mon, 30 Mar 2026 17:43:18 +0200 Subject: [PATCH] feat : add nginx reverse proxy config for Docker setup --- .gitea/workflows/build-docker.yml | 30 +++++++++++++ .gitea/workflows/release-artefact.yml | 65 --------------------------- deploy/docker/.env.example | 25 +++++++++++ deploy/docker/deploy.sh | 28 ++++++++++++ deploy/docker/docker-compose.prod.yml | 13 ++++++ deploy/nginx/sirh-docker.conf | 12 +++++ 6 files changed, 108 insertions(+), 65 deletions(-) create mode 100644 .gitea/workflows/build-docker.yml delete mode 100644 .gitea/workflows/release-artefact.yml create mode 100644 deploy/docker/.env.example create mode 100755 deploy/docker/deploy.sh create mode 100644 deploy/docker/docker-compose.prod.yml create mode 100644 deploy/nginx/sirh-docker.conf diff --git a/.gitea/workflows/build-docker.yml b/.gitea/workflows/build-docker.yml new file mode 100644 index 0000000..b00f8a2 --- /dev/null +++ b/.gitea/workflows/build-docker.yml @@ -0,0 +1,30 @@ +name: Build & Push Docker Image + +on: + push: + tags: + - "v*" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to Gitea Registry + run: | + echo "${{ secrets.RELEASE_TOKEN }}" | docker login gitea.malio.fr -u "${{ gitea.repository_owner }}" --password-stdin + + - name: Build Docker image + run: | + docker build \ + -f deploy/docker/Dockerfile.prod \ + -t gitea.malio.fr/malio-dev/sirh:${{ github.ref_name }} \ + -t gitea.malio.fr/malio-dev/sirh:latest \ + . + + - name: Push Docker image + run: | + docker push gitea.malio.fr/malio-dev/sirh:${{ github.ref_name }} + docker push gitea.malio.fr/malio-dev/sirh:latest diff --git a/.gitea/workflows/release-artefact.yml b/.gitea/workflows/release-artefact.yml deleted file mode 100644 index e9a4c3d..0000000 --- a/.gitea/workflows/release-artefact.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Build Release Artefact - -on: - push: - tags: - - "v*" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "8.4" - extensions: mbstring, intl, pdo_pgsql, xml, curl, zip, gd - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: "lts/*" - - - name: Install backend deps (prod) - env: - APP_ENV: prod - APP_DEBUG: "0" - run: composer install --no-dev --optimize-autoloader --no-interaction --no-scripts - - - name: Build frontend (static) - run: | - cd frontend - npm ci - CI=1 NUXT_TELEMETRY_DISABLED=1 NUXT_PUBLIC_API_BASE=/api NUXT_PUBLIC_APP_BASE=/ npm run generate - test -f .output/public/index.html - - - name: Build artefact - shell: bash - run: | - set -euo pipefail - mkdir -p release - tar -czf "release/sirh-${GITHUB_REF_NAME}.tar.gz" \ - bin \ - config \ - migrations \ - public \ - src \ - templates \ - vendor \ - composer.json \ - composer.lock \ - symfony.lock \ - frontend/.output - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - files: release/sirh-${{ github.ref_name }}.tar.gz - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} diff --git a/deploy/docker/.env.example b/deploy/docker/.env.example new file mode 100644 index 0000000..bc2bdec --- /dev/null +++ b/deploy/docker/.env.example @@ -0,0 +1,25 @@ +# Symfony +APP_ENV=prod +APP_DEBUG=0 +APP_SECRET=change-me + +# Database (use host.docker.internal to reach bare-metal PostgreSQL) +DATABASE_URL="postgresql://sirh_user:password@host.docker.internal:5432/sirh?serverVersion=16&charset=utf8" + +# JWT +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE=change-me +JWT_COOKIE_SECURE=1 +JWT_COOKIE_SAMESITE=lax +JWT_TOKEN_TTL=86400 +JWT_COOKIE_TTL=86400 + +# CORS +CORS_ALLOW_ORIGIN='^https?://sirh\.malio-dev\.fr$' + +# App +DEFAULT_URI=https://sirh.malio-dev.fr +APP_SHARE_DIR=var/share +RTT_START_DATE=2026-02-23 +HOLIDAY_URL="https://calendrier.api.gouv.fr/jours-feries/" diff --git a/deploy/docker/deploy.sh b/deploy/docker/deploy.sh new file mode 100755 index 0000000..db2f765 --- /dev/null +++ b/deploy/docker/deploy.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" + +TAG="${1:-latest}" +export SIRH_IMAGE_TAG="$TAG" + +echo "==> Deploying sirh:${TAG}..." + +echo "==> Pulling image..." +docker compose pull + +echo "==> Starting container..." +docker compose up -d + +echo "==> Waiting for container to be ready..." +sleep 3 + +echo "==> Running migrations..." +docker compose exec -T app php bin/console doctrine:migrations:migrate --no-interaction + +echo "==> Clearing cache..." +docker compose exec -T app php bin/console cache:clear --env=prod +docker compose exec -T app php bin/console cache:warmup --env=prod + +VERSION=$(docker compose exec -T app cat config/version.yaml | grep 'app.version' | awk -F"'" '{print $2}') +echo "==> Deployed v${VERSION}" diff --git a/deploy/docker/docker-compose.prod.yml b/deploy/docker/docker-compose.prod.yml new file mode 100644 index 0000000..6000ed8 --- /dev/null +++ b/deploy/docker/docker-compose.prod.yml @@ -0,0 +1,13 @@ +services: + app: + image: gitea.malio.fr/malio-dev/sirh:${SIRH_IMAGE_TAG:-latest} + container_name: sirh-app + env_file: .env + ports: + - "8080:80" + volumes: + - ./config/jwt:/var/www/html/config/jwt:ro + - ./uploads:/var/www/html/var/uploads + extra_hosts: + - "host.docker.internal:host-gateway" + restart: unless-stopped diff --git a/deploy/nginx/sirh-docker.conf b/deploy/nginx/sirh-docker.conf new file mode 100644 index 0000000..7006208 --- /dev/null +++ b/deploy/nginx/sirh-docker.conf @@ -0,0 +1,12 @@ +server { + listen 80; + server_name sirh.malio-dev.fr; + + location / { + proxy_pass http://127.0.0.1:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +}