Skip to content

feat: delay the notification test so it arrives in the background #24

feat: delay the notification test so it arrives in the background

feat: delay the notification test so it arrives in the background #24

Workflow file for this run

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