ИИ, агенты и автоматизация 15 мин чтения 2026-10-20

Визуальный конструктор ИИ-агентов Dify на VDS в Docker Compose: автоматизация бизнес-процессов, RAG по базам знаний и интеграция с Telegram

Пошаговое руководство по развертыванию Dify v1.17.1 в Docker Compose на VDS: визуальный редактор workflow, векторная база Weaviate, безопасная песочница sandbox, подключение локальной Ollama и интеграция с Telegram.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Большинство компаний и соло-разработчиков при попытке внедрить искусственный интеллект в бизнес-процессы быстро упираются в две крайности. Первая — коммерческие облачные платформы (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 и безлимитный трафик в РФ.

Конфигурация
4 vCPU 3.3 ГГц • 16 ГБ RAM • 120 ГБ NVMe • Трафик без лимита
Премиум Tier III
🔷

Selectel — Премиум инфраструктура Tier III

Корпоративная надежность с гарантированным аптаймом, защитой от DDoS и возможностью легкого масштабирования RAM и GPU.

Конфигурация
4 vCPU • 16 ГБ RAM • 100 ГБ NVMe • Дата-центры РФ Tier III
Простота и гибкость
🟠

Beget — Простой старт с поминутной тарификацией

Удобное управление, мгновенное изменение конфигурации и встроенное резервное копирование для быстрого тестирования стека.

Конфигурация
4 vCPU 3.4 ГГц • 8 ГБ RAM • 70 ГБ NVMe • Выделенный IPv4

6. Подключение локальной Ollama и отечественных API

После первого входа в панель управления Dify (по адресу https://ai.yourdomain.ru/install) задайте логин и пароль суперадминистратора. В верхнем правом углу перейдите в Настройки (Settings) → Поставщики моделей (Model Providers).

Вариант 1: Локальная Ollama на том же VDS

Если на вашем сервере уже поднят сервис Ollama, Dify может обращаться к нему напрямую. Чтобы контейнеры Dify могли достучаться до Ollama, работающей на хосте или в соседней сети Docker:

  1. В настройках Dify выберите провайдера Ollama.
  2. В поле Model Name укажите имя загруженной модели: qwen2.5:7b (или llama3.1:8b).
  3. В поле 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).
  4. Аналогично добавьте модель эмбеддингов для RAG: bge-m3 или nomic-embed-text.

Вариант 2: Отечественные и внешние облачные API

Dify поддерживает работу через OpenAI-совместимый интерфейс. Вы можете подключить отечественные модели GigaChat (через официальный коннектор Dify) или YandexGPT, а также использовать внешние ключи OpenAI / Anthropic через прокси-шлюзы без риска блокировки локальной инфраструктуры.

7. Настройка базы знаний (RAG) и запуск Telegram-бота

Создание базы знаний (Knowledge Base)

Перейдите во вкладку База знаний (Knowledge) → Создать базу знаний:

  1. Загрузка файлов: перетащите регламенты компании, прайс-листы, каталоги товаров или техническую документацию (поддерживаются PDF, DOCX, TXT, Markdown, CSV).
  2. Сегментация текста (Chunking): для русского языка оптимален размер сегмента 500–800 токенов с перекрытием (overlap) 10% (50 токенов). Это исключает разрыв фраз и потерю контекста на стыке фрагментов.
  3. Индексация: выберите гибридный поиск (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 -

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Dify выдает ошибку «SSRF: Request to private IP is not allowed» при подключении к локальной Ollama. Как настроить доступ?
Встроенный защитный прокси ssrf_proxy на базе Squid блокирует запросы ядра Dify к внутренним подсетям назначения (dst: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8), предотвращая SSRF-атаки сгенерированного ИИ кода на локальную инфраструктуру сервера. Чтобы открыть доступ к локальной Ollama (например, на шлюзе Docker-моста 172.17.0.1), добавьте разрешающее правило в файл volumes/ssrf_proxy/squid.conf перед блокирующими директивами: acl allowed_private dst 172.17.0.0/16 и http_access allow allowed_private. Затем примените конфигурацию: docker compose restart ssrf_proxy.
Генерация длинного ответа обрывается с ошибкой «504 Gateway Timeout». Где кроется причина?
При обработке сложных промптов на CPU инференс модели 7B–8B может занимать от 30 до 90 секунд. Если в Nginx не увеличен таймаут ожидания ответа от бэкенда, обратный прокси сбрасывает соединение. Убедитесь, что в хостовом Nginx и во внутреннем маршрутизаторе прописаны директивы proxy_read_timeout 3600s; и proxy_send_timeout 3600s;, а буферизация отключена через proxy_buffering off;.
Сколько оперативной памяти требуется серверу для стабильной работы Dify?
Сам микросервисный стек Dify (PostgreSQL, Redis, Weaviate, Sandbox, Plugin Daemon, API, Worker, Nginx) в состоянии покоя потребляет порядка 3.5–4.5 ГБ RAM. Чистый минимум для работы с внешними облачными API (GigaChat, DeepSeek, OpenAI) составляет 8 ГБ RAM. Если вы планируете запускать локальную модель Ollama на этом же VDS: компактная модель 3B потребует дополнительно ~3 ГБ RAM (VDS от 10–12 ГБ), а популярные модели класса 7B/8B в 4-битном квантовании (Q4_K_M) занимают 4.5–5.5 ГБ RAM плюс буфер контекста. Для комфортной работы связки «Dify + Ollama 7B» без риска OOM-сбоев необходим сервер с 16 ГБ RAM и активным разделом Swap.
Как правильно обновить Dify на новую версию без потери данных?
Обновление Dify 1.x требует внимания, поскольку мажорные и минорные релизы LangGenius периодически вводят новые микросервисы (как plugin_daemon в 1.0 или agent_backend в 1.16). Кроме того, в релизе 1.17.1 встроенный Weaviate был обновлен с ветки 1.27.0 до 1.39.2: для чистой установки это прозрачно, но при миграции старых баз существующего инстанса требуется поэтапный переход Weaviate согласно официальным Release Notes. Порядок действий: 1) Запустите скрипт резервного копирования backup_dify.sh для создания снапшота обеих баз PostgreSQL, тома Weaviate и хранилища; 2) Сверьте ваш docker-compose.yml с официальным шаблоном свежего релиза на GitHub, чтобы добавить недостающие сервисы и переменные; 3) Измените теги версий образов и запустите docker compose pull && docker compose up -d. Миграции схемы PostgreSQL контейнер api применит автоматически на этапе старта.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи