ci: enable deploy stage with SSH-based blue/green deployment
Writes .env to web/, runs deploy.sh from web/. Pushes env vars from GitLab CI/CD variables to the server on every master push. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@ image: python:3.13
|
|||||||
stages:
|
stages:
|
||||||
# - lint
|
# - lint
|
||||||
- test
|
- test
|
||||||
# - deploy
|
- deploy
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
UV_CACHE_DIR: "$CI_PROJECT_DIR/.uv-cache"
|
UV_CACHE_DIR: "$CI_PROJECT_DIR/.uv-cache"
|
||||||
@@ -71,41 +71,44 @@ test:web:
|
|||||||
- changes:
|
- changes:
|
||||||
- web/**/*
|
- web/**/*
|
||||||
|
|
||||||
#deploy:web:
|
deploy:web:
|
||||||
# stage: deploy
|
stage: deploy
|
||||||
# image: alpine:latest
|
image: alpine:latest
|
||||||
# needs: [test:web]
|
needs: [test:web]
|
||||||
# rules:
|
rules:
|
||||||
# - if: $CI_COMMIT_BRANCH == "master"
|
- if: $CI_COMMIT_BRANCH == "master"
|
||||||
# changes:
|
before_script:
|
||||||
# - web/**/*
|
- apk add --no-cache openssh-client
|
||||||
# before_script:
|
- eval $(ssh-agent -s)
|
||||||
# - apk add --no-cache openssh-client
|
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||||
# - eval $(ssh-agent -s)
|
- mkdir -p ~/.ssh
|
||||||
# - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
- chmod 700 ~/.ssh
|
||||||
# - mkdir -p ~/.ssh
|
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
|
||||||
# - chmod 700 ~/.ssh
|
script:
|
||||||
# - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
|
- |
|
||||||
# script:
|
ssh "$DEPLOY_USER@$DEPLOY_HOST" "cat > /opt/beanflows/web/.env" << ENVEOF
|
||||||
# - |
|
APP_NAME=$APP_NAME
|
||||||
# ssh "$DEPLOY_USER@$DEPLOY_HOST" "cat > /opt/beanflows/beanflows/.env" << ENVEOF
|
SECRET_KEY=$SECRET_KEY
|
||||||
# APP_NAME=$APP_NAME
|
BASE_URL=$BASE_URL
|
||||||
# SECRET_KEY=$SECRET_KEY
|
DEBUG=false
|
||||||
# BASE_URL=$BASE_URL
|
DATABASE_PATH=data/app.db
|
||||||
# DEBUG=false
|
MAGIC_LINK_EXPIRY_MINUTES=$MAGIC_LINK_EXPIRY_MINUTES
|
||||||
# ADMIN_PASSWORD=$ADMIN_PASSWORD
|
SESSION_LIFETIME_DAYS=$SESSION_LIFETIME_DAYS
|
||||||
# DATABASE_PATH=data/app.db
|
RESEND_API_KEY=$RESEND_API_KEY
|
||||||
# MAGIC_LINK_EXPIRY_MINUTES=${MAGIC_LINK_EXPIRY_MINUTES:-15}
|
EMAIL_FROM=$EMAIL_FROM
|
||||||
# SESSION_LIFETIME_DAYS=${SESSION_LIFETIME_DAYS:-30}
|
RESEND_AUDIENCE_WAITLIST=$RESEND_AUDIENCE_WAITLIST
|
||||||
# RESEND_API_KEY=$RESEND_API_KEY
|
ADMIN_EMAILS=$ADMIN_EMAILS
|
||||||
# EMAIL_FROM=${EMAIL_FROM:-hello@example.com}
|
WAITLIST_MODE=$WAITLIST_MODE
|
||||||
# ADMIN_EMAILS=${ADMIN_EMAILS:-}
|
RATE_LIMIT_REQUESTS=$RATE_LIMIT_REQUESTS
|
||||||
# RATE_LIMIT_REQUESTS=${RATE_LIMIT_REQUESTS:-100}
|
RATE_LIMIT_WINDOW=$RATE_LIMIT_WINDOW
|
||||||
# RATE_LIMIT_WINDOW=${RATE_LIMIT_WINDOW:-60}
|
PADDLE_API_KEY=$PADDLE_API_KEY
|
||||||
# PADDLE_API_KEY=$PADDLE_API_KEY
|
PADDLE_WEBHOOK_SECRET=$PADDLE_WEBHOOK_SECRET
|
||||||
# PADDLE_WEBHOOK_SECRET=$PADDLE_WEBHOOK_SECRET
|
PADDLE_ENVIRONMENT=$PADDLE_ENVIRONMENT
|
||||||
# PADDLE_PRICE_STARTER=$PADDLE_PRICE_STARTER
|
PADDLE_PRICE_STARTER=$PADDLE_PRICE_STARTER
|
||||||
# PADDLE_PRICE_PRO=$PADDLE_PRICE_PRO
|
PADDLE_PRICE_PRO=$PADDLE_PRICE_PRO
|
||||||
# ENVEOF
|
UMAMI_SCRIPT_URL=$UMAMI_SCRIPT_URL
|
||||||
# - ssh "$DEPLOY_USER@$DEPLOY_HOST" "chmod 600 /opt/beanflows/beanflows/.env"
|
UMAMI_WEBSITE_ID=$UMAMI_WEBSITE_ID
|
||||||
# - ssh "$DEPLOY_USER@$DEPLOY_HOST" "cd /opt/beanflows && git pull origin master && ./deploy.sh"
|
SERVING_DUCKDB_PATH=$SERVING_DUCKDB_PATH
|
||||||
|
ENVEOF
|
||||||
|
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "chmod 600 /opt/beanflows/web/.env"
|
||||||
|
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "cd /opt/beanflows && git pull origin master && cd web && bash deploy.sh"
|
||||||
|
|||||||
Reference in New Issue
Block a user