Большинство компаний и соло-разработчиков при попытке внедрить искусственный интеллект в бизнес-процессы быстро упираются в две крайности. Первая — коммерческие облачные платформы (OpenAI Assistant API, Make, Zapier), где за каждого пользователя и каждый вызов инструмента списываются валютные платежи, а конфиденциальные клиентские базы отправляются на серверы в США. Вторая крайность — самостоятельная разработка агентных пайплайнов на фреймворках вроде LangChain или LlamaIndex, требующая сотен строк сложного кода на Python, ручной настройки векторных баз и постоянной поддержки инфраструктуры.
Золотой серединой в индустрии стал Dify — зрелый open-source проект (более 140 000 звёзд на GitHub), объединяющий гибкость визуального проектирования бизнес-процессов (Workflow) и промышленную надёжность backend-стека. В этой статье инженеры SysKit.ru разберут архитектуру Dify v1.17.1, подготовят безопасный манифест Docker Compose с изолированной векторной базой Weaviate, демоном плагинов моделей и песочницей кода, подключат локальный сервер инференса Ollama и соберут прикладного ИИ-агента для автоматизации клиентских запросов в Telegram.
Ключевые преимущества self-hosted развертывания Dify
- Визуальный конструктор логики: сборка многоэтапных сценариев с ветвлениями, проверкой условий, циклами и вызовами внешних REST API без написания бэкенда.
- Встроенный RAG-конвейер: автоматический парсинг PDF, DOCX, Markdown, чанкинг, гибридный векторный поиск и повторное ранжирование (Reranking).
- Модульная экосистема плагинов: начиная с линейки Dify 1.x все провайдеры моделей и интеграции управляются изолированным демоном плагинов (Plugin Daemon).
- Безопасная песочница (Dify Sandbox): исполнение пользовательских скриптов Python и JavaScript внутри изолированного микроконтейнера с жесткими ограничениями памяти и сети.
- Локализация данных по 152-ФЗ: база клиентов, история диалогов и корпоративные документы хранятся и обрабатываются строго внутри контура вашего VDS в российском дата-центре, исключая трансграничную передачу данных во внешние зарубежные нейросети.
1. Архитектура Dify и зачем бизнесу свой конструктор ИИ-агентов
Под капотом Dify v1.17 устроен как промышленная микросервисная платформа. В отличие от простых чат-интерфейсов, здесь разделены зоны ответственности между фронтендом, диспетчером задач, демоном плагинов, исполнителем вычислений и векторными хранилищами:
- dify-web (Next.js): интерфейс администратора, визуальный редактор узлов графа (DAG) и встроенные веб-виджеты для встраивания чата на внешние сайты.
- dify-api (Flask/Python): основное ядро, обслуживающее REST API, авторизацию пользователей, маршрутизацию запросов к языковым моделям и оркестрацию агентов.
- dify-worker (Celery): асинхронные воркеры, выполняющие фоновые ресурсоёмкие задачи: парсинг больших документов, сегментацию текста, расчёт векторных эмбеддингов и вызовы внешних вебхуков.
- plugin_daemon (Dify Plugin Server): выделенный сервис экосистемы Dify 1.x, отвечающий за установку, аутентификацию и запуск плагинов провайдеров моделей (Ollama, GigaChat, OpenAI и внешние коннекторы).
- Weaviate: специализированная векторная база данных, обеспечивающая поиск по смыслу документов с минимальной задержкой.
- dify-sandbox: защищенный микросервис выполнения произвольного кода, исключающий атаки типа Remote Code Execution на хостовую ОС.
- SSRF Proxy (Squid): проксирующий шлюз, блокирующий попытки сгенерированного ИИ кода сканировать внутреннюю локальную сеть сервера (защита от Server-Side Request Forgery).
Такая архитектура позволяет малому бизнесу развернуть функционал enterprise-уровня на собственном VDS без абонентской платы за операторов и с нулевой зависимостью от зарубежных облачных провайдеров.
2. Системные требования и подбор конфигурации VDS
Нагрузка на сервер зависит от того, где происходит генерация ответов — через внешние API (OpenAI, Claude, GigaChat, YandexGPT) или на локальной модели через Ollama. Учитывайте, что сам базовый стек Dify (включая Weaviate, Redis, PostgreSQL, Celery и Plugin Daemon) потребляет в режиме ожидания около 3.5–4.5 ГБ RAM, а операционная система требует еще около 1 ГБ:
| Сценарий использования | Минимум CPU | Минимум RAM | Диск (NVMe) | Рекомендуемый VDS |
|---|---|---|---|---|
| Dify + внешние API (RAG по документам, оркестрация) | 2–4 vCPU | 6–8 ГБ RAM | 40 ГБ NVMe | Базовый тариф Timeweb Cloud / Selectel / Beget (~900–1200 ₽/мес) |
| Dify + легкая Ollama (компактные модели 1.5B–3B) | 4 vCPU | 8–10 ГБ RAM | 60 ГБ NVMe | Оптимальный тариф для небольших проектов (~1400–1800 ₽/мес) |
| Dify + стандартная Ollama (модели 7B–8B, Qwen 2.5 в Q4) | 4–8 vCPU | 16 ГБ RAM | 100 ГБ NVMe | Производительный VDS со скоростными ядрами (~2400–3500 ₽/мес) |
| Высокая нагрузка (команда 15+ чел, тяжелые документы) | 8–16 vCPU | 32 ГБ RAM | 150 ГБ NVMe | Выделенный VDS или сервер с GPU-ускорением |
Для локального инференса моделей 7B–8B на CPU (веса модели занимают около 4.5–5 ГБ RAM плюс контекстное окно KV-кэша) конфигурация с 16 ГБ RAM является практическим минимумом, гарантирующим работу без вытеснения процессов в Swap и зависаний.
Если вы планируете запускать инференс локальных моделей на CPU, критически важно настроить файл подкачки (Swap) объёмом 4–8 ГБ на случай кратковременных всплесков потребления памяти при индексации многостраничных документов.
3. Подготовка окружения и сетевая изоляция портов
Подключитесь к серверу по SSH под непривилегированным пользователем с правами sudo. Обновите индекс пакетов операционной системы Ubuntu 24.04 LTS и установите Docker Engine с плагином Docker Compose:
# Обновление пакетов и установка базовых системных утилит
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git ufw fail2ban jq
# Установка официального Docker Engine
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Проверка версий
docker --version
docker compose version
Внимание: защита служебных портов стека Dify
По умолчанию Docker добавляет правила в iptables в обход фаервола UFW (подробнее о механике мы писали в статье об обходе UFW в Docker). Стек Dify включает базы данных PostgreSQL (порт 5432), Redis (6379), Weaviate (8080) и песочницу (8194). Ни один из этих портов не должен публиковаться на внешнем IP сервера! В манифесте Compose мы публикуем наружу исключительно локальный порт обратного прокси Nginx (127.0.0.1:8000), прикрывая его защищенным HTTPS.
После запуска проверьте отсутствие открытых портов баз данных с помощью утилиты Сканер портов онлайн.
Настройте базовый сетевой экран UFW, оставив открытыми только порты SSH и стандартные веб-протоколы:
# Базовая настройка межсетевого экрана
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP Nginx'
sudo ufw allow 443/tcp comment 'HTTPS Nginx'
sudo ufw enable
4. Развертывание Dify v1.17.1: манифест и переменные .env
Создайте изолированную директорию для стека Dify и необходимые каталоги хранения постоянных данных (volumes):
# Создание каталогов проекта
sudo mkdir -p /opt/dify/{data/postgres,data/redis,data/weaviate,storage,nginx,volumes/plugin_daemon,volumes/ssrf_proxy,volumes/db}
cd /opt/dify
# Создание SQL-скрипта инициализации отдельной БД для демона плагинов
cat << 'EOF' > volumes/db/init.sql
CREATE DATABASE dify_plugin;
EOF
# Конфигурация шлюза безопасности SSRF (Squid) с фильтрацией целевых подсетей (dst-based ACL)
cat << 'EOF' > volumes/ssrf_proxy/squid.conf
http_port 3128
# Разрешенные порты для внешних подключений
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 1025-65535
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
# Определение внутренних подсетей назначения (защита от SSRF по RFC 1918)
acl private_dst dst 10.0.0.0/8
acl private_dst dst 172.16.0.0/12
acl private_dst dst 192.168.0.0/16
acl private_dst dst 127.0.0.0/8
acl private_dst dst 169.254.0.0/16
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
# Белый список: разрешаем доступ к доверенному Docker-мосту (локальная Ollama: 172.17.0.0/16)
acl allowed_private dst 172.17.0.0/16
http_access allow allowed_private
# Блокировка попыток сгенерированного кода сканировать остальные адреса хоста и локальной сети
http_access deny to_localhost
http_access deny private_dst
# Разрешение исходящих запросов к публичным API интернета
http_access allow all
EOF
Сгенерируйте случайные ключи и пароли командой openssl rand -hex 16 или через Генератор стойких паролей SysKit:
Обязательно смените стандартные токены и пароли!
Категорически запрещено оставлять шаблонные значения change_this_* в боевом окружении. Все пароли и секретные ключи должны быть уникальными случайными строками.
Создайте конфигурационный файл .env в директории /opt/dify:
# Версии и доменные имена
DIFY_VERSION=1.17.1
DOMAIN=ai.yourdomain.ru
APP_WEB_URL=https://ai.yourdomain.ru
CONSOLE_API_URL=https://ai.yourdomain.ru
# Безопасность и мастер-ключ сессий (минимум 32 символа)
SECRET_KEY=change_this_to_generated_secret_key_minimum_32_chars
# Параметры СУБД PostgreSQL
DB_USERNAME=dify_user
DB_PASSWORD=change_this_to_strong_db_password
DB_DATABASE=dify_db
DB_HOST=db
DB_PORT=5432
DB_PLUGIN_DATABASE=dify_plugin
# Параметры кэширования и брокера задач Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=change_this_to_strong_redis_password
# Векторное хранилище (Weaviate по умолчанию)
VECTOR_STORE=weaviate
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=change_this_to_strong_weaviate_api_key
# Демон управления плагинами моделей (Dify 1.x Plugin Server)
PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_KEY=change_this_to_strong_plugin_daemon_key
PLUGIN_DIFY_INNER_API_KEY=change_this_to_strong_inner_api_key
# Песочница выполнения кода (Sandbox)
CODE_EXECUTION_ENDPOINT=http://sandbox:8194
CODE_EXECUTION_API_KEY=change_this_to_strong_sandbox_key
# Защита от SSRF (шлюз Squid)
# Белый список доверенных внутренних адресов (Ollama) настраивается правилами в squid.conf
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128
# Лимиты загрузки файлов и индексации
UPLOAD_FILE_SIZE_LIMIT=50M
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000
FILES_ACCESS_TYPE=local
Создайте манифест docker-compose.yml. В нём объединены все базовые компоненты платформы с ограничением потребления памяти (mem_limit), гарантирующим стабильность хоста при пиковых нагрузках:
services:
# Основной сервер API (Python/Flask)
api:
image: langgenius/dify-api:1.17.1
container_name: dify-api
restart: unless-stopped
env_file: .env
environment:
MODE: api
PLUGIN_DAEMON_URL: http://plugin_daemon:5002
PLUGIN_DAEMON_KEY: ${PLUGIN_DAEMON_KEY}
INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY}
volumes:
- ./storage:/app/api/storage
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
weaviate:
condition: service_started
sandbox:
condition: service_started
ssrf_proxy:
condition: service_started
plugin_daemon:
condition: service_started
networks:
- dify-network
mem_limit: 2048m
# Демон экосистемы плагинов провайдеров моделей (Dify 1.x)
plugin_daemon:
image: langgenius/dify-plugin-daemon:0.6.10-local
container_name: dify-plugin-daemon
restart: unless-stopped
environment:
DB_HOST: db
DB_PORT: 5432
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${DB_PLUGIN_DATABASE}
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
REDIS_USE_SSL: 'false'
SERVER_PORT: 5002
SERVER_KEY: ${PLUGIN_DAEMON_KEY}
DIFY_INNER_API_URL: http://api:5001
DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY}
PLUGIN_WORKING_PATH: /app/storage/cwd
PLUGIN_STORAGE_LOCAL_ROOT: /app/storage
MIGRATION_ENABLED: 'true'
volumes:
- ./volumes/plugin_daemon:/app/storage
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- dify-network
mem_limit: 768m
# Асинхронные воркеры Celery для RAG и тяжелых расчетов
worker:
image: langgenius/dify-api:1.17.1
container_name: dify-worker
restart: unless-stopped
env_file: .env
environment:
MODE: worker
PLUGIN_DAEMON_URL: http://plugin_daemon:5002
PLUGIN_DAEMON_KEY: ${PLUGIN_DAEMON_KEY}
INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY}
volumes:
- ./storage:/app/api/storage
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
weaviate:
condition: service_started
plugin_daemon:
condition: service_started
networks:
- dify-network
mem_limit: 2048m
# Веб-интерфейс и визуальный редактор (Next.js)
web:
image: langgenius/dify-web:1.17.1
container_name: dify-web
restart: unless-stopped
env_file: .env
depends_on:
- api
networks:
- dify-network
mem_limit: 1024m
# Реляционная СУБД PostgreSQL
db:
image: postgres:15-alpine
container_name: dify-db
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE}
volumes:
- ./data/postgres:/var/lib/postgresql/data
- ./volumes/db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dify-network
mem_limit: 1024m
# Брокер очередей и кэш Redis
redis:
image: redis:6-alpine
container_name: dify-redis
restart: unless-stopped
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
volumes:
- ./data/redis:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dify-network
mem_limit: 512m
# Векторная база данных Weaviate
weaviate:
image: cr.weaviate.io/semitechnologies/weaviate:1.39.2
container_name: dify-weaviate
restart: unless-stopped
environment:
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_API_KEY}
AUTHENTICATION_APIKEY_USERS: 'admin@dify.ai'
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
AUTHORIZATION_ADMINLIST_USERS: 'admin@dify.ai'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
QUERY_DEFAULTS_LIMIT: 25
volumes:
- ./data/weaviate:/var/lib/weaviate
networks:
- dify-network
mem_limit: 1536m
# Изолированная песочница исполнения кода
sandbox:
image: langgenius/dify-sandbox:0.2.15
container_name: dify-sandbox
restart: unless-stopped
environment:
API_KEY: ${CODE_EXECUTION_API_KEY}
networks:
- dify-network
mem_limit: 512m
# Проксирование запросов к внешним URL (SSRF Shield)
ssrf_proxy:
image: ubuntu/squid:latest
container_name: dify-ssrf-proxy
restart: unless-stopped
volumes:
- ./volumes/ssrf_proxy/squid.conf:/etc/squid/squid.conf:ro
networks:
- dify-network
mem_limit: 256m
# Внутренний роутер Dify для объединения API и веб-интерфейса
nginx:
image: nginx:latest
container_name: dify-internal-router
restart: unless-stopped
ports:
- "127.0.0.1:8000:80"
volumes:
- ./nginx/router.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- api
- web
networks:
- dify-network
mem_limit: 256m
networks:
dify-network:
driver: bridge
Создайте файл внутреннего маршрутизатора /opt/dify/nginx/router.conf, перенаправляющий запросы интерфейса на сервис web, а эндпоинты /console/api и /api — на сервис api:
server {
listen 80;
server_name _;
client_max_body_size 100M;
# Маршрутизация к бэкенду API
location ~ ^/(console/api|api|v1|files)/ {
proxy_pass http://api:5001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
# Маршрутизация к фронтенду Next.js
location / {
proxy_pass http://web:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Запустите стек командой:
docker compose up -d
docker compose ps
5. Настройка Nginx с SSL и таймаутами для потокового SSE
На хостовой системе настройте Nginx в качестве внешнего обратного прокси с автоматическим получением сертификата Let’s Encrypt.
Критическая тонкость: буферизация потоковых ответов (Server-Sent Events)
Языковые модели отправляют ответ потоком по токенам через протокол Server-Sent Events (SSE). Если в Nginx включена стандартная буферизация или сжатие ответов gzip, веб-сервер будет накапливать ответ в буфере и отдавать пользователю весь текст целиком только после завершения генерации.
Чтобы текст появлялся плавно и моментально, в конфигурации хостового Nginx обязательно укажите: proxy_buffering off;, proxy_cache off;, отключите сжатие потока gzip off; и убедитесь, что включена передача фрагментами chunked_transfer_encoding on;.
Создайте конфигурацию виртуального хоста /etc/nginx/sites-available/dify.conf:
server {
listen 80;
server_name ai.yourdomain.ru;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
http2 on;
server_name ai.yourdomain.ru;
ssl_certificate /etc/letsencrypt/live/ai.yourdomain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.yourdomain.ru/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
# Заголовки проксирования
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Отключение буферизации и сжатия gzip для моментальной отдачи потоковых токенов (SSE)
gzip off;
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
# Длительные таймауты для тяжелых моделей и длинных контекстов
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
Активируйте сайт и выпустите SSL-сертификат с помощью Certbot:
sudo ln -s /etc/nginx/sites-available/dify.conf /etc/nginx/sites-enabled/
sudo certbot --nginx -d ai.yourdomain.ru
sudo nginx -t && sudo systemctl reload nginx
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Мощные NVMe VDS для ИИ
Идеально для стека Dify с локальной Ollama: быстрые ядра 3.3+ ГГц, быстрый NVMe и безлимитный трафик в РФ.
Selectel — Премиум инфраструктура Tier III
Корпоративная надежность с гарантированным аптаймом, защитой от DDoS и возможностью легкого масштабирования RAM и GPU.
Beget — Простой старт с поминутной тарификацией
Удобное управление, мгновенное изменение конфигурации и встроенное резервное копирование для быстрого тестирования стека.
6. Подключение локальной Ollama и отечественных API
После первого входа в панель управления Dify (по адресу https://ai.yourdomain.ru/install) задайте логин и пароль суперадминистратора. В верхнем правом углу перейдите в Настройки (Settings) → Поставщики моделей (Model Providers).
Вариант 1: Локальная Ollama на том же VDS
Если на вашем сервере уже поднят сервис Ollama, Dify может обращаться к нему напрямую. Чтобы контейнеры Dify могли достучаться до Ollama, работающей на хосте или в соседней сети Docker:
- В настройках Dify выберите провайдера Ollama.
- В поле Model Name укажите имя загруженной модели:
qwen2.5:7b(илиllama3.1:8b). - В поле Server URL укажите адрес:
http://host.docker.internal:11434(если вdocker-compose.ymlу контейнераapiдобавленextra_hosts: ["host.docker.internal:host-gateway"]) или внутренний IP сетевого моста Docker (обычноhttp://172.17.0.1:11434). - Аналогично добавьте модель эмбеддингов для RAG:
bge-m3илиnomic-embed-text.
Вариант 2: Отечественные и внешние облачные API
Dify поддерживает работу через OpenAI-совместимый интерфейс. Вы можете подключить отечественные модели GigaChat (через официальный коннектор Dify) или YandexGPT, а также использовать внешние ключи OpenAI / Anthropic через прокси-шлюзы без риска блокировки локальной инфраструктуры.
7. Настройка базы знаний (RAG) и запуск Telegram-бота
Создание базы знаний (Knowledge Base)
Перейдите во вкладку База знаний (Knowledge) → Создать базу знаний:
- Загрузка файлов: перетащите регламенты компании, прайс-листы, каталоги товаров или техническую документацию (поддерживаются PDF, DOCX, TXT, Markdown, CSV).
- Сегментация текста (Chunking): для русского языка оптимален размер сегмента 500–800 токенов с перекрытием (overlap) 10% (50 токенов). Это исключает разрыв фраз и потерю контекста на стыке фрагментов.
- Индексация: выберите гибридный поиск (Hybrid Search) — он объединяет векторное сходство Weaviate и точный поиск по ключевым словам (BM25), обеспечивая максимальную точность даже при редких артикулах товаров.
Сборка визуального сценария (Workflow) и привязка к Telegram
В разделе Студия (Studio) создайте новый Чат-бот (Chatflow / Agent):
- Узел Start: принимает входящий запрос пользователя.
- Узел Knowledge Retrieval: связывается с созданной базой знаний и извлекает топ-3 релевантных фрагмента с порогом сходства от 0.7.
- Узел LLM: формирует ответ на основе найденного контекста с системным промптом: «Ты — старший инженер поддержки. Отвечай строго по предоставленным материалам. Если ответа нет в документах, вежливо предложи связаться с менеджером».
После публикации приложения нажмите Publish → Доступ к API (API Access) и сгенерируйте секретный ключ приложения (вида app-xxxxxxxxxxxxxxxx). Для пересылки сообщений между Telegram Bot API и Dify используйте компактный production-ready мост на Python:
# /opt/dify/telegram_bridge.py
import os, requests, telebot
BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "123456789:AA...")
DIFY_API_URL = "http://127.0.0.1:8000/v1/chat-messages"
DIFY_API_KEY = os.getenv("DIFY_APP_KEY", "app-xxxxxxxxxxxxxxxx")
# Инициализация с многопоточным пулом для параллельной обработки запросов
bot = telebot.TeleBot(BOT_TOKEN, threaded=True, num_threads=8)
@bot.message_handler(func=lambda msg: True)
def handle_message(msg):
# Показываем статус «печатает...» пока идет инференс модели
bot.send_chat_action(msg.chat.id, "typing")
headers = {
"Authorization": f"Bearer {DIFY_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"inputs": {},
"query": msg.text,
"response_mode": "blocking",
"user": f"tg_{msg.from_user.id}"
}
try:
res = requests.post(DIFY_API_URL, json=payload, headers=headers, timeout=90).json()
answer = res.get("answer", "Извините, не удалось сформировать ответ.")
bot.reply_to(msg, answer)
except requests.exceptions.Timeout:
bot.reply_to(msg, "Время ожидания ответа модели истекло. Пожалуйста, повторите запрос.")
except Exception as e:
bot.reply_to(msg, "Временная ошибка сервиса ИИ. Попробуйте позже.")
if __name__ == "__main__":
print("Telegram-мост Dify запущен (многопоточный режим)...")
bot.infinity_polling()
Скрипт можно запустить как службу systemd или связать Dify с сервером автоматизации n8n через стандартный HTTP Request узел.
8. Резервное копирование PostgreSQL и Weaviate в S3
Данные Dify состоят из реляционных метаданных в PostgreSQL (пользователи, сценарии, промпты), векторных индексов Weaviate и загруженных файлов в storage.
Консистентность векторного индекса Weaviate
База Weaviate активно использует структуры LSM (Log-Structured Merge-tree) и файлы mmap. Простое «горячее» копирование каталога через tar на активном сервисе чревато повреждением индексов. В нашем скрипте команда docker stop dify-weaviate отправляет сигнал SIGTERM, корректно сбрасывая буферы WAL и memtable на диск за 10–15 секунд. Для крупных enterprise-баз с миллионами векторов рекомендуется использовать официальный Weaviate Backup API без простоя контейнера, однако для небольших и средних VDS кратковременная ночная остановка является надежным и простым решением.
Создайте автоматический скрипт резервного копирования /opt/dify/backup_dify.sh с выгрузкой архива в защищенное S3-хранилище (Selectel, Timeweb Cloud или VK Cloud):
#!/usr/bin/env bash
set -euo pipefail
# Конфигурация бэкапа
BACKUP_DIR="/var/backups/dify"
DATE=$(date +%Y%m%d_%H%M%S)
ARCHIVE="$BACKUP_DIR/dify_backup_$DATE.tar.gz"
S3_BUCKET="s3://my-company-backups/dify"
KEEP_DAYS=7
mkdir -p "$BACKUP_DIR"
echo "[$(date)] Начало резервного копирования Dify..."
# 1. Дамп баз данных PostgreSQL (основная база Dify + база плагинов dify_plugin)
docker exec dify-db pg_dump -U dify_user -d dify_db | gzip > "$BACKUP_DIR/dify_db_$DATE.sql.gz"
docker exec dify-db pg_dump -U dify_user -d dify_plugin | gzip > "$BACKUP_DIR/dify_plugin_$DATE.sql.gz"
# 2. Остановка Weaviate на 15 секунд для фиксации целостности LSM-индекса
docker stop dify-weaviate
# 3. Архивация файлов хранилища, плагинов и данных Weaviate
tar -czf "$ARCHIVE" -C /opt/dify/data weaviate -C /opt/dify/volumes plugin_daemon -C /opt/dify storage -C "$BACKUP_DIR" "dify_db_$DATE.sql.gz" -C "$BACKUP_DIR" "dify_plugin_$DATE.sql.gz"
# 4. Немедленный перезапуск Weaviate
docker start dify-weaviate
# 5. Отправка в S3 через AWS CLI
aws --endpoint-url https://s3.timeweb.cloud s3 cp "$ARCHIVE" "$S3_BUCKET/"
# 6. Очистка временных файлов и ротация локальных архивов
rm -f "$BACKUP_DIR/dify_db_$DATE.sql.gz" "$BACKUP_DIR/dify_plugin_$DATE.sql.gz"
find "$BACKUP_DIR" -type f -name "dify_backup_*.tar.gz" -mtime +$KEEP_DAYS -delete
echo "[$(date)] Бэкап успешно отправлен в S3: $ARCHIVE"
Сделайте скрипт исполняемым и добавьте ночной запуск в планировщик cron:
chmod +x /opt/dify/backup_dify.sh
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/dify/backup_dify.sh >> /var/log/dify_backup.log 2>&1") | crontab -