Files
admin/.wiki/entities/vds-kzntsv.md
vitya d25c0577c8 import: .wiki/entities/ from MoreThenCms via subtree-split
git-subtree-dir: .wiki/entities
git-subtree-mainline: 6d8d75474d
git-subtree-split: 24661c10fb
2026-05-21 13:46:38 +03:00

128 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.