deploy(labtools): staging on vds-kzntsv GREEN — image 43e28ba, parity vs prod
- build registry.kzntsv.site/labtools:43e28ba on VDS from clean git-archive (no config/default.json), push from VDS (registry local) - Portainer stack `labtools` (Id 17) on labtools.vds.kzntsv.site, container healthy (MSSQL mssql.kzntsv.site + MinIO minio.kzntsv.site), 8 secret-env in stack-env (not in image/git) - smoke parity vs www.labtools.ru GREEN: menu pages 200/200, redirects (.php / trailing-slash / lowercase) 301 1:1, theme.css + /assets byte-identical from MinIO, Cache-Control max-age=86400 - add runbook .wiki/concepts/labtools-vds-deploy-runbook.md + stack source host-stacks/vds-kzntsv/labtools.compose.yml - cutover DNS gated to operator (tomorrow 2026-07-02); RUVDS IIS 80.64.31.36 prod untouched = rollback path Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
70
.wiki/concepts/labtools-vds-deploy-runbook.md
Normal file
70
.wiki/concepts/labtools-vds-deploy-runbook.md
Normal file
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: labtools.ru snolla-app — VDS deploy runbook (stack / traefik / env / cutover / rollback)
|
||||
type: concept
|
||||
tags: [labtools, snolla, vds, deploy, docker, portainer, traefik, runbook, migration]
|
||||
related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]]
|
||||
updated: 2026-07-01
|
||||
---
|
||||
|
||||
# labtools.ru → VDS deploy runbook
|
||||
|
||||
Вынос `labtools.ru` (snolla-приложение, `@snollajs/snolla`, server-side Liquid) с [[../entities/ruvds-iis-host]]
|
||||
(catch-all CMS) в отдельный docker-контейнер на [[../entities/vds-kzntsv]] (89.253.255.94), за traefik.
|
||||
Модель — snolla-app (НЕ pilonuxt/Nuxt-contentApi): читает БД-контент MoreThenCms (`mssql.kzntsv.site`)
|
||||
+ ассеты из MinIO (`minio.kzntsv.site`) через imgproxy.
|
||||
|
||||
## Артефакты
|
||||
- **Код:** `victor/labtools.ru` @ `43e28ba` (apps/web, parity ре-ревью №2 PASS). `deploy/Dockerfile` (multi-stage node:22-slim).
|
||||
- **Образ:** `registry.kzntsv.site/labtools:43e28ba` (+`:latest`). Собран НА VDS (обход traefik-499), 114 MB content.
|
||||
- **Стек Portainer:** `labtools` (Id 17, endpoint 1). Source-of-truth compose: `admin/host-stacks/vds-kzntsv/labtools.compose.yml`.
|
||||
|
||||
## Сборка образа (на VDS)
|
||||
```bash
|
||||
# чистый git-archive (только tracked → без config/default.json и node_modules) на VDS
|
||||
git -C ~/projects/labtools.ru archive --format=tar 43e28ba \
|
||||
| ssh vitya@89.253.255.94 'rm -rf ~/build/labtools && mkdir -p ~/build/labtools && tar -x -C ~/build/labtools'
|
||||
# build с build-arg VERDACCIO_TOKEN (pass vds-kzntsv/full-env VERDACCIO_CI_TOKEN), push из VDS
|
||||
ssh vitya@89.253.255.94 'cd ~/build/labtools && docker build -f deploy/Dockerfile \
|
||||
--build-arg VERDACCIO_TOKEN=<token> -t registry.kzntsv.site/labtools:43e28ba -t registry.kzntsv.site/labtools:latest . \
|
||||
&& docker push registry.kzntsv.site/labtools:43e28ba && docker push registry.kzntsv.site/labtools:latest'
|
||||
```
|
||||
- VERDACCIO_TOKEN — build-time only (discarded build-стейдж; в финальный образ не попадает; docker linter warn-only).
|
||||
- `config/default.json` (dev-секреты) исключён `.dockerignore` — в образе только `production.json` + `custom-environment-variables.json`.
|
||||
|
||||
## Runtime env-контракт (8 секретов — Portainer stack-env, НЕ в образ/git)
|
||||
Маппинг env→config: `apps/web/config/custom-environment-variables.json`. Non-secret (host/siteId/endpoints) — в `production.json`.
|
||||
|
||||
| ENV | Значение | Источник |
|
||||
|---|---|---|
|
||||
| `DB_USER` | `snolla` | web.config боя MoreThenCmsEntities |
|
||||
| `DB_PASSWORD` | ⟨секрет⟩ | web.config боя MoreThenCmsEntities (User Id=snolla) |
|
||||
| `IMGPROXY_KEY` | ⟨128hex⟩ | `pass minio-vds/full-env` (== сервер imgproxy books-vds — HMAC должен совпадать) |
|
||||
| `IMGPROXY_SALT` | ⟨128hex⟩ | `pass minio-vds/full-env` |
|
||||
| `S3_ACCESS_KEY_ID` | ⟨секрет⟩ | `pass minio-vds/full-env` (MINIO_ROOT_USER) |
|
||||
| `S3_SECRET_ACCESS_KEY` | ⟨секрет⟩ | `pass minio-vds/full-env` (MINIO_ROOT_PASSWORD) |
|
||||
| `SMTP_USER` | `noreply@snolla.com` | `pass snolla-smtp/full-env` |
|
||||
| `SMTP_PASSWORD` | ⟨секрет⟩ | `pass snolla-smtp/full-env` (SMTP_PASS; default.json имел dev-значение — НЕ брать оттуда) |
|
||||
|
||||
PORT — не переопределять (образ дефолтит 5000; EXPOSE 5000; healthcheck `/robots.txt` на $PORT). traefik service-port = 5000.
|
||||
|
||||
## Runtime egress (наружу из proxy-сети)
|
||||
`mssql.kzntsv.site:1433` (БД-контент, обязателен) · `minio.kzntsv.site:443` (ассеты) · `imgproxy.kzntsv.site:443` · `smtp.yandex.ru:465` (формы).
|
||||
|
||||
## Staging smoke (2026-07-01, GREEN) — `labtools.vds.kzntsv.site` vs бой `www.labtools.ru`
|
||||
- Все страницы меню (home/about/clients/contacts/cookie/privacy/6×products) — 200/200, дельта размера стабильна (длина хоста в canonical/og).
|
||||
- Редиректы: `.php`→301→`/`, `/about/`→301 (trailing-slash), `/Products/Press-Forms`→301→lowercase — 1:1 с боем.
|
||||
- `theme.css` из MinIO — **байт-в-байт** (12248), `Cache-Control: max-age=86400, public, must-revalidate`.
|
||||
- `/assets/<ownerId>/*.webp` из MinIO — **байт-в-байт** с боем (44444, 24354); content-type `application/octet-stream` — как на бою.
|
||||
- Контейнер healthy (MSSQL+S3 подключены).
|
||||
|
||||
## Cutover (live DNS) — GATED, действие ОПЕРАТОРА
|
||||
Бой на [[../entities/ruvds-iis-host]] (`80.64.31.36`) **остаётся живым** до подтверждения. Порядок:
|
||||
1. **(ops)** В стеке `labtools` добавить в traefik-rule: `Host(\`labtools.ru\`) || Host(\`www.labtools.ru\`)` (LE HTTP-01 выпустит cert на первый хит после DNS-flip).
|
||||
2. **(оператор)** reg.ru: A-записи `labtools.ru` + `www.labtools.ru` → `89.253.255.94` (с RUVDS `80.64.31.36`). Понизить TTL заранее.
|
||||
3. Проверить LE cert выпущен + smoke на боевом хосте.
|
||||
4. `labtools.pro` — открытый вопрос (бой IIS обслуживал и его; scope таски = labtools.ru). Решить отдельно.
|
||||
|
||||
## Rollback
|
||||
- **DNS:** вернуть A-записи `labtools.ru`/`www` → `80.64.31.36` (RUVDS IIS живой, нетронут). Откат = смена DNS.
|
||||
- **Стек:** Portainer → stack `labtools` → remove (или откат тега образа). Образ в registry остаётся.
|
||||
- RUVDS IIS labtools **не выводить из эксплуатации** до явного решения оператора (директива 2026-07-01).
|
||||
Reference in New Issue
Block a user