Files
admin/.wiki/entities/vds-kzntsv.md
vitya b1b862b28e docs(wiki): registry.kzntsv.site auth — books-ci user + standalone-htpasswd note
registry.kzntsv.site is registry:2 + htpasswd Basic (binary access, no
per-repo ACL), NOT Gitea-packages. Added books-ci user (pass
vds-kzntsv/registry-books-ci) for books job-scheduler docker-runner pull.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:16:01 +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 | htpasswd Basic: `vitya` / Pryakhin9; `books-ci` (pass `vds-kzntsv/registry-books-ci`, заведён 2026-06-18 для books job-scheduler pull). **Standalone `registry:2`, НЕ Gitea-packages** — auth бинарный (любой юзер = full pull/push/delete), per-repo ACL нет | 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.