14 KiB
title, type, tags, sources, updated
| title | type | tags | sources | updated | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VDS kzntsv — Rusonyx 160 NVMe cloud server | entity |
|
|
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.
Production CMS (MoreThenCms) остаётся на windows-recovery-host и обсуждается отдельно.
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), gateway89.253.192.1. Эта конфигурация прописывается провайдером в/etc/network/interfaces.d/ifcfg-eth0через ихstart/ipaddprocedure — не редактировать руками. См. quirk #9-10 вrusonyx-vps-onboarding-quirks. - Сетевой стек:
ifupdown+networking(provider's expected;netplan+systemd-networkdmasked после resolution 2026-05-28 incident — см.vds-kzntsv-dhcp-outage-2026-05-28) - 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 hostnamesgit/registry/verdaccio.kzntsv.site(REGRU) - VNC console: через Rusonyx панель (кнопка «Остановить VNC» в Управление сервером → Консоль может потребоваться при stale attachment — см.
rusonyx-vps-onboarding-quirks) - 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 + всё что выставляется наружу через HTTPSshared-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) |
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). Standalone registry:2, НЕ Gitea-packages — модель auth + добавление юзеров + GC: registry-kzntsv-auth-model |
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) |
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.
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: 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 на Android.
Связь с другими сущностями
- Источник данных для миграции gitea/verdaccio — restored backup на
kreknin-synology(через tar+ssh-pipe и rsync). Registry — fresh install без миграции старых images (user accepted loss). - Заменяет старый CMS-инфра-host
windows-recovery-hostтолько для инфраструктурных сервисов (gitea/verdaccio/registry/DBs); production CMS остаётся на recovery-host. - Не зависит от
dead-synology-diskstation(тот мёртв).
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. Не использовать netplan на этом VDS (anti-pattern). - 2026-07-13 disk cleanup + container-log rotation guard: диск поднялся до 94 % (11 GiB free) — та же болезнь что на ../entities/books-vds 2026-06-04, но guard на infra НЕ стоял. Корень — docker daemon
json-fileбезmax-size+ ноль ротации;owncloudoCIS натёк 13 GiB json-лога (остальное: traefik 2.8 GiB, gitea 1.9 GiB;/var/lib/docker/containers= 19 GiB). Ручная чистка: truncate логов (19 GiB → 1.2 MiB),docker builder prune(-5.5 GiB),apt-get clean(-1.2 GiB),journalctl --vacuum-size=50M(-0.4 GiB),docker image prune -a(-0.35 GiB — старые snolla-теги делят base-слои с running, уникальных мало). Итого ~28 GiB освобождено → 94 % → 74 % (39 GiB free). Durable guard:/etc/logrotate.d/docker-containers(copytruncate, size 200M, rotate 3, compress, hourly) + hourly cron/etc/cron.d/docker-logrotate(минута 7). Альтернатива на уровне daemon (log-opts: max-size=50m, max-file=3в/etc/docker/daemon.json) не применена — потребует рестарта dockerd = рестарт всех 30 контейнеров; logrotate copytruncate выбран как non-disruptive.
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. - Backup pipeline — TODO (
vds-backup-rsync-kreknin). - GC cron для verdaccio + registry — TODO (
vds-gc-cron). Срочность снижена после 2026-07-13 cleanup (94 % → 74 %, 39 GiB free); container-log rotation — DONE (см. Known issues ↑). Registry + verdaccio GC cron — отдельный TODO, не связан с логами. - ntfy push — TODO (
vds-ntfy-push). iputils-pingне установлен на host —apt install iputils-pingпри следующем maintenance, иначе пользоватьсяcurlдля проверки сети.- Hermes — defer, ждёт уточнения user.
SSH-доступ (2026-08-25, критично!)
ssh -i ~/.ssh/id_ed25519 vitya@89.253.255.94 — штатный вход (НЕ root!). sudo NOPASSWD для vitya.
- root login + password auth disabled пост-bootstrap (00-hardening.conf: PermitRootLogin no / PasswordAuthentication no)
- Источник: session:462. Всегда пробовать vitya+id_ed25519 ПЕРВЫМ, root — только через sudo vitya.
- root-пароль:
pass vds-kzntsv/root-pass-2026-08-25(сменён Rusonyx 25.08, НЕ VDS_ROOT_PASS_INITIAL — неактуален) - Ключ id_ed25519 дополнительно в /root/.ssh/authorized_keys (установлен 25.08 через docker)
- Portainer:
portainer.vds.kzntsv.site+ PORTAINER_API_KEY (pass vds-kzntsv/full-env) — полный docker-доступ, fallback без SSH - Диагностика/восстановление через docker (Portainer): privileged-контейнеры с bind-mount/PidMode host (проверено 25.08)