Files
netrunner-data/.gitea/workflows/deploy.yml
T
nineap 6e47498dc5
Deploy Observability / Deploy Observability Stack (push) Successful in 36s
Deploy / Deploy to Data VPS (push) Successful in 42s
nginx
2026-07-10 17:06:05 +07:00

109 lines
6.0 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
# postgres:16-alpine работает под UID/GID 70 (не root) — файл,
# созданный openssl от root с правами 600, контейнеру не прочитать
# ("Permission denied" при старте). Владельца нужно менять именно
# на 70:70 (проверено: `docker run --rm postgres:16-alpine id postgres`),
# не 999 — это UID из Debian-образов, у alpine он другой.
chown 70:70 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 }}