diff --git a/kreknin-synology.md b/kreknin-synology.md index a4fdc30..4c32406 100644 --- a/kreknin-synology.md +++ b/kreknin-synology.md @@ -45,3 +45,15 @@ updated: 2026-05-19 - Эта синка остаётся как backup target, на ней нет SMR-дисков (тип неизвестен на момент сессии, но кратко проверить через `ls /dev/sd*` + smartctl до тяжёлой нагрузки). - Будущая [[future-resilient-architecture-goals]]: добавить второй backup target (или облачный — Backblaze B2 / S3 Glacier), чтобы не зависеть от одной коробки. + +## Роль источника для миграции на VDS (2026-05-20) + +В сессии [`vds-kzntsv-bootstrap-2026-05-20`](../sources/vds-kzntsv-bootstrap-2026-05-20.md) kreknin сыграл вторую роль — **источник данных** для миграции инфра-сервисов на [`vds-kzntsv`](vds-kzntsv.md). Из restored backup'а ([Hyper Backup](../concepts/hyper-backup-structure-and-recovery.md) `.hbk` мёртвой синки): + +- **Gitea** — `tar c -C /volume1/docker/gitea data postgres docker-compose.yml | ssh vds tar x` (sudo `Pryakhin9` для read postgres datadir uid 999). 2.7G total за 8 мин. +- **Verdaccio** — `rsync /volume1/docker/personal/verdaccio/{storage,config,plugins} → vds:/opt/stacks/verdaccio/`. 9G за 18 мин. +- **Registry** — GC на kreknin (`registry:2.8.3 garbage-collect -m`) сжал 99G → 35G; затем user принял решение **abandon миграцию** и fresh install на VDS. Старый registry data остаётся на kreknin как backup-reference. + +## Roadmap как backup target для VDS + +Планируется ежедневный pull rsync VDS → kreknin в `/volume1/NetBackup/vds-kzntsv/` (см. follow-up task `.tasks/vds-backup-rsync-kreknin.md`). Дополнительный pipe — backup pipe для production-CMS [`windows-recovery-host`](windows-recovery-host.md) → тут же на kreknin — пока не реализован. diff --git a/vds-kzntsv.md b/vds-kzntsv.md new file mode 100644 index 0000000..bc04e71 --- /dev/null +++ b/vds-kzntsv.md @@ -0,0 +1,127 @@ +--- +title: VDS kzntsv — Rusonyx 160 NVMe cloud server +type: entity +tags: [hardware, vds, cloud, rusonyx, infrastructure, gitea, verdaccio, registry, postgres, mariadb, mongo, redis] +sources: [../sources/vds-kzntsv-bootstrap-2026-05-20.md] +updated: 2026-05-20 +--- + +# VDS kzntsv + +Облачный VDS у Rusonyx, активирован 2026-05-20. Цель — вынести инфраструктурные сервисы (gitea / verdaccio / docker-registry / shared DBs / в будущем seafile, hermes, ntfy) с одной железной коробки на отдельный host. Это первый шаг по closing SPOF gap из [`future-resilient-architecture-goals`](../concepts/future-resilient-architecture-goals.md). + +Production CMS (MoreThenCms) **остаётся на** [`windows-recovery-host`](windows-recovery-host.md) и обсуждается отдельно. + +## Hardware / tariff + +- **Vendor:** Rusonyx (Astra Облако), https://myvm.rusonyx.ru +- **Tariff:** 160 NVMe (заказан 2026-05-19, активирован 2026-05-20) +- **vCPU:** 6 × 2.6 GHz +- **RAM:** 8 GiB +- **Disk:** 160 GiB NVMe +- **OS:** Ubuntu 24.04 LTS (Noble) +- **IPv4:** 1 шт (free) +- **Backup от Rusonyx:** 0 (свой backup pipeline через `[[vds-backup-rsync-kreknin]]`) + +## Доступ + +- **Public IP:** `89.253.255.94` +- **Vendor hostname:** `vps-21075162-534388.host4g.ru` +- **DNS:** `vds.kzntsv.site` (A → 89.253.255.94) + wildcard `*.vds.kzntsv.site` + service hostnames `git/registry/verdaccio.kzntsv.site` (REGRU) +- **VNC console:** через Rusonyx панель (кнопка «Остановить VNC» в Управление сервером → Консоль может потребоваться при stale attachment — см. [`rusonyx-vps-onboarding-quirks`](../concepts/rusonyx-vps-onboarding-quirks.md)) +- **SSH:** `ssh -i ~/.ssh/id_ed25519 vitya@89.253.255.94` (root login + password auth disabled пост-bootstrap; sudo NOPASSWD для vitya) +- **Креды:** `~/projects/.common/secrets/vds-kzntsv.env` (root initial pass, sudo pass, portainer admin, DB passwords, registry, portainer API key, traefik dashboard basicauth) + +## Software stack + +| Слой | Компонент | Версия | Где | +|---|---|---|---| +| OS | Ubuntu | 24.04.4 LTS | host | +| Kernel | Linux | 6.8.0-117-generic | host | +| Firewall | ufw | active | host (allow 22, 80, 443, 5432, 3306, 27017, 6379) | +| Brute-protect | fail2ban | active (sshd jail) | host | +| Engine | Docker CE | 29.5.1 | host (official APT repo) | +| Compose | docker-compose-plugin | v5.1.3 | host | +| Reverse proxy | Traefik | v2.11 LTS | `/opt/stacks/traefik/` | +| Container mgmt | Portainer CE | 2.21.5 | `/opt/stacks/portainer/` | +| Postgres | postgres | 16 (Debian) | `/opt/stacks/databases/postgres/` | +| MariaDB | mariadb | 11.4 | `/opt/stacks/databases/mariadb/` | +| MongoDB | mongo | 7.0 | `/opt/stacks/databases/mongo/` | +| Redis | redis | 7.4-alpine | `/opt/stacks/databases/redis/` | +| Git | gitea | 1.25.5 | `/opt/stacks/gitea/` | +| NPM | verdaccio | 6 | `/opt/stacks/verdaccio/` | +| Docker registry | registry | 2.8.3 + joxit UI | `/opt/stacks/registry/` | + +## Docker networks (external) + +- `proxy` — traefik + всё что выставляется наружу через HTTPS +- `shared-dbs` — DB-park + любой контейнер, который к DBs ходит по DNS-имени `postgres` / `mariadb` / `mongo` / `redis` + +## Hostnames (live, 2026-05-20) + +| Hostname | Service | Auth | Назначение | +|---|---|---|---| +| `portainer.vds.kzntsv.site` | Portainer | vitya / `Pryakhin9-VDS-2026` (18 chars, см. [`portainer-2.21-admin-password-regression`](../concepts/portainer-2.21-admin-password-regression.md)) | Container management | +| `traefik.vds.kzntsv.site` | Traefik dashboard | basicAuth vitya / Pryakhin9 | Traefik runtime view | +| `git.kzntsv.site` | Gitea | kreknin users restored | Git hosting | +| `verdaccio.kzntsv.site` | Verdaccio | kreknin htpasswd (vitya) | Private npm | +| `registry.kzntsv.site` | Docker Registry | vitya / Pryakhin9 (htpasswd) | Docker images | +| `registry-ui.vds.kzntsv.site` | Joxit Registry UI | (proxied к registry, та же auth) | GUI cleanup | +| `postgres.vds.kzntsv.site:5432` | Postgres TLS | postgres / hex32 | Shared DB | +| `mariadb.vds.kzntsv.site:3306` | MariaDB TLS | root / hex32 | Shared DB | +| `mongo.vds.kzntsv.site:27017` | MongoDB TLS | root / hex32 | Shared DB | +| `redis.vds.kzntsv.site:6379` | Redis TLS | hex32 (requirepass) | Shared cache | + +DB TLS: self-signed certs (CN matches hostname), клиент с `verify-none` / `tlsAllowInvalidCertificates`. Pattern см. [`db-tls-self-signed-via-traefik-raw-tcp`](../concepts/db-tls-self-signed-via-traefik-raw-tcp.md). + +## File layout + +``` +/opt/stacks/ +├── traefik/ +│ ├── data/ +│ │ ├── traefik.yml (static config) +│ │ └── dynamic/ +│ │ └── middlewares.yml (basicAuth для dashboard) +│ ├── letsencrypt/ +│ │ └── acme.json (LE certs, 0600) +│ └── docker-compose.yml +├── portainer/ +│ ├── data/ (portainer.db, chisel keys) +│ └── docker-compose.yml (note: run via `docker run`, не compose, чтобы bypass'нуть env-interp на --admin-password) +├── databases/ +│ ├── postgres/{data,certs,docker-compose.yml} +│ ├── mariadb/{data,certs,docker-compose.yml} +│ ├── mongo/{data,certs,docker-compose.yml} +│ └── redis/{data,certs,docker-compose.yml} +├── gitea/ +│ ├── data/{git,gitea,ssh} (mount → /data в контейнере) +│ └── docker-compose.yml +├── verdaccio/ +│ ├── storage/ (npm packages, 8.6 GB, 2063 packages) +│ ├── config/{config.yaml,htpasswd} +│ ├── plugins/ +│ └── docker-compose.yml +└── registry/ + ├── docker/ (registry blobs storage) + ├── auth/htpasswd + └── docker-compose.yml (registry + registry-ui в одном compose) +``` + +## Что входит в backup pipeline (planned) + +См. [`vds-backup-rsync-kreknin`](../../.tasks/vds-backup-rsync-kreknin.md): daily 05:00 MSK rsync → `kreknin.site:/volume1/NetBackup/vds-kzntsv/` с `--link-dest` incremental. DB dumps первым шагом (`pg_dumpall` / `mariadb-dump` / `mongodump` / `redis-cli --rdb`), потом rsync `/opt/stacks/`. Email-нотификация на `vitya.kuznetsov@gmail.com` через SMTP smtp.yandex.ru:465 (noreply@snolla.com / pass в `noreply-snolla-smtp.env`), плюс [`vds-ntfy-push`](../../.tasks/vds-ntfy-push.md) на Android. + +## Связь с другими сущностями + +- Источник данных для миграции gitea/verdaccio — restored backup на [`kreknin-synology`](kreknin-synology.md) (через tar+ssh-pipe и rsync). Registry — fresh install без миграции старых images (user accepted loss). +- Заменяет старый CMS-инфра-host [`windows-recovery-host`](windows-recovery-host.md) **только для инфраструктурных сервисов** (gitea/verdaccio/registry/DBs); production CMS остаётся на recovery-host. +- Не зависит от [`dead-synology-diskstation`](dead-synology-diskstation.md) (тот мёртв). + +## Open issues / TODO + +- DB TLS = self-signed → нужен LE-cert sidecar (lego watch acme.json → extract PEM → reload DBs). Сейчас клиенты обходятся `verify-none`. [`db-tls-self-signed-via-traefik-raw-tcp`](../concepts/db-tls-self-signed-via-traefik-raw-tcp.md). +- Backup pipeline — TODO ([`vds-backup-rsync-kreknin`](../../.tasks/vds-backup-rsync-kreknin.md)). +- GC cron для verdaccio + registry — TODO ([`vds-gc-cron`](../../.tasks/vds-gc-cron.md)). +- ntfy push — TODO ([`vds-ntfy-push`](../../.tasks/vds-ntfy-push.md)). +- Hermes — defer, ждёт уточнения user.