From 2acacf50b72726f49938c1f2568f7aeac54765b0 Mon Sep 17 00:00:00 2001 From: maximilion96 Date: Wed, 29 Jul 2026 03:31:15 +0300 Subject: [PATCH] Remove Dify from ru-docker-infra MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Снесены все 7 сервисов (api/worker/web/plugin-daemon/sandbox/ssrf-proxy/ weaviate), их тома, базы dify/dify_plugin и DNS-запись dify.mxti.ru. Co-Authored-By: Claude Opus 5 --- domains.yml | 5 - servers/inventory.yml | 3 +- servers/ru-docker-infra/.env | 21 -- .../dify/ssrf_proxy/squid.conf | 52 ---- servers/ru-docker-infra/docker-compose.yml | 234 ------------------ .../postgres/init/10-dify-databases.sql | 10 - 6 files changed, 1 insertion(+), 324 deletions(-) delete mode 100644 servers/ru-docker-infra/dify/ssrf_proxy/squid.conf delete mode 100644 servers/ru-docker-infra/postgres/init/10-dify-databases.sql diff --git a/domains.yml b/domains.yml index ddf5be0..88f9580 100644 --- a/domains.yml +++ b/domains.yml @@ -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 diff --git a/servers/inventory.yml b/servers/inventory.yml index 2d8c7e5..43c3502 100644 --- a/servers/inventory.yml +++ b/servers/inventory.yml @@ -12,7 +12,7 @@ servers: role: core # основной узел: все ключевые сервисы env: prod location: yandex-cloud - tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, dify, grabcevo] + tags: [traefik, n8n, gitea, postgres, redis, portainer, xray, grabcevo] services: - traefik - postgres @@ -22,7 +22,6 @@ servers: - xray # исходящий прокси для n8n - gitea - portainer - - dify # LLM-app платформа (api/worker/web/plugin-daemon/sandbox/ssrf-proxy/weaviate) - grabcevo # статический лендинг «База Грабцево» (nginx, база-грабцево.рф) managed: true diff --git a/servers/ru-docker-infra/.env b/servers/ru-docker-infra/.env index f30c4cd..55d1487 100644 --- a/servers/ru-docker-infra/.env +++ b/servers/ru-docker-infra/.env @@ -22,27 +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 diff --git a/servers/ru-docker-infra/dify/ssrf_proxy/squid.conf b/servers/ru-docker-infra/dify/ssrf_proxy/squid.conf deleted file mode 100644 index 16f1902..0000000 --- a/servers/ru-docker-infra/dify/ssrf_proxy/squid.conf +++ /dev/null @@ -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 diff --git a/servers/ru-docker-infra/docker-compose.yml b/servers/ru-docker-infra/docker-compose.yml index d5ff9f8..d00779c 100644 --- a/servers/ru-docker-infra/docker-compose.yml +++ b/servers/ru-docker-infra/docker-compose.yml @@ -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,216 +213,6 @@ services: - traefik.http.routers.portainer.tls.certresolver=le - 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 (статический лендинг «База Грабцево») ----------------------- # Продающий сайт производственно-складского комплекса. Чистая статика # (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.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 diff --git a/servers/ru-docker-infra/postgres/init/10-dify-databases.sql b/servers/ru-docker-infra/postgres/init/10-dify-databases.sql deleted file mode 100644 index 1b32ad7..0000000 --- a/servers/ru-docker-infra/postgres/init/10-dify-databases.sql +++ /dev/null @@ -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