Files
infra/servers/fr1.md

7.5 KiB
Raw Permalink Blame History

fr1 — fr1.ruzzy.dev (161.97.93.252)

Снимок состояния сервера. Секреты (пароли/токены) — только на сервере, не здесь.

Провайдер: Contabo VPS · France / Lauterbourg (Grand Est) ОС: Ubuntu 24.04 LTS · kernel 6.8.0-106-generic Ресурсы: 8 vCPU / 23 GB RAM / 387 GB hostname: fr1 (FQDN fr1.ruzzy.dev через /etc/hosts)


Пользователи и доступ

  • Пользователь rus (uid 1000, группы rus, sudo, users), sudo по паролю.
  • Вход с Mac: ssh rus-161 (алиас в ~/.ssh/config) → ключ ~/.ssh/id_161_97_93_252 (ed25519).
  • root-доступ по SSH закрыт; для root изнутри — sudo -i.

SSH (/etc/ssh/sshd_config.d/00-hardening.conf)

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
MaxAuthTries 3
AllowUsers rus

Через socket-activation (ssh.socket).

DNS

  • Зона ruzzy.dev — Namecheap (NS dns1/dns2.registrar-servers.com).
  • fr1.ruzzy.dev A → 161.97.93.252.
  • PTR (reverse DNS): дефолтный vmi3387709.contaboserver.net (не менялся).

Firewall (ufw)

  • Default: deny incoming, allow outgoing.
  • Открыто: 22/tcp, 80/tcp, 443/tcp (IPv4 + IPv6).

fail2ban (/etc/fail2ban/jail.local)

[DEFAULT]
bantime=1h  findtime=10m  maxretry=5
ignoreip = 127.0.0.1/8 ::1 31.153.37.106
backend=systemd  banaction=ufw

[sshd]      enabled=true
[recidive]  enabled=true  bantime=1w  findtime=1d  maxretry=5
            backend=auto  logpath=/var/log/fail2ban.log

Обновления

  • Ubuntu Pro подключён (аккаунт ruzzyrullezz@gmail.com): livepatch, esm-infra, esm-apps — enabled.
  • unattended-upgrades: Update-Package-Lists "1", Unattended-Upgrade "1" (ежедневно, security). Авто-reboot выключен.

Система

  • swap: /swapfile 2 GB (в /etc/fstab), vm.swappiness=10 (/etc/sysctl.d/99-swappiness.conf).
  • journald: Storage=persistent, SystemMaxUse=500M.
  • AppArmor включён; время — systemd-timesyncd.

Docker

  • Docker 29.6 + Compose v5.1 (официальный репозиторий). rus в группе docker.

nginx + TLS

  • nginx 1.24 (apt) + certbot 2.9 (python3-certbot-nginx), автопродление через systemd-таймер certbot.
  • vhost /etc/nginx/sites-available/mon.ruzzy.dev.conf → проксирует на Grafana (127.0.0.1:3000), HTTPS-редирект, websocket.

Мониторинг (~/monitoring, stack в репо stacks/monitoring/)

  • Стек: Prometheus + Grafana + node-exporter + cAdvisor + Alertmanager (docker compose).
  • Алерты: Alertmanager → Telegram (бот @ultimate_log_bot, chat 607015). Правила prometheus/rules/alerts.yml: TargetDown, HostHighCPU, HostLowMemory, HostDiskLow/Critical. Токен — в ~/monitoring/alertmanager/telegram_token (chown 65534, не в git).
  • Prometheus: retention 90d, слушает 127.0.0.1:9090. Скрейпит node-exporter + cadvisor (job'ы node/cadvisor, instance fr1).
  • Grafana: 127.0.0.1:3000, доступ снаружи через https://mon.ruzzy.dev (nginx + Let's Encrypt). Datasource Prometheus (uid prometheus) и дашборды (Node Exporter Full, cAdvisor, папка Infra) провижатся автоматически. Пароль admin — в ~/monitoring/docker-compose.yml на сервере (в репо вынесен в ${GF_ADMIN_PASSWORD}).
  • Multi-server: таргеты через file_sd (prometheus/targets/{node,cadvisor}/*.yml) — новый сервер = добавить файл + curl -X POST .../-/reload. См. stacks/monitoring/README.md.
  • node-exporter — network_mode: host (видит реальные интерфейсы хоста: eth0, wg0-туннель и т.д.; иначе показывал бы только сеть docker-бриджа). Слушает host:9100, доступ ограничен ufw (from 172.16.0.0/12 to port 9100), Prometheus скрейпит через host.docker.internal:9100. nodename берётся с хоста (fr1).
  • Дашборд Network / Traffic (network.json): RX/TX по интерфейсам, пакеты, ошибки/дропы, статус — с фильтром по instance/device (lo/veth/docker скрыты). ⚠️ для корректной сети на de1 его агент тоже надо перевести в host-net (пока bridge).
  • DNS: mon.ruzzy.dev → 161.97.93.252.
  • Планируется: VPN-экспортёры (wireguard/openvpn/telemt) + подключение de1 по туннелю.

Gitea (~/gitea, stack в репо stacks/gitea/)

  • Перенесён с de1 2026-06-21. Gitea 1.25.4, БД SQLite (всё в /srv/gitea, 4.3 ГБ, 16 репо).
  • Контейнер gitea: SSH 2222 (наружу), web 127.0.0.1:3001 (3000 занят Grafana → перевесил на 3001).
  • nginx vhost git.ruzzy.dev127.0.0.1:3001, TLS Let's Encrypt, client_max_body_size 512M.
  • DNS: git.ruzzy.dev (CNAME → fr1) → 161.97.93.252.
  • ROOT_URL/SSH_DOMAIN = git.ruzzy.dev (не менялись). Host-ключи SSH и user/deploy-ключи перенесены с данными — ssh://git@git.ruzzy.dev:2222 работает как раньше.
  • Это origin репо infra и vault openclaw.

AmneziaWG exit (для ru1) — перенос VPN, фаза 1

  • Зеркало exit-узла de1: AmneziaWG server wg0 = 10.8.1.0/24, ListenPort 36360/udp, те же server-ключи/PSK и obfuscation-параметры (Jc/Jmin/Jmax/S1/S2/H1-4), что и на de1 (server-pubkey Lumb1o…) → на ru1 свитч = только смена Endpoint.
  • Установка: amneziawg-dkms+amneziawg-tools (PPA amnezia), host-ом через awg-quick@wg0 (enabled). Конфиг /etc/amnezia/amneziawg/wg0.conf (секрет, не в git).
  • NAT: PostUp masquerade 10.8.1.0/24 → eth0 + ip_forward=1.
  • ufw: 36360/udp открыт + ufw route allow in on wg0 out on eth0 (и обратно) + ufw allow in on wg0обязательно, иначе ufw режет туннельный трафик (на de1 ufw был выключен).
  • Пиры: ru1 (10.8.1.4) переключён сюда; прямые 10.8.1.1/2/3 пока на de1.
  • Проверено: зарубежный exit RU-клиентов идёт через fr1 (exit-IP 161.97.93.252).
  • Остаётся (фаза 2): telemt MTProxy, OpenVPN, прямые AWG-клиенты, перенос DNS ruzzy.dev/www.

Telegram-уведомления

  • Бот @ultimate_log_bot. Конфиг /etc/tg-notify.conf (chmod 600, токен+chat_id — секрет на сервере).
  • /usr/local/bin/tg-notify.sh "msg" — универсальная отправка (HTML, префикс hostname).
  • /usr/local/bin/uu-telegram-report.sh — сводка автообновлений + reboot-required; повешен на apt-daily-upgrade.service через drop-in /etc/systemd/system/apt-daily-upgrade.service.d/telegram.conf (ExecStartPost). Молчит, если нечего сообщать.

Установленные пакеты (сверх базы)

htop, mtr-tiny, tmux, vim, curl, wget, git, unzip, net-tools, dnsutils, ncdu, rsync, fail2ban, unattended-upgrades.