krona-front/docs/handoff/control-center/DEPLOYMENT-DEMO.md

5.7 KiB
Raw Blame History

Руководство по развёртыванию Krona Control Center на VPS

1. Целевая инфраструктура и топология

Параметр Значение Описание
Домен https://kccdemo.ochenstarik.ru Публичный защищённый домен демонстрационного стенда
IP-адрес VPS 178.212.13.102 Целевой сервер развёртывания
Системный пользователь kcc Изолированный непривилегированный Linux-пользователь
Директория релизов /srv/kccdemo/releases/<TIMESTAMP> Версионированные каталоги сборок
Символическая ссылка /srv/kccdemo/current Указывает на активный релиз (atomic switch)
Логи Nginx /var/log/nginx/kccdemo_access.log Доступ и аудит веб-сервера

2. Статус внешнего подключения и диагностика доступа (Pre-flight Blocker)

В ходе подготовки развёртывания была выполнена сетевая диагностика хоста 178.212.13.102:

  1. Сетевая доступность (Ping & Port 22):
    • Хост 178.212.13.102 доступен, порт 22 (OpenSSH) открыт и принимает TCP-соединения.
  2. Аутентификация по SSH:
    • Попытка подключения: ssh -i ~/.ssh/id_rsa kcc@178.212.13.102
    • Ответ сервера: Permission denied (publickey).
  3. Причина блокировки:
    • Сервер VPS настроен на строгую аутентификацию исключительно по SSH-ключам (PasswordAuthentication no).
    • Публичный ключ агента/рабочей станции не добавлен в файл /home/kcc/.ssh/authorized_keys на удаленном сервере.
  4. Решение для администратора / владельца платформы:
    • Вариант А: Добавить публичный ключ локальной машины в /home/kcc/.ssh/authorized_keys на VPS 178.212.13.102.
    • Вариант Б: Скопировать подготовленный каталог deploy/kcc/ и директорию dist/ на сервер через локальный доступ администратора и запустить /srv/kccdemo/deploy-kcc.sh.

3. Автоматизированный скрипт развёртывания (deploy/kcc/deploy-kcc.sh)

Скрипт обеспечивает атомарный деплой с нулевым временем простоя:

#!/usr/bin/env bash
set -euo pipefail

APP_DIR="/srv/kccdemo"
RELEASES_DIR="$APP_DIR/releases"
CURRENT_LINK="$APP_DIR/current"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
NEW_RELEASE_DIR="$RELEASES_DIR/$TIMESTAMP"

echo "=== [KCC Deploy] Starting atomic release $TIMESTAMP ==="

mkdir -p "$NEW_RELEASE_DIR"
cp -r ./dist/* "$NEW_RELEASE_DIR/"

# Atomic switch
ln -sfn "$NEW_RELEASE_DIR" "$CURRENT_LINK"

# Keep last 3 releases
echo "=== [KCC Deploy] Pruning older releases (retaining last 3) ==="
cd "$RELEASES_DIR"
ls -1dt 20* | tail -n +4 | xargs -r rm -rf

echo "=== [KCC Deploy] Verifying local health ==="
curl -sk https://127.0.0.1/control/gate -H "Host: kccdemo.ochenstarik.ru" | grep -q "Krona Control Center" && echo "Health check: PASSED"

echo "=== [KCC Deploy] Release $TIMESTAMP successfully active! ==="

4. Конфигурация Nginx (deploy/kcc/nginx-kccdemo.conf)

Конфигурация включает заголовки безопасности, поддержку SPA маршрутизации и SSL:

server {
    listen 80;
    server_name kccdemo.ochenstarik.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name kccdemo.ochenstarik.ru;

    ssl_certificate /etc/letsencrypt/live/kccdemo.ochenstarik.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kccdemo.ochenstarik.ru/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /srv/kccdemo/current;
    index index.html;

    # Security Headers
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Gzip Compression
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

    # Static Assets Caching
    location /assets/ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # SPA Routing Fallback
    location / {
        try_files $uri $uri/ /index.html;
    }

    access_log /var/log/nginx/kccdemo_access.log;
    error_log /var/log/nginx/kccdemo_error.log;
}

5. Процедура мгновенного отката (Instant Rollback)

В случае необходимости немедленного отката к предыдущей стабильной версии:

cd /srv/kccdemo
PREVIOUS_RELEASE=$(ls -1dt releases/20* | sed -n '2p')
if [ -n "$PREVIOUS_RELEASE" ]; then
    echo "Rolling back to: $PREVIOUS_RELEASE"
    ln -sfn "/srv/kccdemo/$PREVIOUS_RELEASE" /srv/kccdemo/current
    systemctl reload nginx
    echo "Rollback completed."
else
    echo "No previous release found to rollback."
fi