HTTPS через Caddy с автоматическими сертификатами

Токен и расшифровки разговоров ходили по сети открытым текстом. Теперь в
пакете лежит Caddy: он держит сертификаты Let's Encrypt и продлевает их сам,
а сервис уходит на localhost.

Отдельно решён вопрос подмены адреса: за прокси все запросы приходят с
localhost, и список разрешённых адресов пускал бы кого угодно. Заголовку
с настоящим адресом сервис верит только от доверенного прокси - на это
восемь тестов.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-16 01:41:34 +05:00
co-authored by Claude Opus 5
parent 64ce562bb1
commit c992b7907d
6 changed files with 198 additions and 5 deletions
+6
View File
@@ -29,6 +29,10 @@ token = "{token}"
# Кто может обращаться. Пусто = разрешены все адреса.
# Примеры: "192.168.1.0/24, 10.8.0.5, 127.0.0.1"
allow_ips = "127.0.0.1, ::1"
# Адреса обратных прокси, которым можно верить в определении клиента.
# Пусто = сервис работает напрямую и заголовкам не доверяет.
# При работе через start-https.bat (Caddy на этой же машине) ставьте 127.0.0.1
trust_proxy = ""
# Открывать ли /docs и /openapi.json. Они не требуют токена и показывают
# устройство API всем, кто знает адрес, поэтому по умолчанию выключены.
docs = false
@@ -81,6 +85,7 @@ class Settings:
token: str = ""
allow_ips: str = ""
docs: bool = False
trust_proxy: str = ""
threads: int = 0
workers: int = 0
speakers: int = 2
@@ -152,6 +157,7 @@ def load_settings(config_path: Path | None = None) -> Settings:
token=str(security.get("token", "")),
allow_ips=str(security.get("allow_ips", "")),
docs=bool(security.get("docs", False)),
trust_proxy=str(security.get("trust_proxy", "")),
threads=int(proc.get("threads", 0)),
workers=int(proc.get("workers", 1)),
speakers=int(proc.get("speakers", 2)),