From 8d02dc6f7c8e3a739273f771883685e9c0585ce4 Mon Sep 17 00:00:00 2001 From: Leon Morival Date: Tue, 19 May 2026 12:42:31 +0200 Subject: [PATCH] feat: try fix ci/cd --- .gitea/workflows/deploy.yml | 51 ++++++++++++++------------ docker-compose.prod.yml | 7 ++-- docker/nginx/bemeal-upstream.blue.inc | 2 +- docker/nginx/bemeal-upstream.green.inc | 2 +- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 6f10594..6ab1b9c 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -77,7 +77,7 @@ jobs: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} - source: docker-compose.prod.yml + source: docker-compose.prod.yml,docker/nginx/* target: ${{ secrets.DEPLOY_PATH || '/opt/bemeal' }} - name: Deploy via SSH (Blue/Green) @@ -85,26 +85,23 @@ jobs: env: IMAGE_TAG: ${{ github.sha }} DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} + NGINX_CONTAINER: ${{ secrets.NGINX_CONTAINER }} + NGINX_UPSTREAM_FILE: ${{ secrets.NGINX_UPSTREAM_FILE }} with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} - envs: REGISTRY,IMAGE_NAME,IMAGE_TAG,DEPLOY_PATH + envs: REGISTRY,IMAGE_NAME,IMAGE_TAG,DEPLOY_PATH,NGINX_CONTAINER,NGINX_UPSTREAM_FILE script: | set -eu APP_DIR="${DEPLOY_PATH:-/opt/bemeal}" COMPOSE_FILE="docker-compose.prod.yml" COMPOSE_ENV_FILE=".env.prod" - UPSTREAM_FILE="/etc/nginx/conf.d/bemeal-upstream.inc" + NGINX_CONTAINER="${NGINX_CONTAINER:-nginx}" + NGINX_UPSTREAM_FILE="${NGINX_UPSTREAM_FILE:-/etc/nginx/conf.d/bemeal-upstream.inc}" DRAIN_SECONDS="${DRAIN_SECONDS:-20}" - if [ "$(id -u)" -eq 0 ]; then - SUDO="" - else - SUDO="sudo" - fi - if [ ! -d "$APP_DIR" ]; then echo "Missing deploy directory: $APP_DIR" echo "Set the DEPLOY_PATH secret to the directory containing $COMPOSE_FILE." @@ -119,6 +116,12 @@ jobs: exit 1 fi + if ! docker inspect "$NGINX_CONTAINER" >/dev/null 2>&1; then + echo "Missing Nginx container: $NGINX_CONTAINER" + echo "Set the NGINX_CONTAINER secret to your reverse proxy container name." + exit 1 + fi + if [ -f "$COMPOSE_ENV_FILE" ]; then COMPOSE="docker compose --env-file $COMPOSE_ENV_FILE -f $COMPOSE_FILE" else @@ -135,18 +138,18 @@ jobs: $COMPOSE up -d pgsql redis meilisearch ACTIVE="" - if grep -q "127.0.0.1:8081" "$UPSTREAM_FILE" 2>/dev/null; then + if docker exec "$NGINX_CONTAINER" sh -c "test -f '$NGINX_UPSTREAM_FILE' && grep -q 'bemeal-api-blue:80' '$NGINX_UPSTREAM_FILE'" 2>/dev/null; then ACTIVE="blue" - elif grep -q "127.0.0.1:8082" "$UPSTREAM_FILE" 2>/dev/null; then + elif docker exec "$NGINX_CONTAINER" sh -c "test -f '$NGINX_UPSTREAM_FILE' && grep -q 'bemeal-api-green:80' '$NGINX_UPSTREAM_FILE'" 2>/dev/null; then ACTIVE="green" fi if [ "$ACTIVE" = "blue" ]; then TARGET="green" - TARGET_PORT="8082" + TARGET_HOST="bemeal-api-green" else TARGET="blue" - TARGET_PORT="8081" + TARGET_HOST="bemeal-api-blue" fi TARGET_SERVICE="bemeal-api-$TARGET" @@ -171,29 +174,29 @@ jobs: exit 1 fi - curl -fsS "http://127.0.0.1:$TARGET_PORT/api/health" >/dev/null + docker exec "$TARGET_SERVICE" wget -qO- http://127.0.0.1/api/health >/dev/null - if [ -f "$UPSTREAM_FILE" ]; then - $SUDO cp "$UPSTREAM_FILE" "$UPSTREAM_FILE.bak" - fi + NGINX_UPSTREAM_DIR="$(dirname "$NGINX_UPSTREAM_FILE")" + docker exec "$NGINX_CONTAINER" sh -c "mkdir -p '$NGINX_UPSTREAM_DIR'" + docker exec "$NGINX_CONTAINER" sh -c "test ! -f '$NGINX_UPSTREAM_FILE' || cp '$NGINX_UPSTREAM_FILE' '$NGINX_UPSTREAM_FILE.bak'" printf '%s\n' \ 'upstream bemeal_api {' \ - " server 127.0.0.1:$TARGET_PORT max_fails=3 fail_timeout=10s;" \ + " server $TARGET_HOST:80 max_fails=3 fail_timeout=10s;" \ ' keepalive 32;' \ - '}' | $SUDO tee "$UPSTREAM_FILE" >/dev/null + '}' | docker exec -i "$NGINX_CONTAINER" sh -c "cat > '$NGINX_UPSTREAM_FILE'" - if ! $SUDO nginx -t; then - if [ -f "$UPSTREAM_FILE.bak" ]; then - $SUDO mv "$UPSTREAM_FILE.bak" "$UPSTREAM_FILE" + if ! docker exec "$NGINX_CONTAINER" nginx -t; then + if docker exec "$NGINX_CONTAINER" sh -c "test -f '$NGINX_UPSTREAM_FILE.bak'" 2>/dev/null; then + docker exec "$NGINX_CONTAINER" sh -c "mv '$NGINX_UPSTREAM_FILE.bak' '$NGINX_UPSTREAM_FILE'" fi exit 1 fi echo "Switch Nginx traffic to $TARGET" - $SUDO nginx -s reload - $SUDO rm -f "$UPSTREAM_FILE.bak" + docker exec "$NGINX_CONTAINER" nginx -s reload + docker exec "$NGINX_CONTAINER" rm -f "$NGINX_UPSTREAM_FILE.bak" echo "Restart workers on the new image" $COMPOSE up -d --force-recreate --no-deps horizon scheduler diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index de9f81f..288c04e 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -63,6 +63,7 @@ x-app-service: &app-service environment: *app-environment volumes: *app-volumes networks: + - nginx - internal stop_grace_period: 30s @@ -70,15 +71,11 @@ services: bemeal-api-blue: <<: *app-service container_name: bemeal-api-blue - ports: - - "127.0.0.1:8081:80" healthcheck: *app-healthcheck bemeal-api-green: <<: *app-service container_name: bemeal-api-green - ports: - - "127.0.0.1:8082:80" healthcheck: *app-healthcheck pgsql: @@ -176,5 +173,7 @@ volumes: name: bemeal_meilisearch_data networks: + nginx: + external: true internal: driver: bridge diff --git a/docker/nginx/bemeal-upstream.blue.inc b/docker/nginx/bemeal-upstream.blue.inc index f1f0119..af6d61d 100644 --- a/docker/nginx/bemeal-upstream.blue.inc +++ b/docker/nginx/bemeal-upstream.blue.inc @@ -1,4 +1,4 @@ upstream bemeal_api { - server 127.0.0.1:8081 max_fails=3 fail_timeout=10s; + server bemeal-api-blue:80 max_fails=3 fail_timeout=10s; keepalive 32; } diff --git a/docker/nginx/bemeal-upstream.green.inc b/docker/nginx/bemeal-upstream.green.inc index f46e40b..4a32d57 100644 --- a/docker/nginx/bemeal-upstream.green.inc +++ b/docker/nginx/bemeal-upstream.green.inc @@ -1,4 +1,4 @@ upstream bemeal_api { - server 127.0.0.1:8082 max_fails=3 fail_timeout=10s; + server bemeal-api-green:80 max_fails=3 fail_timeout=10s; keepalive 32; }