From b8ef2d7b82cdcc67ba6e137aa5dcbbd63b4d7ca2 Mon Sep 17 00:00:00 2001 From: Leon Morival Date: Tue, 19 May 2026 14:44:29 +0200 Subject: [PATCH] feat: blue & green --- .gitea/workflows/deploy.yml | 40 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index b2aa4eb..6ac26a4 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -34,7 +34,7 @@ jobs: && php artisan test" # ========================= - # BUILD & PUSH IMAGE + # BUILD & PUSH # ========================= build: name: Build & Push Docker @@ -60,7 +60,7 @@ jobs: docker push "$IMAGE:latest" # ========================= - # DEPLOY BLUE / GREEN + # DEPLOY BLUE / GREEN + SWITCH NGINX # ========================= deploy: name: Deploy Blue/Green @@ -84,6 +84,8 @@ jobs: uses: appleboy/ssh-action@v1.0.3 env: IMAGE_TAG: ${{ github.sha }} + REGISTRY: ${{ env.REGISTRY }} + IMAGE_NAME: ${{ env.IMAGE_NAME }} DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} with: host: ${{ secrets.SSH_HOST }} @@ -95,14 +97,10 @@ jobs: APP_DIR="${DEPLOY_PATH:-/opt/bemeal}" COMPOSE_FILE="docker-compose.prod.yml" + NGINX_CONTAINER="nginx" cd "$APP_DIR" - if [ ! -f "$COMPOSE_FILE" ]; then - echo "Missing docker-compose.prod.yml" - exit 1 - fi - COMPOSE="docker compose --env-file .env.prod -f $COMPOSE_FILE" IMAGE="$REGISTRY/$IMAGE_NAME:$IMAGE_TAG" @@ -114,9 +112,8 @@ jobs: $COMPOSE up -d pgsql redis meilisearch # ========================= - # BLUE / GREEN LOGIC + # BLUE / GREEN DETECTION # ========================= - ACTIVE="" if docker ps --format '{{.Names}}' | grep -q "bemeal-api-blue"; then @@ -144,7 +141,11 @@ jobs: IMAGE="$REGISTRY/$IMAGE_NAME:$IMAGE_TAG" \ $COMPOSE up -d --force-recreate --no-deps "$TARGET_SERVICE" + # ========================= + # HEALTHCHECK + # ========================= echo "Waiting for healthcheck..." + for i in $(seq 1 60); do STATUS="$(docker inspect -f '{{.State.Health.Status}}' "$TARGET_SERVICE" 2>/dev/null || true)" @@ -161,15 +162,28 @@ jobs: exit 1 fi - echo "API is healthy on $TARGET_SERVICE" - docker exec "$TARGET_SERVICE" wget -qO- http://127.0.0.1/api/health >/dev/null || exit 1 + echo "API healthy → switching Nginx" + + # ========================= + # NGINX SWITCH AUTOMATIQUE + # ========================= + if [ "$TARGET" = "blue" ]; then + echo "server bemeal-api-blue:80;" > /opt/bemeal/nginx/upstream.conf + else + echo "server bemeal-api-green:80;" > /opt/bemeal/nginx/upstream.conf + fi + + docker exec "$NGINX_CONTAINER" nginx -s reload + echo "Deployment successful" - # optional cleanup old container + # ========================= + # CLEAN OLD CONTAINER + # ========================= if [ -n "$ACTIVE" ] && [ "$ACTIVE" != "$TARGET" ]; then - echo "Stopping old $ACTIVE container" + echo "Stopping old $ACTIVE" $COMPOSE stop "bemeal-api-$ACTIVE" || true $COMPOSE rm -f "bemeal-api-$ACTIVE" || true fi