VPS Hostkey (vm-mini) — 46.17.99.183¶
Внешняя точка присутствия в интернете. Обслуживает четыре публичных домена, Vaultwarden и AmneziaWG-сервер для обхода блокировок.
Провайдер: Hostkey
Локация: Netherlands (NL)
Хостнейм: vm-mini
Публичный IP: 46.17.99.183 (статический, IPv4)
Актуально на: август 2026
Железо и ОС¶
| Параметр | Значение |
|---|---|
| OS | Ubuntu 24.04.4 LTS |
| Ядро | 6.8.0-136-generic |
| RAM | 5 902 MB (~6 GB) |
| Диск | 118 GB (LVM /dev/mapper/hk-root), занято ~6 GB (6%) |
| Своп | (уточнить: swapon --show) |
Дисковая метка hk-root — Hostkey использует LVM с префиксом hk- для volume groups.
Роль в общей инфраструктуре¶
VPS — единственная публичная точка входа для четырёх доменов:
alatyr-service.ru— основной сайт (Node.js бэкенд)www.alatyr-service.ru— алиас основного (в том же nginx-конфиге)vault.alatyr-service.ru— Vaultwarden (self-hosted менеджер паролей)alatyr-taverna.ru— статический сайт (fantasy tavern MVP)
Домен rag.alatyr-service.ru не через VPS — он смотрит на домашний IP (см. 00_INDEX.md).
VPS также работает выходной точкой для VPN: - AmneziaWG сервер (порт 8443/udp) — через него ragserver ходит в OpenRouter, обходя блокировки РФ
Установленные сервисы¶
Как systemd (нативно)¶
| Сервис | Порт | Что делает |
|---|---|---|
nginx |
80, 443, 8443/tcp | HTTP/HTTPS реверс-прокси + статика |
sshd |
22 | SSH-доступ (root разрешён) |
fail2ban |
— | Блокировка bruteforce на SSH/nginx |
certbot.timer |
— | Автообновление Let's Encrypt |
systemd-resolved |
53 (loopback) | Локальный DNS-резолвер |
| Node.js процесс | 127.0.0.1:5000 | Alatyr Service Platform (Express) |
Как Docker-контейнеры¶
| Контейнер | Образ | Порт хоста |
|---|---|---|
vaultwarden |
vaultwarden/server:latest |
127.0.0.1:8222 → 80/tcp |
amnezia-awg2 |
amnezia-awg2 |
0.0.0.0:8443/udp → 8443/udp |
Публичные порты (наружу в интернет)¶
| Порт | Протокол | Сервис | Комментарий |
|---|---|---|---|
| 22 | tcp | SSH | Стандартный, защищён fail2ban |
| 80 | tcp | nginx | Редирект на HTTPS |
| 443 | tcp | nginx | Основной HTTPS |
| 8443 | tcp | nginx (vault на альтернативном порту) | Vaultwarden доп. вход |
| 8443 | udp | AmneziaWG (docker amnezia-awg2) |
Активно для OpenRouter |
Loopback-порты (127.0.0.1, только внутри VPS)¶
| Порт | Сервис | Комментарий |
|---|---|---|
127.0.0.1:5000 |
Node.js | Alatyr Service Platform, проксируется nginx для alatyr-service.ru |
127.0.0.1:8222 |
docker-proxy → vaultwarden | Vaultwarden, проксируется nginx для vault.alatyr-service.ru |
127.0.0.53:53 |
systemd-resolved | DNS-резолвер |
127.0.0.54:53 |
systemd-resolved | DNS-резолвер (второй интерфейс) |
Сеть и DNS-резолвер¶
Основной интерфейс ens1 получает IPv4/IPv6 и маршруты по DHCP через
systemd-networkd. Постоянные DNS-серверы закреплены отдельным netplan
override:
Файл имеет права 600 root:root. Базовые конфиги 01-netcfg.yaml и
50-cloud-init.yaml оставлены без изменения содержимого; поздний файл
99-custom-dns.yaml дополняет объединённую конфигурацию и не зависит от
перегенерации 50-cloud-init.yaml.
Проверка:
sudo netplan generate
sudo netplan get
resolvectl status ens1
getent ahostsv4 storage-api.alatyr-service.ru
25.08.2026 после netplan try подтверждено: сгенерированный
/run/systemd/network/10-netplan-ens1.network содержит DNS=1.1.1.1,
DNS=77.88.8.8 и UseDNS=false; storage-api.alatyr-service.ru разрешается в
176.99.153.164, HTTPS health-check возвращает 200.
Nginx: сайты¶
Все конфиги в /etc/nginx/sites-enabled/ (симлинки на sites-available/).
alatyr-service (файл, симлинк)¶
В файле несколько server-блоков — найдены три директивы server_name:
1. alatyr-service.ru www.alatyr-service.ru (основной, с proxy_pass)
2. www.alatyr-service.ru (вероятно редирект www→apex)
3. alatyr-service.ru (вероятно HTTP→80 блок для перенаправления на HTTPS)
Точная структура — посмотреть: cat /etc/nginx/sites-enabled/alatyr-service
Сертификат: /etc/letsencrypt/live/alatyr-service.ru/ (SAN на alatyr-service.ru и www.alatyr-service.ru)
vault.alatyr-service.ru¶
listen 443 ssl;
listen 8443 ssl; ← дополнительный порт
server_name vault.alatyr-service.ru;
proxy_pass http://127.0.0.1:8222; ← docker-контейнер vaultwarden
Сертификат: /etc/letsencrypt/live/vault.alatyr-service.ru/
Двойной вход: доступен и на :443, и на :8443. Причина — уточнить у владельца (вероятно для обхода корпоративных фаерволов или исторически).
⚠️ Коллизия по порту 8443: -
nginx tcp/8443— vault (HTTPS) -docker amnezia-awg2 udp/8443— AmneziaWGПротоколы разные — конфликта нет. Но при отладке легко перепутать.
alatyr-taverna.ru¶
listen 80;
listen 443 ssl;
server_name alatyr-taverna.ru;
root /opt/alatyr/dist; ← Vite/TypeScript static build
Без proxy_pass — nginx отдаёт файлы напрямую.
Сертификат: /etc/letsencrypt/live/alatyr-taverna.ru/
Let's Encrypt сертификаты¶
Все обновляются автоматически через certbot.timer (проверка 2 раза в день).
| Домен | Создан | Истекает |
|---|---|---|
alatyr-service.ru |
2026-07-18 | 2026-10-16 (17:53 UTC) |
vault.alatyr-service.ru |
2026-07-24 | 2026-10-22 (15:22 UTC) |
alatyr-taverna.ru |
2026-07-25 | 2026-10-23 (07:56 UTC) |
Проверить сроки: sudo certbot certificates
Vaultwarden — детально¶
Директория: /opt/vaultwarden/
/opt/vaultwarden/
├── docker-compose.yml ← 580 байт, простой compose
├── .env ← ENV с секретами (ADMIN_TOKEN, DOMAIN, SMTP...)
├── .env.backup.1784919342 ← бэкап .env
├── data/ ← БД (SQLite), attachments, sends
└── backups/
├── backup.sh ← скрипт бэкапа
├── backup.log ← лог cron-запусков
└── vaultwarden-backup-YYYY-MM-DD.tar.gz.gpg ← ежедневные бэкапы
Docker Compose (сокращённо):
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
volumes:
- ./data:/data
ports:
- "127.0.0.1:8222:80" # loopback only
healthcheck:
test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:80/alive || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
⚠️ Известная проблема: healthcheck постоянно падает — wget: not found внутри контейнера (в базовом образе Vaultwarden нет wget). Сам сервис работает нормально, только Docker показывает unhealthy. TODO: заменить healthcheck на curl или sh + /dev/tcp.
Бэкапы:
- Cron: 15 3 * * * /opt/vaultwarden/backups/backup.sh (каждый день в 03:15)
- Формат: .tar.gz.gpg (GPG-шифрование) ✅
- Retention: не настроен — файлы копятся с 24 июля. TODO: добавить ротацию (удалять старше 30-60 дней).
AmneziaWG сервер — детально¶
Развёрнут как Docker-контейнер: amnezia-awg2, uptime 2+ недели.
Образ: amnezia-awg2 — короткое имя, вероятно локально собранный или перетянутый тег. Уточнить: docker inspect amnezia-awg2 --format '{{.Config.Image}}'
Внешний порт: 0.0.0.0:8443/udp
Пиры: клиент ragserver (awg-rag) с IP 10.8.1.12/32 создан через
Amnezia GUI и присутствует в clientsTable. Handshake и runtime peer проверены
24.08.2026 командой docker exec amnezia-awg2 awg show awg0.
Подробнее: amneziawg-tunnels.md.
Конфиги: /opt/amnezia/awg/ внутри контейнера. Проверено 24.08.2026:
контейнер не имеет отдельного bind-mount для этого каталога, поэтому бэкап
снимается через docker cp.
Бэкап: с 25.08.2026 установлен
/opt/backups/amneziawg-backup.sh. Ежедневный запуск в 03:20 MSK,
зашифрованные архивы хранятся в /opt/backups/amneziawg/, локальный retention
30 дней. Скрипт проверяет расшифровку и наличие awg0.conf, clientsTable и
трёх файлов ключей. Первый автоматический архив проверен восстановлением списка
файлов. Off-site копирование остаётся задачей 17.
Управление: через приложение AmneziaVPN (Amnezia Panel) — GUI-порт наружу не проброшен, только SSH-туннель.
SSH и безопасность¶
SSH-порт: 22/tcp (стандартный, наружу)
Root login: в текущей сессии вход как root@vm-mini — значит разрешён. Уточнить: grep -E '^PermitRootLogin|^Port' /etc/ssh/sshd_config
fail2ban: статус на VPS в этой сессии не проверялся. Уточнить: systemctl is-active fail2ban && fail2ban-client status
TODO по безопасности:
- [ ] Перевести SSH на нестандартный порт (например 2222 или 22222)
- [ ] Запретить root login (PermitRootLogin no в sshd_config), создать sudo-пользователя
- [ ] Добавить AllowUsers в sshd_config
WireGuard (удалён 05.08.2026)¶
Ранее на VPS был запущен wg-quick@wg0 на 443/udp с одним мёртвым peer (10.10.0.2/32, handshake никогда не состоялся). Клиент на ragserver так и не был настроен.
Что было удалено (05.08.2026, ~10:40 MSK):
sudo systemctl stop wg-quick@wg0
sudo systemctl disable wg-quick@wg0
sudo rm /etc/wireguard/wg0.conf
sudo rm /etc/wireguard/client-windows.conf
sudo rm /etc/wireguard/{client,server}_{private,public}.key
sudo apt remove --purge wireguard wireguard-tools -y
Финальная проверка:
- which wg wg-quick — не найдены
- sudo ss -ulnp | grep :443 — пусто (443/udp свободен)
- sudo systemctl list-unit-files | grep wg — пусто
- sudo iptables -L FORWARD -n -v — нет правил wg0 и 10.10.0.0/24
- sudo iptables -t nat -L POSTROUTING -n -v — нет MASQUERADE для 10.10.0.0/24
Причина удаления: обычный WireGuard в РФ детектируется DPI и блокируется. Активно используется только AmneziaWG (Docker-контейнер amnezia-awg2 на 8443/udp).
Куда стучатся боты (что видно из логов)¶
На ragserver в nginx error.log сегодня видел стучки к rag.alatyr-service.ru:
- client: 45.156.129.191
- client: 94.154.43.254
- client: 195.182.16.23 request: /SDK/webLanguage
Страны/ASN не верифицировались. На самом VPS-е логи отдельно (/var/log/nginx/*.log), статистика может отличаться.
Это стандартный шум для любого публичного IP. fail2ban должен ловить повторяющиеся попытки.
Ключевые команды для диагностики VPS¶
Быстрая диагностика (сохранить в /root/vps-status.sh):
echo '=== OS ===' && lsb_release -d && uname -r
echo '=== RAM ===' && free -h | head -2
echo '=== DISK ===' && df -h /
echo '=== PORTS ===' && ss -tulnp | grep -v '127.0.0'
echo '=== DOCKER ===' && docker ps --format 'table {{.Names}}\t{{.Status}}'
echo '=== NGINX ===' && nginx -t 2>&1
echo '=== FAIL2BAN ===' && fail2ban-client status
echo '=== CERTS ===' && certbot certificates 2>/dev/null | grep -E 'Certificate Name|Expiry'
Известные проблемы / TODO¶
- Vaultwarden healthcheck — заменить wget на curl или проверку через
/dev/tcp - Ротация бэкапов Vaultwarden — добавить удаление старше 60 дней в
backup.sh -
Удалить WireGuard→ удалён 05.08.2026 (см. секцию выше) - SSH: перевести на нестандартный порт, запретить root, создать sudo-пользователя
- Конфиги AmneziaWG находятся в
/opt/amnezia/awg/внутри контейнера без отдельного bind-mount; бэкап снимается черезdocker cp - Уточнить: настроен ли swap (
swapon --show) - Добавить: security headers во все nginx-сайты (HSTS, X-Frame-Options, CSP)
- Проверить: пароль GPG для расшифровки бэкапов Vaultwarden — в Vaultwarden или в надёжном месте?
- Внести: пароль от Hostkey-панели в Vaultwarden
- Настроить: мониторинг (uptime, свободное место, статус контейнеров)
Связанные файлы базы¶
00_INDEX.md— общий обзор инфраструктурыnginx-vps-configs.md— детально по каждому сайту nginxvaultwarden.md— Vaultwarden отдельно (данные, бэкапы, восстановление)amneziawg-tunnels.md— AmneziaWG (сервер + клиент)certbot.md— как работает автообновление сертификатовdns-alatyr-service.md— DNS-записи обеих зон