@@ -11,6 +11,13 @@ HEALTH_PATH="/openapi.json"
1111MAX_RETRIES=10
1212ENVSUBST_VARS=' ${API_BLUE_PORT} ${API_GREEN_PORT} ${N8N_PORT} ${FRONTEND_PORT} ${DOMAIN} ${N8N_DOMAIN} ${FRONTEND_DOMAIN}'
1313
14+ REQUIRED_VARS=(
15+ POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB
16+ GOOGLE_SERVICE_ACCOUNT_FILE GOOGLE_SHEETS_ID
17+ SYNC_TOKEN JWT_SECRET GOOGLE_CLIENT_ID
18+ API_BLUE_PORT API_GREEN_PORT N8N_PORT
19+ )
20+
1421current_slot () {
1522 grep proxy_pass " $NGINX_CONF " 2> /dev/null | grep -q " api_blue" && echo " blue" || echo " green"
1623}
@@ -34,33 +41,38 @@ health_check() {
3441 return 1
3542}
3643
37- check_credentials () {
44+ check_env () {
3845 if [ ! -f .env ]; then
39- echo " FAIL: .env not found (CI/CD should have uploaded it) "
46+ echo " FAIL: .env not found"
4047 exit 1
4148 fi
42- local sa_file
43- sa_file=$( grep -m1 ' ^GOOGLE_SERVICE_ACCOUNT_FILE=' .env | cut -d= -f2-)
44- if [ -z " $sa_file " ]; then
45- echo " FAIL: GOOGLE_SERVICE_ACCOUNT_FILE not set in .env"
49+ set -a; source .env; set +a
50+ local missing=()
51+ for var in " ${REQUIRED_VARS[@]} " ; do
52+ if [ -z " ${! var:- } " ]; then
53+ missing+=(" $var " )
54+ fi
55+ done
56+ if [ ${# missing[@]} -gt 0 ]; then
57+ echo " FAIL: Missing env vars: ${missing[*]} "
4658 exit 1
4759 fi
48- if [ ! -f " $sa_file " ]; then
49- echo " FAIL: $sa_file not found (CI/CD should have uploaded it) "
60+ if [ ! -f " $GOOGLE_SERVICE_ACCOUNT_FILE " ]; then
61+ echo " FAIL: $GOOGLE_SERVICE_ACCOUNT_FILE not found"
5062 exit 1
5163 fi
5264}
5365
5466render_nginx () {
55- set -a; source .env; set +a
5667 envsubst " $ENVSUBST_VARS " < " $NGINX_TEMPLATE " > " $NGINX_CONF "
5768}
5869
5970echo " === BCSD API Blue-Green Deploy ==="
6071
61- check_credentials
72+ echo " 0. Checking environment..."
73+ check_env
6274
63- echo " 0 . Ensuring DB services..."
75+ echo " 1 . Ensuring DB services..."
6476$COMPOSE_DB up -d
6577
6678render_nginx
@@ -70,13 +82,19 @@ NEXT=$(next_slot)
7082
7183echo " Current: $CURRENT → Deploying: $NEXT "
7284
73- echo " 1 . Building $NEXT ..."
85+ echo " 2 . Building $NEXT ..."
7486$COMPOSE build " api-${NEXT} "
7587
76- echo " 2. Starting $NEXT ..."
88+ echo " 3. Running DB migrations..."
89+ $COMPOSE run --rm --no-deps " api-${NEXT} " alembic upgrade head
90+
91+ echo " 4. Seeding PG from Sheets (if empty)..."
92+ $COMPOSE run --rm --no-deps " api-${NEXT} " python -m bcsd_api.sync.seed
93+
94+ echo " 5. Starting $NEXT ..."
7795$COMPOSE up -d --remove-orphans " api-${NEXT} "
7896
79- echo " 3 . Health check on api-${NEXT} ..."
97+ echo " 6 . Health check on api-${NEXT} ..."
8098if ! health_check " $NEXT " ; then
8199 echo " FAIL: $NEXT did not become healthy"
82100 echo " --- Container logs ---"
@@ -86,14 +104,17 @@ if ! health_check "$NEXT"; then
86104 exit 1
87105fi
88106
89- echo " 4 . Switching nginx → $NEXT "
107+ echo " 7 . Switching nginx → $NEXT "
90108sed -i " s/proxy_pass http:\/\/api_${CURRENT} /proxy_pass http:\/\/api_${NEXT} /g" " $NGINX_CONF "
91109sudo mkdir -p /var/www/certbot
92110sudo cp " $NGINX_CONF " " $NGINX_AVAILABLE "
93111sudo ln -sf " $NGINX_AVAILABLE " " $NGINX_ENABLED "
94112sudo nginx -t && sudo nginx -s reload
95113
96- echo " 5 . Stopping old ($CURRENT )..."
114+ echo " 8 . Stopping old ($CURRENT )..."
97115$COMPOSE stop " api-${CURRENT} "
98116
117+ echo " 9. Initializing n8n..."
118+ bash infra/scripts/init_n8n.sh
119+
99120echo " === Deploy complete: $NEXT is live ==="
0 commit comments