Compare commits

...

2 Commits

Author SHA1 Message Date
maximilion96 2acacf50b7 Remove Dify from ru-docker-infra
Снесены все 7 сервисов (api/worker/web/plugin-daemon/sandbox/ssrf-proxy/
weaviate), их тома, базы dify/dify_plugin и DNS-запись dify.mxti.ru.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 03:31:15 +03:00
maximilion96 261320dafd Remove mtg (Telegram MTProto proxy); update ru-docker-infra IP
Сервис mtg снят с ru-docker-infra: убран из compose, удалены
mtg/config.toml и переменная MTG_FAKE_TLS_HOST, вычищены записи
в inventory и CLAUDE.md. Заодно обновлён host узла на новый адрес.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 03:17:09 +03:00
8 changed files with 3 additions and 368 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ servers/
<server-name>/ # одна папка на сервер, имя совпадает с inventory.servers[].name
docker-compose.yml # compose этого узла
.env # переменные окружения узла (включая пароли)
<service>/ # конфиги конкретных сервисов (xray, mtg, nginx, ...)
<service>/ # конфиги конкретных сервисов (xray, nginx, ...)
ssh/ # ключи и прочие чувствительные файлы
domains.yml # источник правды о DNS-записях для всех доменов
CLAUDE.md # этот файл — обзор и правила
-5
View File
@@ -26,11 +26,6 @@ domains:
server: ru-docker-infra
purpose: "portainer UI"
- host: dify
type: A
server: ru-docker-infra
purpose: "dify через traefik"
- host: n8n
type: A
server: nl-reverse-proxy
+2 -4
View File
@@ -8,11 +8,11 @@ defaults: # общие настройки, чтобы не
servers:
- name: ru-docker-infra # основной сервер в Яндекс.Облаке
host: 111.88.253.112
host: 93.77.188.75
role: core # основной узел: все ключевые сервисы
env: prod
location: yandex-cloud
tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, mtg, dify, grabcevo]
tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, grabcevo]
services:
- traefik
- postgres
@@ -22,8 +22,6 @@ servers:
- xray # исходящий прокси для n8n
- gitea
- portainer
- mtg # Telegram MTProto-прокси
- dify # LLM-app платформа (api/worker/web/plugin-daemon/sandbox/ssrf-proxy/weaviate)
- grabcevo # статический лендинг «База Грабцево» (nginx, база-грабцево.рф)
managed: true
-28
View File
@@ -22,34 +22,6 @@ REDIS_PASSWORD=31hjsbj34rjs
# Сгенерируй: openssl rand -hex 32
N8N_ENCRYPTION_KEY=fbac490fbf63b779fb5f3d90a2fe5445164aaacef1506b02f3f4331c23c2ba59
# --- Dify ---
DIFY_HOST=dify.mxti.ru
# Версии образов (api и web всегда одинаковые)
DIFY_VERSION=1.14.2
DIFY_PLUGIN_DAEMON_VERSION=0.6.1-local
DIFY_SANDBOX_VERSION=0.2.15
DIFY_WEAVIATE_VERSION=1.27.0
# Секреты (сгенерированы: openssl rand -base64 42 / -hex 24)
DIFY_SECRET_KEY=UzWUvFZzVB0Ap0MhhEfQ4r4YiRUBOjJ0O3ra1KUVwwXHoeqmF6OxgqW9
DIFY_PLUGIN_DAEMON_KEY=dAX7IwPuO4ggh1MBASC25G8zfm6DVUZ5pCqKJ5vgQBguYgsSs2OVToDR
DIFY_INNER_API_KEY=7QZ0ijEkf+IAGI/38pQlopq3vhZMGPF682JBS3hSJCyjzGTRuoYZ9A5w
DIFY_WEAVIATE_API_KEY=0fd018d333fae8fb59399a9ddc6051812e06365f64c46740
DIFY_SANDBOX_API_KEY=fd3cd878e0cefe3410a81ecaa30facdd78e1d8357c10b927
# Dify использует общий postgres (базы dify / dify_plugin под POSTGRES_USER)
# и общий redis (db 2 для кэша, db 3 для celery-брокера).
# --- Исходящий прокси через xray (VLESS→ru-vpn), как у n8n ---
# Туннелируем внешние вызовы (LLM API: OpenAI/Anthropic и т.п.). Внутренние сервисы,
# PyPI и маркетплейс Dify — напрямую (так быстрее/стабильнее и уже работает).
DIFY_HTTP_PROXY=http://xray:8080
DIFY_NO_PROXY=localhost,127.0.0.1,dify-api,dify-worker,dify-web,dify-plugin-daemon,dify-sandbox,dify-ssrf-proxy,dify-weaviate,postgres,redis,marketplace.dify.ai,.dify.ai,pypi.org,files.pythonhosted.org,.pythonhosted.org
# --- Grabcevo (лендинг «База Грабцево») ---
# Кириллический домен база-грабцево.рф в punycode-форме (traefik/ACME работают с ней).
GRABCEVO_HOST=xn----7sbabbehfuo8fta4f.xn--p1ai
# --- MTProto (mtg) ---
# Фейк-домен для Fake-TLS — ОБЯЗАТЕЛЬНО тот же, под который сгенерирован секрет
# в mtg/config.toml. Traefik матчит TLS-handshake по SNI этого домена (TCP router
# с tls.passthrough) и проксирует сырой TCP в mtg. ВАЖНО: не должен совпадать
# с N8N_HOST/PORTAINER_HOST.
MTG_FAKE_TLS_HOST=mtg.mxti.ru
@@ -1,52 +0,0 @@
# Dify ssrf_proxy (squid) — отрендеренный конфиг из upstream docker/ssrf_proxy/squid.conf.template.
# Значения подставлены дефолтные: HTTP_PORT=3128, REVERSE_PROXY_PORT=8194,
# SANDBOX_HOST=sandbox, SANDBOX_PORT=8194, COREDUMP_DIR=/var/spool/squid.
# Forward-proxy для api/worker/sandbox (SSRF-защита) + accel reverse-proxy на sandbox.
acl localnet src 0.0.0.1-0.255.255.255
acl localnet src 10.0.0.0/8
acl localnet src 100.64.0.0/10
acl localnet src 169.254.0.0/16
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl CONNECT method CONNECT
acl allowed_domains dstdomain .marketplace.dify.ai
http_access allow allowed_domains
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
include /etc/squid/conf.d/*.conf
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern . 0 20% 4320
http_port 8194 accel vhost
cache_peer sandbox parent 8194 0 no-query originserver
acl src_all src all
http_access allow src_all
client_request_buffer_max_size 100 MB
-251
View File
@@ -11,10 +11,6 @@ volumes:
redis_data:
portainer_data:
gitea_data:
dify_api_storage:
dify_plugin_storage:
dify_weaviate_data:
dify_sandbox_deps:
services:
traefik:
@@ -217,233 +213,6 @@ services:
- traefik.http.routers.portainer.tls.certresolver=le
- traefik.http.services.portainer.loadbalancer.server.port=9000
mtg:
image: nineseconds/mtg:2
container_name: mtg
restart: unless-stopped
volumes:
- ./mtg/config.toml:/config.toml:ro
networks:
- proxy
command: ["run", "/config.toml"]
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.tcp.routers.mtg.rule=HostSNI(`${MTG_FAKE_TLS_HOST}`)
- traefik.tcp.routers.mtg.entrypoints=websecure
- traefik.tcp.routers.mtg.tls.passthrough=true
- traefik.tcp.services.mtg.loadbalancer.server.port=3128
# --- Dify -----------------------------------------------------------------
# LLM-app платформа. БД и redis — общие (postgres: база dify/dify_plugin,
# redis: db 2/3). Vector store — отдельный weaviate. Внешний вход — traefik с
# path-роутингом (вместо штатного dify-nginx): /console/api,/api,/v1,/files → api,
# /e/ → plugin_daemon, остальное → web.
dify-api:
image: langgenius/dify-api:${DIFY_VERSION}
container_name: dify-api
restart: unless-stopped
environment: &dify-api-env
MODE: api
LOG_LEVEL: INFO
SECRET_KEY: ${DIFY_SECRET_KEY}
DEPLOY_ENV: PRODUCTION
MIGRATION_ENABLED: "true"
CONSOLE_API_URL: https://${DIFY_HOST}
CONSOLE_WEB_URL: https://${DIFY_HOST}
SERVICE_API_URL: https://${DIFY_HOST}
APP_API_URL: https://${DIFY_HOST}
APP_WEB_URL: https://${DIFY_HOST}
FILES_URL: https://${DIFY_HOST}
# --- Endpoint/Trigger плагины (вебхуки) ---
# endpoint-плагины обслуживает plugin-daemon (/e/), триггеры — api (/triggers).
# Без этого Dify генерирует webhook-URL на localhost (триггер не добавить).
ENDPOINT_URL_TEMPLATE: https://${DIFY_HOST}/e/{hook_id}
TRIGGER_URL: https://${DIFY_HOST}
# --- Postgres (общий) ---
DB_USERNAME: ${POSTGRES_USER}
DB_PASSWORD: ${POSTGRES_PASSWORD}
DB_HOST: postgres
DB_PORT: "5432"
DB_DATABASE: dify
# --- Redis (общий) ---
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_PASSWORD: ${REDIS_PASSWORD}
REDIS_DB: "2"
CELERY_BROKER_URL: redis://:${REDIS_PASSWORD}@redis:6379/3
# --- Vector store ---
VECTOR_STORE: weaviate
WEAVIATE_ENDPOINT: http://dify-weaviate:8080
WEAVIATE_API_KEY: ${DIFY_WEAVIATE_API_KEY}
# --- Storage (локальный том) ---
STORAGE_TYPE: opendal
OPENDAL_SCHEME: fs
OPENDAL_FS_ROOT: storage
# --- Code execution sandbox ---
CODE_EXECUTION_ENDPOINT: http://dify-sandbox:8194
CODE_EXECUTION_API_KEY: ${DIFY_SANDBOX_API_KEY}
# --- SSRF proxy ---
SSRF_PROXY_HTTP_URL: http://dify-ssrf-proxy:3128
SSRF_PROXY_HTTPS_URL: http://dify-ssrf-proxy:3128
# ПРИМ.: исходящий прокси (xray) НЕ ставим на api/worker — это тормозит
# веб-API (вызовы уходят в VLESS-туннель, блокируют воркеров gunicorn,
# редактор отваливается по таймауту). Прокси только на plugin-daemon,
# где крутятся LLM-провайдеры — этого достаточно для гео-разблока.
# --- Plugin daemon ---
PLUGIN_DAEMON_URL: http://dify-plugin-daemon:5002
PLUGIN_DAEMON_KEY: ${DIFY_PLUGIN_DAEMON_KEY}
INNER_API_KEY_FOR_PLUGIN: ${DIFY_INNER_API_KEY}
MARKETPLACE_ENABLED: "true"
MARKETPLACE_API_URL: https://marketplace.dify.ai
volumes:
- dify_api_storage:/app/api/storage
networks:
- proxy
- internal
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
dify-weaviate:
condition: service_started
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.dify-api.rule=Host(`${DIFY_HOST}`) && (PathPrefix(`/console/api`) || PathPrefix(`/api`) || PathPrefix(`/v1`) || PathPrefix(`/files`) || PathPrefix(`/triggers`))
- traefik.http.routers.dify-api.priority=10
- traefik.http.routers.dify-api.entrypoints=websecure
- traefik.http.routers.dify-api.tls=true
- traefik.http.routers.dify-api.tls.certresolver=le
- traefik.http.routers.dify-api.service=dify-api
- traefik.http.services.dify-api.loadbalancer.server.port=5001
dify-worker:
image: langgenius/dify-api:${DIFY_VERSION}
container_name: dify-worker
restart: unless-stopped
environment:
<<: *dify-api-env
MODE: worker
volumes:
- dify_api_storage:/app/api/storage
networks:
- internal
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
dify-web:
image: langgenius/dify-web:${DIFY_VERSION}
container_name: dify-web
restart: unless-stopped
environment:
# Контейнер в двух сетях (proxy+internal); без этого Next.js слушает только
# на IP internal-сети и traefik (proxy) получает 502. Биндим все интерфейсы.
HOSTNAME: 0.0.0.0
CONSOLE_API_URL: https://${DIFY_HOST}
APP_API_URL: https://${DIFY_HOST}
MARKETPLACE_API_URL: https://marketplace.dify.ai
MARKETPLACE_URL: https://marketplace.dify.ai
networks:
- proxy
- internal
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.dify-web.rule=Host(`${DIFY_HOST}`)
- traefik.http.routers.dify-web.priority=1
- traefik.http.routers.dify-web.entrypoints=websecure
- traefik.http.routers.dify-web.tls=true
- traefik.http.routers.dify-web.tls.certresolver=le
- traefik.http.routers.dify-web.service=dify-web
- traefik.http.services.dify-web.loadbalancer.server.port=3000
dify-plugin-daemon:
image: langgenius/dify-plugin-daemon:${DIFY_PLUGIN_DAEMON_VERSION}
container_name: dify-plugin-daemon
restart: unless-stopped
environment:
DB_USERNAME: ${POSTGRES_USER}
DB_PASSWORD: ${POSTGRES_PASSWORD}
DB_HOST: postgres
DB_PORT: "5432"
DB_DATABASE: dify_plugin
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_PASSWORD: ${REDIS_PASSWORD}
REDIS_DB: "2"
SERVER_PORT: "5002"
SERVER_KEY: ${DIFY_PLUGIN_DAEMON_KEY}
DIFY_INNER_API_URL: http://dify-api:5001
DIFY_INNER_API_KEY: ${DIFY_INNER_API_KEY}
PLUGIN_REMOTE_INSTALLING_HOST: 0.0.0.0
PLUGIN_REMOTE_INSTALLING_PORT: "5003"
PLUGIN_WORKING_PATH: /app/storage/cwd
PYTHON_ENV_INIT_TIMEOUT: "120"
PLUGIN_MAX_EXECUTION_TIMEOUT: "600"
PLUGIN_STORAGE_TYPE: local
PLUGIN_STORAGE_LOCAL_ROOT: /app/storage
FORCE_VERIFYING_SIGNATURE: "true"
MARKETPLACE_ENABLED: "true"
MARKETPLACE_API_URL: https://marketplace.dify.ai
# --- Исходящий прокси через xray (LLM-провайдеры крутятся здесь) ---
HTTP_PROXY: ${DIFY_HTTP_PROXY}
HTTPS_PROXY: ${DIFY_HTTP_PROXY}
NO_PROXY: ${DIFY_NO_PROXY}
volumes:
- dify_plugin_storage:/app/storage
networks:
- proxy
- internal
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.dify-plugin.rule=Host(`${DIFY_HOST}`) && PathPrefix(`/e/`)
- traefik.http.routers.dify-plugin.priority=10
- traefik.http.routers.dify-plugin.entrypoints=websecure
- traefik.http.routers.dify-plugin.tls=true
- traefik.http.routers.dify-plugin.tls.certresolver=le
- traefik.http.routers.dify-plugin.service=dify-plugin
- traefik.http.services.dify-plugin.loadbalancer.server.port=5002
dify-sandbox:
image: langgenius/dify-sandbox:${DIFY_SANDBOX_VERSION}
container_name: dify-sandbox
restart: unless-stopped
environment:
API_KEY: ${DIFY_SANDBOX_API_KEY}
GIN_MODE: release
WORKER_TIMEOUT: "15"
ENABLE_NETWORK: "true"
HTTP_PROXY: http://dify-ssrf-proxy:3128
HTTPS_PROXY: http://dify-ssrf-proxy:3128
SANDBOX_PORT: "8194"
volumes:
- dify_sandbox_deps:/dependencies
networks:
- internal
depends_on:
- dify-ssrf-proxy
dify-ssrf-proxy:
image: ubuntu/squid:latest
container_name: dify-ssrf-proxy
restart: unless-stopped
volumes:
- ./dify/ssrf_proxy/squid.conf:/etc/squid/squid.conf:ro
networks:
- internal
# --- Grabcevo (статический лендинг «База Грабцево») -----------------------
# Продающий сайт производственно-складского комплекса. Чистая статика
# (index.html + assets/), отдаётся nginx. Домен — кириллический (IDN),
@@ -469,23 +238,3 @@ services:
- traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.replacement=https://$${1}
- traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.permanent=true
- traefik.http.services.grabcevo.loadbalancer.server.port=80
dify-weaviate:
image: semitechnologies/weaviate:${DIFY_WEAVIATE_VERSION}
container_name: dify-weaviate
restart: unless-stopped
environment:
PERSISTENCE_DATA_PATH: /var/lib/weaviate
QUERY_DEFAULTS_LIMIT: "25"
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: "false"
DEFAULT_VECTORIZER_MODULE: none
CLUSTER_HOSTNAME: node1
AUTHENTICATION_APIKEY_ENABLED: "true"
AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${DIFY_WEAVIATE_API_KEY}
AUTHENTICATION_APIKEY_USERS: dify@local
AUTHORIZATION_ADMINLIST_ENABLED: "true"
AUTHORIZATION_ADMINLIST_USERS: dify@local
volumes:
- dify_weaviate_data:/var/lib/weaviate
networks:
- internal
-17
View File
@@ -1,17 +0,0 @@
# Сгенерируй секрет командой:
# docker run --rm nineseconds/mtg:2 generate-secret www.cloudflare.com
# и вставь результат сюда. Хост в команде — это домен для Fake-TLS маскировки
# (cloudflare.com, google.com и подобные хорошо работают).
secret = "7tqB0T5NH9zt6xcq29KWDzBtdGcubXh0aS5ydQ"
bind-to = "0.0.0.0:3128"
[network]
prefer-ip = "prefer-ipv4"
[defense.anti-replay]
enabled = true
max-size = "1mib"
[defense.blocklist]
enabled = false
@@ -1,10 +0,0 @@
-- Создание баз для Dify в общем postgres.
-- ВАЖНО: скрипты из /docker-entrypoint-initdb.d/ выполняются ТОЛЬКО при первой
-- инициализации (пустой data-каталог). На уже работающем postgres базы нужно
-- создать вручную один раз (см. servers/ru-docker-infra/README или CLAUDE.md):
-- docker exec n8n-postgres psql -U n8n -c "CREATE DATABASE dify;"
-- docker exec n8n-postgres psql -U n8n -c "CREATE DATABASE dify_plugin;"
-- Dify подключается под существующим суперпользователем postgres (POSTGRES_USER).
SELECT 'CREATE DATABASE dify' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'dify')\gexec
SELECT 'CREATE DATABASE dify_plugin' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'dify_plugin')\gexec