Runbook — Cloudflare-туннели
Audience: operator. Все туннели — это systemd-юниты, переживают ребут (
Restart=always+enabled). Восстановление почти всегда =systemctl restart <unit>на нужном хосте.⚠ Токены туннелей лежат в env-файлах (
/etc/…env, режим600) и в age-хранилище секретов.cloudflaredпоказывает свой токен вps— не копировать выводpsс токеном куда-либо.
Карта туннелей
| Хостнейм | Состояние | Edge → коннектор → origin |
|---|---|---|
gitlab.kontinuum.cloud | LIVE | CF Access → head → reverse-SSH → gitlab-host :80 |
updates.kontinuum.cloud | LIVE | CF Tunnel → aruba1 → python static :8088 |
legal.kontinuum.cloud | НЕ обслуживается | CF Access edge поднят, origin не запущен — resurrect-or-retire pending |
1. gitlab.kontinuum.cloud (публичный доступ к GitLab)
Самый длинный путь: GitLab живёт внутри домашней сети (только :80), а наружу выставлен через две сцепленные ноги.
Состав:
- Edge: Cloudflare Access — email-OTP, allow
belanchuk@gmail.com(+ service-token для API/CI). Управляется в CF dashboard / через CF API. - Коннектор:
cloudflared-gitlab.serviceна head. Обязан стартовать с--protocol http2 --edge-ip-version 4(иначе QUIC/IPv6 на этом аплинке не держится). Токен — в/etc/cloudflared-gitlab.env(режим600). Проксирует на127.0.0.1:9180. - Вторая нога:
gitlab-revtun.serviceна gitlab-host — reverse-SSH, поднимаетhead:9180→gitlab-host:80.
Восстановление:
# на head
systemctl status cloudflared-gitlab.service
systemctl restart cloudflared-gitlab.service
journalctl -u cloudflared-gitlab.service -n 50 --no-pager
# на gitlab-host (через worker на LAN, или через head-туннель)
systemctl restart gitlab-revtun.serviceОба — Restart=always + enabled, поэтому после ребута поднимаются сами; ручной restart нужен только если юнит упал в failed.
Коннектор НЕ переносить домой
Домашний аплинк не выдерживает udp/tcp 7844 cloudflared. Connector обязан жить на датацентр-хосте (head). Никогда не запускать cloudflared для этого туннеля в домашней сети.
Проверка живости:
curl -sI https://gitlab.kontinuum.cloud # ожидается 302 на cloudflareaccess.com
systemctl is-enabled cloudflared-gitlab.service # enabled
systemctl is-active cloudflared-gitlab.service # active2. updates.kontinuum.cloud (канал обновлений приложения)
CF Tunnel → aruba1 cloudflared.service → kontinuum-updates-static.service
(python static, слушает 127.0.0.1:8088, CORS, за cloudflared)Раздаёт latest.json + подписанный APK. Подробнее о публикации — в runbook релизов.
Восстановление (на aruba1, ssh root@94.177.204.91):
systemctl restart cloudflared.service
systemctl restart kontinuum-updates-static.service
journalctl -u kontinuum-updates-static.service -n 30 --no-pagerПроверка:
curl -s https://updates.kontinuum.cloud/latest.json # снаружи
ssh root@94.177.204.91 'ss -ltnp | grep 8088' # python на :8088Tunnel vs nginx
Канал обновлений идёт через CF Tunnel напрямую на python-static, минуя nginx aruba1. Не заводить его за nginx.
3. legal.kontinuum.cloud (НЕ обслуживается)
CF Access edge отвечает (запрос редиректит на OTP-логин), но origin не запущен — раньше это был локальный VitePress (:5173), сейчас процесс не поднят. Считать сервис не-живым.
Решение resurrect-or-retire — за founder/CTO:
- resurrect: поднять VitePress-origin + соответствующий коннектор;
- retire: удалить CF Access app + DNS-запись, чтобы не висел мёртвый хостнейм.
Сводка юнитов
| Unit | Хост | Назначение |
|---|---|---|
cloudflared-gitlab.service | head | edge-коннектор GitLab |
gitlab-revtun.service | gitlab-host | reverse-SSH нога к GitLab :80 |
cloudflared.service | aruba1 | edge-коннектор updates |
kontinuum-updates-static.service | aruba1 | python static :8088 |
head-tunnel.service | worker | reverse-SSH worker→head (см. бэкапы/recovery) |