Files
admin/.wiki/entities/vds-kzntsv.md
vitya e2338b6fdd wiki(lint): close all 10 lint issues + delete windows-host backup task
- deleted .tasks/windows-host-fallback-backup-daily.md (MSSQL removed on decommission 2026-06-08)
- recovery-architecture-snapshot.md: marked ИСТОРИЧЕСКАЯ ЗАПИСЬ; removed 3 broken [[wiki-links]] (cms-server-port-leak-fix, cms-admin-assets-root-folder-seed, webconfig-password-xml-escape)
- snolla-recovery-vm.md: marked УДАЛЕНА 2026-06-08
- ruvds-iis-host.md: struck 2 resolved risks (imgproxy SPOF, LE renewal); cross-ref winacme
- future-resilient-architecture-goals.md: dead task link → plain text
- mssql-on-vds.md: frontmatter fix; Backup TODO section replaced with implemented block (Express COPY_ONLY, sqlcmd, bind-mount pattern)
- vds-kzntsv.md: added MSSQL row to software stack table
- log.md: update entries for lint + mssql backup implementation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:18:19 +03:00

146 lines
11 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, owncloud, ocis]
sources: [../sources/vds-kzntsv-bootstrap-2026-05-20.md]
updated: 2026-05-21
---
# 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`
- **Subnet / gateway:** **/18** (`netmask 255.255.192.0`), gateway `89.253.192.1`. Эта конфигурация **прописывается провайдером** в `/etc/network/interfaces.d/ifcfg-eth0` через их `start/ipadd` procedure — не редактировать руками. См. quirk #9-10 в [`rusonyx-vps-onboarding-quirks`](../concepts/rusonyx-vps-onboarding-quirks.md).
- **Сетевой стек:** **`ifupdown` + `networking`** (provider's expected; `netplan` + `systemd-networkd` masked после resolution 2026-05-28 incident — см. [`vds-kzntsv-dhcp-outage-2026-05-28`](../concepts/vds-kzntsv-dhcp-outage-2026-05-28.md))
- **Kernel cmdline:** `net.ifnames=0 biosdevname=0` — отсюда `eth0` (не `ens3`/`enp0s3`, эти как altnames в `ip a`)
- **DNS resolvers:** `89.253.252.30`, `89.253.252.31` (Rusonyx)
- **Vendor hostname:** `vps-21075162-534388.host4g.ru`
- **Hypervisor (LLDP-сосед):** `hw80.rusonyx.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)
- **Креды:** `pass show vds-kzntsv/full-env` (root initial pass, sudo pass, portainer admin, DB passwords, registry, portainer API key, traefik dashboard basicauth, ntfy, verdaccio CI). *Историческая заметка: до перехода на pass-store креды лежали в `~/projects/.common/secrets/vds-kzntsv.env` — папка более не существует.*
## 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/` |
| Personal cloud | ownCloud Infinite Scale (oCIS) | 7.1.0 | `/opt/stacks/owncloud/` |
| CMS DB | MSSQL Express 2022 (Linux) | 2022-latest | `/opt/stacks/databases/mssql/` — TCP via traefik :1433 → `mssql.kzntsv.site`. Подробности: [[../concepts/mssql-on-vds]] |
## 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 |
| `owncloud.kzntsv.site` | oCIS (ownCloud Infinite Scale) | admin + vitya (pass `owncloud/*`); basic auth enabled для WebDAV/LibreGraph | Personal cloud, replace мёртвой Synology ownCloud (см. [`ocis-on-vds-deploy-recipe`](../concepts/ocis-on-vds-deploy-recipe.md)) |
| `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)
└── owncloud/
├── data/ (decomposedfs: idm/, idp/, nats/, search/, storage/{metadata,users}/spaces/...)
├── config/ (ocis.yaml generated by `ocis init`)
├── .env (chmod 600 — OCIS_ADMIN_PASSWORD)
└── docker-compose.yml (oCIS 7.1.0 + traefik labels — recipe: [`ocis-on-vds-deploy-recipe`](../concepts/ocis-on-vds-deploy-recipe.md))
```
## Что входит в 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) (тот мёртв).
## Known issues
- **2026-05-28 network-stack mismatch (~2.5 ч outage + ~5.5 ч на статике до resolution):** наш netplan+networkd конфликтовал с provider's expected ifupdown stack, поэтому когда DHCP-binding кратко потерялся на стороне хостера — auto-recovery (их `start/ipadd`) не сработала. Resolution: mask netplan/networkd + reboot + provider reset config. Подробности + runbook + lessons-learned: [`vds-kzntsv-dhcp-outage-2026-05-28`](../concepts/vds-kzntsv-dhcp-outage-2026-05-28.md). **Не использовать netplan на этом VDS** (anti-pattern).
## 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)). **Срочность поднята после 2026-05-28** — дисковая нагрузка дошла до 89%, ручной GC (build cache + image prune + log truncate) дал 79%; registry GC отложен.
- ntfy push — TODO ([`vds-ntfy-push`](../../.tasks/vds-ntfy-push.md)).
- `iputils-ping` не установлен на host — `apt install iputils-ping` при следующем maintenance, иначе пользоваться `curl` для проверки сети.
- Hermes — defer, ждёт уточнения user.