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>
This commit is contained in:
2026-07-29 03:31:15 +03:00
parent 261320dafd
commit 2acacf50b7
6 changed files with 1 additions and 324 deletions
-5
View File
@@ -26,11 +26,6 @@ domains:
server: ru-docker-infra server: ru-docker-infra
purpose: "portainer UI" purpose: "portainer UI"
- host: dify
type: A
server: ru-docker-infra
purpose: "dify через traefik"
- host: n8n - host: n8n
type: A type: A
server: nl-reverse-proxy server: nl-reverse-proxy
+1 -2
View File
@@ -12,7 +12,7 @@ servers:
role: core # основной узел: все ключевые сервисы role: core # основной узел: все ключевые сервисы
env: prod env: prod
location: yandex-cloud location: yandex-cloud
tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, dify, grabcevo] tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, grabcevo]
services: services:
- traefik - traefik
- postgres - postgres
@@ -22,7 +22,6 @@ servers:
- xray # исходящий прокси для n8n - xray # исходящий прокси для n8n
- gitea - gitea
- portainer - portainer
- dify # LLM-app платформа (api/worker/web/plugin-daemon/sandbox/ssrf-proxy/weaviate)
- grabcevo # статический лендинг «База Грабцево» (nginx, база-грабцево.рф) - grabcevo # статический лендинг «База Грабцево» (nginx, база-грабцево.рф)
managed: true managed: true
-21
View File
@@ -22,27 +22,6 @@ REDIS_PASSWORD=31hjsbj34rjs
# Сгенерируй: openssl rand -hex 32 # Сгенерируй: openssl rand -hex 32
N8N_ENCRYPTION_KEY=fbac490fbf63b779fb5f3d90a2fe5445164aaacef1506b02f3f4331c23c2ba59 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 (лендинг «База Грабцево») --- # --- Grabcevo (лендинг «База Грабцево») ---
# Кириллический домен база-грабцево.рф в punycode-форме (traefik/ACME работают с ней). # Кириллический домен база-грабцево.рф в punycode-форме (traefik/ACME работают с ней).
GRABCEVO_HOST=xn----7sbabbehfuo8fta4f.xn--p1ai GRABCEVO_HOST=xn----7sbabbehfuo8fta4f.xn--p1ai
@@ -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
-234
View File
@@ -11,10 +11,6 @@ volumes:
redis_data: redis_data:
portainer_data: portainer_data:
gitea_data: gitea_data:
dify_api_storage:
dify_plugin_storage:
dify_weaviate_data:
dify_sandbox_deps:
services: services:
traefik: traefik:
@@ -217,216 +213,6 @@ services:
- traefik.http.routers.portainer.tls.certresolver=le - traefik.http.routers.portainer.tls.certresolver=le
- traefik.http.services.portainer.loadbalancer.server.port=9000 - traefik.http.services.portainer.loadbalancer.server.port=9000
# --- 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 (статический лендинг «База Грабцево») ----------------------- # --- Grabcevo (статический лендинг «База Грабцево») -----------------------
# Продающий сайт производственно-складского комплекса. Чистая статика # Продающий сайт производственно-складского комплекса. Чистая статика
# (index.html + assets/), отдаётся nginx. Домен — кириллический (IDN), # (index.html + assets/), отдаётся nginx. Домен — кириллический (IDN),
@@ -452,23 +238,3 @@ services:
- traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.replacement=https://$${1} - traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.replacement=https://$${1}
- traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.permanent=true - traefik.http.middlewares.grabcevo-wwwredirect.redirectregex.permanent=true
- traefik.http.services.grabcevo.loadbalancer.server.port=80 - 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
@@ -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