feat: delay the notification test so it arrives in the background #24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 🚀 Deploy FastAPI (api/) to VPS | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - 'api/**' | |
| - '.github/workflows/deploy-api.yml' | |
| workflow_dispatch: | |
| concurrency: | |
| group: nightforge-api-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| deploy: | |
| name: 🏗️ Deploy API | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: 📥 Checkout (sparse) | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 1 | |
| sparse-checkout: | | |
| api | |
| lfs: false | |
| - name: 🧱 Ensure target structure (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| TARGET_DIR="/var/www/api.nightforge.dibodev.fr/html" | |
| sudo mkdir -p "$TARGET_DIR/api" | |
| sudo mkdir -p "$TARGET_DIR/.venv" | |
| sudo rm -rf "$TARGET_DIR/api" | |
| sudo mkdir -p "$TARGET_DIR/api" | |
| sudo chown -R $USER:$USER "$TARGET_DIR" | |
| - name: 📤 Upload API sources (SCP) | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| strip_components: 0 | |
| source: 'api' | |
| target: /var/www/api.nightforge.dibodev.fr/html | |
| - name: 🐍 Create/update venv & install deps (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| TARGET_DIR="/var/www/api.nightforge.dibodev.fr/html" | |
| cd "$TARGET_DIR" | |
| sudo apt-get update -y --allow-releaseinfo-change || true | |
| sudo apt-get install -y python3-venv | |
| if [ ! -x ".venv/bin/python" ]; then | |
| python3 -m venv .venv | |
| fi | |
| . .venv/bin/activate | |
| python -m pip install --upgrade pip wheel | |
| pip install -r api/requirements.txt --no-cache-dir | |
| deactivate | |
| - name: ⚙️ Create .env file (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| TARGET_DIR="/var/www/api.nightforge.dibodev.fr/html" | |
| cd "$TARGET_DIR/api" | |
| cat > .env <<EOF | |
| ENV=production | |
| DEBUG=false | |
| API_VERSION=v1 | |
| API_PREFIX=/api/v1 | |
| API_BASE_URL=${{ secrets.API_BASE_URL }} | |
| HOST=127.0.0.1 | |
| PORT=8022 | |
| CORS_ORIGINS=${{ secrets.CORS_ORIGINS }} | |
| DATABASE_URL=${{ secrets.DATABASE_URL }} | |
| SECRET_KEY=${{ secrets.SECRET_KEY }} | |
| ADMIN_EMAIL=${{ secrets.ADMIN_EMAIL }} | |
| ADMIN_PASSWORD=${{ secrets.ADMIN_PASSWORD }} | |
| ACCESS_TOKEN_EXPIRE_MINUTES=1440 | |
| ENCRYPTION_KEY=${{ secrets.ENCRYPTION_KEY }} | |
| FRONTEND_URL=${{ secrets.FRONTEND_URL }} | |
| GROQ_API_KEY=${{ secrets.GROQ_API_KEY }} | |
| VAPID_PUBLIC_KEY=${{ secrets.VAPID_PUBLIC_KEY }} | |
| VAPID_PRIVATE_KEY_B64=${{ secrets.VAPID_PRIVATE_KEY_B64 }} | |
| VAPID_SUBJECT=${{ secrets.VAPID_SUBJECT }} | |
| EOF | |
| - name: 🗄️ Run database initialization (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| TARGET_DIR="/var/www/api.nightforge.dibodev.fr/html" | |
| cd "$TARGET_DIR/api" | |
| PYTHONPATH="$TARGET_DIR/api" ../.venv/bin/python init_db.py | |
| - name: ⚙️ Configure/restart systemd service (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| TARGET_DIR="/var/www/api.nightforge.dibodev.fr/html" | |
| SERVICE_NAME="nightforge-api.service" | |
| DEPLOY_USER="${{ secrets.SSH_USERNAME }}" | |
| sudo bash -c "cat > /etc/systemd/system/${SERVICE_NAME}" <<EOF | |
| [Unit] | |
| Description=NightForge FastAPI (Uvicorn) | |
| After=network.target | |
| [Service] | |
| User=${DEPLOY_USER} | |
| WorkingDirectory=${TARGET_DIR}/api | |
| Environment=PYTHONPATH=${TARGET_DIR}/api | |
| ExecStart=${TARGET_DIR}/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8022 --workers 1 --proxy-headers | |
| Restart=always | |
| RestartSec=5 | |
| KillSignal=SIGINT | |
| [Install] | |
| WantedBy=multi-user.target | |
| EOF | |
| sudo systemctl daemon-reload | |
| sudo systemctl enable ${SERVICE_NAME} | |
| sudo systemctl restart ${SERVICE_NAME} | |
| - name: 🔄 Test & reload Nginx (SSH) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| port: ${{ secrets.SSH_PORT }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| set -e | |
| sudo nginx -t | |
| sudo systemctl reload nginx |