Перейти к содержанию

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:

/etc/netplan/99-custom-dns.yaml
DNS: 1.1.1.1, 77.88.8.8
DHCPv4 UseDNS: false
DHCPv6 UseDNS: false

Файл имеет права 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_name alatyr-service.ru www.alatyr-service.ru;
proxy_pass  http://127.0.0.1:5000;   ← Node.js

В файле несколько 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 — детально по каждому сайту nginx
  • vaultwarden.md — Vaultwarden отдельно (данные, бэкапы, восстановление)
  • amneziawg-tunnels.md — AmneziaWG (сервер + клиент)
  • certbot.md — как работает автообновление сертификатов
  • dns-alatyr-service.md — DNS-записи обеих зон