Files
admin/.wiki/entities/vds-kzntsv.md
vitya 7e02d61128 docs(wiki): vds-kzntsv disk cleanup 94%→74% + container-log rotation guard
Container json-logs hit 19GiB (owncloud 13GiB, traefik 2.8, gitea 1.9) —
no rotation set on infra (unlike books-vds guard). Truncated logs +
builder prune + apt clean + journal vacuum: ~28GiB freed, 94%→74%
(11→39GiB free). Added /etc/logrotate.d/docker-containers (copytruncate
200M, rotate 3, hourly) + hourly cron. Reduced GC-cron urgency note.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-13 18:44:43 +03:00

13 KiB
Raw Permalink Blame History

title, type, tags, sources, updated
title type tags sources updated
VDS kzntsv — Rusonyx 160 NVMe cloud server entity
hardware
vds
cloud
rusonyx
infrastructure
gitea
verdaccio
registry
postgres
mariadb
mongo
redis
owncloud
ocis
../sources/vds-kzntsv-bootstrap-2026-05-20.md
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), gateway 89.253.192.1. Эта конфигурация прописывается провайдером в /etc/network/interfaces.d/ifcfg-eth0 через их start/ipadd procedure — не редактировать руками. См. quirk #9-10 в rusonyx-vps-onboarding-quirks.
  • Сетевой стек: ifupdown + networking (provider's expected; netplan + systemd-networkd masked после 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 hostnames git/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 + всё что выставляется наружу через 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) 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 + ноль ротации; owncloud oCIS натёк 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.