Files
netrunner-data/.gitea/workflows/deploy.yml
T
nineap f373601025 CI: генерирует TLS-сертификат Postgres при первом деплое, добавляет BACKEND_DB_*
Синкает postgres/pg_hba.conf, postgres/init-backend-db.sh и scripts/backup.sh
на VPS (раньше копировался только docker-compose.yml). Самоподписанный
сертификат создаётся один раз, если ещё не существует — повторные деплои
его не трогают, чтобы не рвать открытые TLS-сессии рестартом контейнера.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 17:17:20 +07:00

103 lines
5.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Deploy
# Postgres здесь принимает подключения по сети от netrunner-backend, который
# живёт на ОТДЕЛЬНОМ VPS (см. docker-compose.yml, сервис `db`, и
# postgres/pg_hba.conf) — самоподписанный TLS-сертификат генерируется прямо
# этим workflow при первом деплое (если ещё не существует на диске), при
# последующих деплоях не трогается (важно: перегенерация на каждом деплое
# рвала бы уже открытые TLS-сессии на рестарте контейнера без необходимости).
#
# Несекретные значения (DATA_VPS_IP, имена/юзеры БД, домен/лог-левел/SMTP-
# хост-порт Vaultwarden) — repo Variables (vars.*), не Actions secrets: видны
# так же, как сам код, просто не маскируются в логах. Настоящие секреты
# (пароли/токены/приватный ключ) — только secrets.*. .env на сервере
# пересобирается с нуля на каждом деплое (ничего не хранится в репозитории).
#
# Без сборки образов (postgres/vaultwarden — публичные образы, не наши).
on:
push:
branches: [main]
workflow_dispatch:
jobs:
deploy:
name: Deploy to Data VPS
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Sync compose file + postgres config + backup script to VPS
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ vars.DATA_VPS_IP }}
username: root
key: ${{ secrets.DATA_SSH_PRIVATE_KEY }}
source: "docker-compose.yml,postgres/pg_hba.conf,postgres/init-backend-db.sh,scripts/backup.sh"
target: "/root/netrunner-data"
strip_components: 0
- name: Write .env and deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ vars.DATA_VPS_IP }}
username: root
key: ${{ secrets.DATA_SSH_PRIVATE_KEY }}
envs: "VW_DB_USER,VW_DB_PASSWORD,VW_DB_NAME,BACKEND_DB_USER,BACKEND_DB_PASSWORD,BACKEND_DB_NAME,VAULTWARDEN_DOMAIN,VAULTWARDEN_SIGNUPS_ALLOWED,VAULTWARDEN_ADMIN_TOKEN,VAULTWARDEN_LOG_LEVEL,SMTP_HOST,SMTP_FROM,SMTP_PORT,SMTP_SECURITY,SMTP_USERNAME,SMTP_PASSWORD"
script: |
set -e
cd /root/netrunner-data
mkdir -p data postgres/certs
# Самоподписанный сертификат Postgres — генерируется один раз,
# последующие деплои его не трогают (см. заголовок workflow).
if [ ! -f postgres/certs/server.crt ]; then
echo "🔑 Генерирую самоподписанный TLS-сертификат для Postgres (первый деплой)..."
openssl req -new -x509 -days 3650 -nodes -subj "/CN=netrunner-db" \
-out postgres/certs/server.crt -keyout postgres/certs/server.key
chmod 600 postgres/certs/server.key
fi
cat > .env <<EOF
VW_DB_USER=${VW_DB_USER}
VW_DB_PASSWORD=${VW_DB_PASSWORD}
VW_DB_NAME=${VW_DB_NAME}
BACKEND_DB_USER=${BACKEND_DB_USER}
BACKEND_DB_PASSWORD=${BACKEND_DB_PASSWORD}
BACKEND_DB_NAME=${BACKEND_DB_NAME}
VAULTWARDEN_DOMAIN=${VAULTWARDEN_DOMAIN}
VAULTWARDEN_SIGNUPS_ALLOWED=${VAULTWARDEN_SIGNUPS_ALLOWED}
VAULTWARDEN_ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
VAULTWARDEN_LOG_LEVEL=${VAULTWARDEN_LOG_LEVEL}
SMTP_HOST=${SMTP_HOST}
SMTP_FROM=${SMTP_FROM}
SMTP_PORT=${SMTP_PORT}
SMTP_SECURITY=${SMTP_SECURITY}
SMTP_USERNAME=${SMTP_USERNAME}
SMTP_PASSWORD=${SMTP_PASSWORD}
EOF
chmod 600 .env
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
echo "✅ netrunner-data synchronized."
echo "⚠️ Не забудьте: firewall (ufw/DOCKER-USER) на этом VPS должен пускать 5432 ТОЛЬКО с IP backend-VPS, и postgres/pg_hba.conf — с заглушки 0.0.0.0/0 на реальный /32, как только backend-VPS арендован."
env:
VW_DB_USER: ${{ vars.DATA_VW_DB_USER }}
VW_DB_PASSWORD: ${{ secrets.DATA_VW_DB_PASSWORD }}
VW_DB_NAME: ${{ vars.DATA_VW_DB_NAME }}
BACKEND_DB_USER: ${{ vars.DATA_BACKEND_DB_USER }}
BACKEND_DB_PASSWORD: ${{ secrets.DATA_BACKEND_DB_PASSWORD }}
BACKEND_DB_NAME: ${{ vars.DATA_BACKEND_DB_NAME }}
VAULTWARDEN_DOMAIN: ${{ vars.VAULTWARDEN_DOMAIN }}
VAULTWARDEN_SIGNUPS_ALLOWED: ${{ vars.VAULTWARDEN_SIGNUPS_ALLOWED }}
VAULTWARDEN_ADMIN_TOKEN: ${{ secrets.VAULTWARDEN_ADMIN_TOKEN }}
VAULTWARDEN_LOG_LEVEL: ${{ vars.VAULTWARDEN_LOG_LEVEL }}
SMTP_HOST: ${{ vars.VAULTWARDEN_SMTP_HOST }}
SMTP_FROM: ${{ vars.VAULTWARDEN_SMTP_FROM }}
SMTP_PORT: ${{ vars.VAULTWARDEN_SMTP_PORT }}
SMTP_SECURITY: ${{ vars.VAULTWARDEN_SMTP_SECURITY }}
SMTP_USERNAME: ${{ vars.VAULTWARDEN_SMTP_USERNAME }}
SMTP_PASSWORD: ${{ secrets.VAULTWARDEN_SMTP_PASSWORD }}