From 854f2d465011be1f046e19d45dd53d5694be3caf Mon Sep 17 00:00:00 2001 From: dev Date: Sat, 12 Sep 2026 15:06:56 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=80=D1=83=D0=B6=D1=83?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Cloudflare=20Quick=20Tunnel?= =?UTF-8?q?=20(cloudflared)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 12 +++++++++++- README.md | 12 ++++++++++++ docker-compose.yml | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 42ec4e3..efdd419 100644 --- a/.env.example +++ b/.env.example @@ -13,4 +13,14 @@ AI_MODEL_REPO=Qwen/Qwen2.5-1.5B-Instruct-GGUF # Промпт по умолчанию для автоисправления текстов (переопределяет встроенный, если в настройках не сохранён свой) AI_PROMPT=Ты — редактор текстов. Исправь ТОЛЬКО грамматические, орфографические и пунктуационные ошибки в тексте. Приведи к правильному регистру буквы. НЕ меняй слова, структуру предложений, стиль или смысл текста. Верни ТОЛЬКО исправленный текст без пояснений. # Таймаут запроса к AI (мс), по умолчанию 120000 (2 минуты) -AI_REQUEST_TIMEOUT_MS=120000 \ No newline at end of file +AI_REQUEST_TIMEOUT_MS=120000 + +# === Cloudflare Tunnel (контейнер cloudflared) === +# По умолчанию — Quick Tunnel на trycloudflare.com: случайный публичный URL, +# адрес печатается в логах: docker compose logs -f cloudflared. +# Чтобы привязать свой домен, замените command сервиса cloudflared +# в docker-compose.yml на: command: ["tunnel", "run", "--token", "${CLOUDFLARE_TUNNEL_TOKEN}"] +# (токен вида "eyJ..." создаётся в Cloudflare Zero Trust -> Networks -> Tunnels). +CLOUDFLARE_TUNNEL_TOKEN= +# Внутренний адрес приложения, на который указывает Quick Tunnel. +CLOUDFLARE_TUNNEL_URL=http://app:3003 \ No newline at end of file diff --git a/README.md b/README.md index 0d3ab57..9cf4ce4 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,18 @@ docker exec whatido-tailscale-1 tailscale funnel status Исторически проект публиковался через reverse-proxy Caddy + Let's Encrypt (файлы `Caddyfile.example`, закомментированный сервис в старых версиях compose). Если нужно классическое публичное HTTPS на собственном домене с проброшенными портами 80/443 — этот вариант остаётся возможным: раскомментируйте/восстановите сервис `caddy`, укажите домен в `Caddyfile` и уберите сетевые блокировки. По умолчанию сейчас рекомендуется Tailscale-схема выше. +## Публикация наружу через Cloudflare (Quick Tunnel) + +Помимо Tailscale, стек умеет публиковать приложение через контейнер `cloudflared` (сервис в `docker-compose.yml`). **Quick Tunnel** даёт случайный публичный адрес `*.trycloudflare.com` через Cloudflare — без своего домена, банковской карты и проброса портов (подойдёт, если Zero Trust требует привязать карту). + +Узнать текущий адрес для доступа: + +```bash +docker compose logs cloudflared | grep trycloud +``` + +Адрес меняется при каждом перезапуске контейнера `cloudflared`. Для постоянного адреса используйте именованный туннель (замените `command` сервиса `cloudflared` в `docker-compose.yml` на `["tunnel", "run", "--token", "${CLOUDFLARE_TUNNEL_TOKEN}"]`, токен — из Cloudflare Zero Trust **Networks → Tunnels**) или схему через Tailscale выше. + ## Структура данных - `groups` — группы, расписание (`day_of_week`, `time_start`, `time_end`) diff --git a/docker-compose.yml b/docker-compose.yml index 1cb7daa..d85af44 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -65,6 +65,24 @@ services: # depends_on: # - app + # Публикация наружу через Cloudflare Tunnel (cloudflared), Quick Tunnel: + # случайный публичный URL *.trycloudflare.com, который печатается в логах: + # docker compose logs -f cloudflared + # ВАЖНО: официальный образ cloudflare/cloudflared НЕ содержит /bin/sh, + # поэтому логика передаётся аргументами в command (entrypoint образа = cloudflared), + # а не скриптом. + # Для именованного туннеля на свой домен замените command ниже на: + # command: ["tunnel", "run", "--token", "${CLOUDFLARE_TUNNEL_TOKEN}"] + # (токен получается в Cloudflare Zero Trust -> Networks -> Tunnels). + cloudflared: + image: cloudflare/cloudflared:latest + restart: unless-stopped + environment: + TZ: Europe/Moscow + command: ["tunnel", "--url", "${CLOUDFLARE_TUNNEL_URL:-http://app:3003}"] + depends_on: + - app + text-corrector: image: ghcr.io/ggml-org/llama.cpp:server