101 lines
7.5 KiB
Markdown
101 lines
7.5 KiB
Markdown
# 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.dev` → `127.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.
|