MyCottage.cc

Архитектура интерфейса
администрирования strongSwan

web-админка strongSwan сервера

Компоненты панели, границы публичного примера и безопасная подготовка состояния без публикации рабочего кода и секретов.

← К списку статей

Что делает админка

После установки strongSwan можно управлять туннелями вручную через файлы. Но когда офисов становится больше двух, удобнее иметь web-панель: добавлять Office 1/2/3, генерировать swanctl.conf, применять конфиг, смотреть статус, uptime, трафик и ошибки.

В этой статье описана обезличенная архитектура: без рабочего домена, адреса интерфейса, IP, паролей, ключей и исходного кода панели. Это не самостоятельный дистрибутив.

Архитектура панели

  • Caddy — HTTPS, внешняя авторизация и проксирование на приложение.
  • FastAPI — web-интерфейс, SQLite, CSRF, аудит и генерация конфигурации.
  • strongSwan — IKEv2/IPsec-хаб, VICI socket и загрузка через swanctl --load-all.
  • Каталог состояния — база, сертификаты, сгенерированные конфиги, журналы и резервные копии.

Пример структуры на VPS

/opt/example-vpn-panel/              # код проекта
/opt/example-vpn-state/    # runtime state, не хранить в git
  db/panel.db
  generated/swanctl.conf
  certs/
  private/
  logs/
  backups/
  secrets.env

Минимальные переменные окружения

DOMAIN=vpn.example.com
VPN_PUBLIC_IP=203.0.113.10
VPN_LEFTID=vpn.example.com
VPN_BIND_ADDRESS=%any
APP_ADMIN_USER=admin
APP_ADMIN_PASS=CHANGE_ME_PANEL_PASSWORD
BASIC_AUTH_USER=admin
BASIC_AUTH_PASS=CHANGE_ME_BASIC_AUTH_PASSWORD
COOKIE_SECURE=true

Подготовка Docker и каталога состояния

apt update
apt install -y docker.io docker-compose-v2
systemctl enable --now docker

install -d -m 700 /opt/example-vpn-state
install -d -m 700 /opt/example-vpn-state/db /opt/example-vpn-state/generated
install -d -m 700 /opt/example-vpn-state/certs /opt/example-vpn-state/private
install -d -m 700 /opt/example-vpn-state/logs /opt/example-vpn-state/backups

Запуск при наличии проекта

Предварительное условие
Команды ниже работают только когда проверенные файлы приложения, compose.vps.yml и Caddy-конфигурация уже размещены в /opt/example-vpn-panel. Публичный подготовительный скрипт эти файлы не скачивает и не создаёт.
cd /opt/example-vpn-panel/deploy
docker compose --env-file /opt/example-vpn-state/secrets.env -f compose.vps.yml up -d --build
docker compose --env-file /opt/example-vpn-state/secrets.env -f compose.vps.yml ps

Что должно быть в интерфейсе

  • General — состояние хаба, CPU/RAM/Disk, uptime, Docker, reload status.
  • Site-to-site — Office 1/2/3, LAN, Remote ID, Remote addr, PSK, enabled/disabled.
  • Road-warrior — пользователи удалённого доступа.
  • Certificates / PKI — CA, server cert, срок действия, renew.
  • Admin — смена пароля, backup SQLite, системные действия.
  • Journal — audit, strongSwan logs, reload events.

Подготовительный скрипт

Скрипт создаёт каталоги и secrets.env, но не устанавливает саму панель. Перед запуском задайте собственные переменные окружения и отдельно предоставьте проверенный проект.

export DOMAIN="vpn.example.com"
export VPN_PUBLIC_IP="203.0.113.10"
export VPN_LEFTID="vpn.example.com"
export APP_ADMIN_PASS="$(openssl rand -hex 24)"
export BASIC_AUTH_PASS="$(openssl rand -hex 18)"
sudo -E bash install-mycottage-admin-example.sh

Проверка после развёртывания

curl -I https://panel.example.com/
cat /opt/example-vpn-state/logs/reload-status.txt
cd /opt/example-vpn-panel/deploy
docker compose --env-file /opt/example-vpn-state/secrets.env -f compose.vps.yml ps
docker compose --env-file /opt/example-vpn-state/secrets.env -f compose.vps.yml exec strongswan swanctl --list-conns
docker compose --env-file /opt/example-vpn-state/secrets.env -f compose.vps.yml exec strongswan swanctl --list-sas

Источники и границы примера