Files
netrunner-backend/.github/workflows/deploy.yml
T
Kirill f06cc48763 security: fix CSRF/ownership/timing vulns; add billing reconciliation
- auth/guard: добавить CSRF-проверку Origin/Referer для cookie-мутаций,
  исправить инвертированную логику admin_guard (пускал всех, блокировал админов),
  перевести admin_guard на from_fn_with_state
- auth/service: timing-safe сравнение HMAC через verify_slice вместо != по hex;
  криптостойкий Seed через Alphanumeric (был цифровой 0-9)
- billing: confirm_payment проверяет owner (caller_id == invoice.user_id);
  активация триала только для Telegram-аккаунтов (Sybil-защита);
  реализована reconcile_pending_payments — сверка blockchain->pending-инвойсы
- billing/providers: get_recent_transactions перенесён в трейт PaymentProvider
- nodes/service: unwrap() -> map_err по всему SSH-пути; убран TcpStream import
- docker: multi-stage build с cargo-chef, non-root user, healthcheck;
  prod-compose добавляет one-shot migrate-сервис, убирает проброс порта БД
- deploy.yml: параметр image_tag, set -e, pull всего стека вместо только app
- users/service: обработка NO_TICKETS / NO_USER из БД вместо catch-all

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 17:58:24 +07:00

45 lines
1.6 KiB
YAML

name: Deploy to VPS (Manual)
# Деплой запускается ТОЛЬКО вручную из вкладки Actions ("Run workflow").
# Образ к этому моменту уже собран и лежит в GHCR (workflow "Build & Push Image").
on:
workflow_dispatch:
inputs:
image_tag:
description: "Тег образа в GHCR для выката"
required: true
default: "latest"
jobs:
deploy:
name: Pull & restart on VPS
runs-on: ubuntu-24.04
steps:
- name: Remote deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.VPS_IP }}
username: root
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: GHCR_TOKEN,IMAGE
script: |
set -e
cd /root/netrunner-core
export IMAGE="ghcr.io/${{ github.repository_owner }}/netrunner-control-plane:${{ github.event.inputs.image_tag }}"
echo "🚀 Deploying ${IMAGE}"
echo "${GHCR_TOKEN}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin
# Тянем свежий образ, прогоняем миграции (one-shot) и поднимаем сервисы.
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d --remove-orphans
# Чистим старые слои.
docker image prune -f
echo "✅ Uplink synchronized."
env:
GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }}
IMAGE: ghcr.io/${{ github.repository_owner }}/netrunner-control-plane:${{ github.event.inputs.image_tag }}