Prepare production deployment

This commit is contained in:
2026-07-20 04:14:24 +05:00
parent 55583e2101
commit 2e3550a4dc
46 changed files with 1497 additions and 882 deletions
+134
View File
@@ -0,0 +1,134 @@
# Развёртывание Flamy Trade
Документ описывает production-развёртывание сайта `trade.flamy.studio` без ML-runtime и без будущего API. Эти части подключаются отдельно.
## Схема
```text
Internet
-> Router :80/:443
-> edge-proxy VM / Caddy
-> 10.20.0.20:18082
-> flamy_trade_nginx
-> flamy_trade_app:3000
```
На VM публикуется только nginx. Node-приложение доступно только во внутренней Docker-сети.
## Переменные
Скопируйте `.env.example` в `.env` на сервере и проверьте значения:
```bash
PUBLIC_SITE_URL=https://trade.flamy.studio
PUBLIC_SITE_NAME=Flamy Trade
PUBLIC_SITE_DESCRIPTION=Публичная витрина ML-прогнозов для крипторынка.
HOST=0.0.0.0
PORT=3000
ORIGIN=https://trade.flamy.studio
BODY_SIZE_LIMIT=1M
SHUTDOWN_TIMEOUT=15
APP_HOST_IP=10.20.0.20
APP_PUBLISHED_PORT=18082
APP_IMAGE_TAG=<git-sha>
```
Перед фиксацией порта проверьте, что `18082` свободен:
```bash
sudo ss -lntup | grep ':18082'
docker ps --format 'table {{.Names}}\t{{.Ports}}'
```
## Сборка
```bash
pnpm install --frozen-lockfile
pnpm format:check
pnpm lint
pnpm check
pnpm build
pnpm audit
```
`pnpm outdated` должен проверяться вручную. На текущем стеке допустимы только осознанные удержания: `@types/node` на ветке 24 под Node 24 LTS и TypeScript 6.x до обновления peer constraints в SvelteKit/typescript-eslint.
Docker:
```bash
docker compose config
docker compose build --pull
docker compose up -d --wait
docker compose ps
docker compose logs --tail=200
```
## Caddy
Блок для edge-proxy:
```caddyfile
trade.flamy.studio {
encode zstd gzip
reverse_proxy 10.20.0.20:18082 {
header_up Host {host}
header_up X-Real-IP {remote_host}
}
}
```
Перед reload:
```bash
sudo cp -a /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak.$(date +%F_%H%M%S)
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
```
## Smoke-check
С docker-runtime:
```bash
curl -fsS http://10.20.0.20:18082/healthz
curl -I http://10.20.0.20:18082/
```
Снаружи:
```bash
curl -I http://trade.flamy.studio
curl -I https://trade.flamy.studio
curl -fsS https://trade.flamy.studio/healthz
```
Маршруты:
```text
/ 200
/about 200
/blog 200
/blog/osnovy-upravleniya-riskami 200
/dashboard 200
/healthz 200
/favicon.svg 200
/robots.txt 200
/sitemap.xml 200
/nesuschestvuyuschiy-url 404
```
## Rollback
1. Каждый image получает тег git SHA через `APP_IMAGE_TAG`.
2. Предыдущий image не удаляется до успешного smoke-check.
3. Для отката поменяйте `APP_IMAGE_TAG` на предыдущий SHA.
4. Выполните:
```bash
docker compose up -d --no-build
```
Если проблема в маршрутизации, восстановите backup Caddyfile и выполните `sudo systemctl reload caddy`.