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>
147 lines
13 KiB
Markdown
147 lines
13 KiB
Markdown
---
|
||
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). **Standalone `registry:2`, НЕ Gitea-packages** — модель auth + добавление юзеров + GC: [`registry-kzntsv-auth-model`](../concepts/registry-kzntsv-auth-model.md) | 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).
|
||
- **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`](../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-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`](../../.tasks/vds-ntfy-push.md)).
|
||
- `iputils-ping` не установлен на host — `apt install iputils-ping` при следующем maintenance, иначе пользоваться `curl` для проверки сети.
|
||
- Hermes — defer, ждёт уточнения user.
|