راه‌اندازی n۸n + PostgreSQL + Ollama با Docker Compose

راه‌اندازی n8n + PostgreSQL + Ollama با Docker Compose

جدول محتوا 👇

اگر قرار است n8n در محیط عملیاتی کار کند و به مدل‌های هوش مصنوعی محلی هم وصل شود، اجرای یک کانتینر ساده کافی نیست. در این راهنما با Docker Compose یک استک کامل و قابل نگهداری می‌سازیم: n8n با پایگاه داده PostgreSQL، سرویس Ollama برای اجرای LLM، رمزها در فایل جداگانه، دسترسی امن از طریق HTTPS و بکاپ خودکار.

معماری استک

این استک از چهار سرویس تشکیل شده است:

  • PostgreSQL: نگهداری ورک‌فلوها، Credentialهای رمزنگاری‌شده و تاریخچه اجرا. برای حجم بالا پایدارتر از SQLite پیش‌فرض است.
  • n8n: موتور اتوماسیون و رابط کاربری.
  • Ollama: اجرای مدل‌های زبانی به‌صورت محلی؛ اگر با Ollama آشنا نیستید، مقاله Ollama چیست را بخوانید.
  • Caddy: Reverse Proxy که گواهی SSL را خودکار از Let’s Encrypt می‌گیرد و تمدید می‌کند.

همه سرویس‌ها در یک شبکه داخلی Docker هستند و فقط Caddy روی پورت‌های ۸۰ و ۴۴۳ در دسترس اینترنت است. Ollama و PostgreSQL هیچ پورتی به بیرون باز نمی‌کنند.

پیش‌نیازها

  • یک سرور Ubuntu ۲۲.۰۴ یا ۲۴.۰۴. برای مدل‌های ۷ تا ۸ میلیاردی روی CPU حداقل ۴ هسته و ۱۶ گیگابایت RAM لازم است؛ برای سرعت مناسب، سرور GPU توصیه می‌شود. جزئیات منابع را در منابع مورد نیاز n8n ببینید.
  • Docker Engine و پلاگین Docker Compose نصب‌شده.
  • یک ساب‌دامنه (مثلاً n8n.example.com) که رکورد A آن به IP سرور اشاره کند.
  • تنظیمات امنیتی اولیه سرور انجام شده باشد.

فایل متغیرها (.env)

رمزها را هرگز مستقیم در فایل Compose ننویسید. یک پوشه بسازید و فایل .env را با مقادیر تصادفی ایجاد کنید:

mkdir -p ~/n8n-stack && cd ~/n8n-stack
cat > .env <<EOF
DOMAIN=n8n.example.com
POSTGRES_PASSWORD=$(openssl rand -hex 24)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
TZ=Asia/Tehran
EOF
chmod 600 .env

از N8N_ENCRYPTION_KEY حتماً نسخه پشتیبان امن نگه دارید. همه Credentialها با این کلید رمزنگاری می‌شوند و بدون آن، بکاپ دیتابیس هم قابل استفاده نیست.

فایل docker-compose.yml

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  ollama:
    image: ollama/ollama:latest
    restart: unless-stopped
    environment:
      OLLAMA_KEEP_ALIVE: 24h
    volumes:
      - ollama_data:/root/.ollama

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${DOMAIN}
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://${DOMAIN}/
      GENERIC_TIMEZONE: ${TZ}
      TZ: ${TZ}
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 336
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    command: caddy reverse-proxy --from ${DOMAIN} --to n8n:5678
    volumes:
      - caddy_data:/data

volumes:
  postgres_data:
  ollama_data:
  n8n_data:
  caddy_data:

چند نکته درباره این فایل:

  • سرویس n8n هیچ پورتی منتشر نمی‌کند و فقط از طریق Caddy در دسترس است.
  • WEBHOOK_URL باعث می‌شود آدرس Webhookها با دامنه و HTTPS ساخته شوند، نه با localhost.
  • تنظیمات EXECUTIONS_DATA_PRUNE تاریخچه اجراهای قدیمی‌تر از ۱۴ روز (۳۳۶ ساعت) را پاک می‌کند تا دیتابیس بی‌رویه بزرگ نشود.
  • depends_on با شرط service_healthy صبر می‌کند تا PostgreSQL واقعاً آماده شود.

دسترسی امن با HTTPS

Caddy به‌محض اجرا، برای دامنه شما گواهی SSL می‌گیرد. برای این کار پورت‌های ۸۰ و ۴۴۳ باید در فایروال سرور باز باشند و رکورد DNS درست تنظیم شده باشد. اگر از قبل Nginx روی سرور دارید، می‌توانید سرویس Caddy را حذف کنید و n8n را پشت همان Nginx قرار دهید؛ در این حالت پورت n8n را فقط روی 127.0.0.1:5678 منتشر کنید تا از اینترنت مستقیم در دسترس نباشد.

اجرا و دانلود مدل

docker compose up -d
docker compose ps
docker compose exec ollama ollama pull qwen2.5:7b

حالا آدرس https://n8n.example.com را باز کنید و حساب مدیر (Owner) را بسازید. تا این حساب ساخته نشده، هر کسی که آدرس را باز کند می‌تواند مدیر شود؛ پس این مرحله را بلافاصله انجام دهید.

اتصال n8n به Ollama

در n8n یک Credential از نوع Ollama بسازید و آدرس را http://ollama:11434 وارد کنید. چون هر دو سرویس در یک شبکه Docker هستند، نام سرویس به‌عنوان نام میزبان کار می‌کند. سپس در ورک‌فلو از نود AI Agent یا Basic LLM Chain استفاده کنید و مدل Ollama Chat Model را به آن متصل کنید. یک نمونه کامل را در ساخت AI Agent با n8n و Ollama ساخته‌ایم.

استفاده از GPU

اگر سرور کارت NVIDIA دارد، ابتدا درایور و NVIDIA Container Toolkit را نصب کنید، سپس این بخش را به سرویس ollama اضافه کنید:

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

بعد از docker compose up -d، با docker compose exec ollama ollama ps بررسی کنید که مدل روی GPU بارگذاری شده است.

بکاپ و به‌روزرسانی

بکاپ روزانه دیتابیس با یک دستور ساده:

docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backup-$(date +%F).sql.gz

این دستور را در cron قرار دهید و فایل‌ها را به یک مکان خارج از سرور منتقل کنید؛ نسخه‌ای که روی همان سرور بماند، در خرابی دیسک کمکی نمی‌کند. برای اصول بکاپ‌گیری، مقاله بکاپ سرور چیست را ببینید.

برای به‌روزرسانی، اول بکاپ بگیرید و سپس:

docker compose pull
docker compose up -d

در محیط عملیاتی بهتر است به‌جای latest شماره نسخه مشخص n8n را بنویسید و آگاهانه ارتقا دهید.

رفع مشکلات رایج

  • n8n بالا نمی‌آید: با docker compose logs n8n لاگ را ببینید. خطای اتصال به دیتابیس معمولاً به رمز اشتباه یا تغییر رمز بعد از ساخت اولیه ولوم PostgreSQL برمی‌گردد.
  • گواهی SSL صادر نمی‌شود: رکورد DNS و باز بودن پورت ۸۰ را بررسی کنید.
  • پاسخ مدل خیلی کند است: مدل روی CPU اجرا می‌شود یا در RAM جا نشده است. مدل کوچک‌تر یا GPU را امتحان کنید.
  • خطای Credentials could not be decrypted: کلید رمزنگاری با کلیدی که داده‌ها با آن ساخته شده‌اند یکی نیست.

سوالات متداول

آیا با حذف کانتینر، ورک‌فلوها پاک می‌شوند؟

خیر. داده‌ها در Named Volumeها ذخیره می‌شوند و با docker compose down حذف نمی‌شوند. فقط دستور docker compose down -v ولوم‌ها را پاک می‌کند؛ از آن پرهیز کنید.

می‌توانم Ollama را روی سرور جداگانه اجرا کنم؟

بله. در این حالت آدرس Ollama را با IP شبکه خصوصی سرور GPU وارد کنید و پورت ۱۱۴۳۴ را فقط برای سرور n8n باز بگذارید.

چرا از SQLite استفاده نکنیم؟

SQLite برای شروع کافی است، اما در حجم اجرای بالا و اجرای همزمان، قفل شدن فایل و رشد حجم مشکل‌ساز می‌شود. PostgreSQL پایدارتر است و بکاپ‌گیری و مهاجرت با آن ساده‌تر است.

آیا می‌توانم از مدل‌های OpenAI هم در کنار Ollama استفاده کنم؟

بله. n8n همزمان از چند ارائه‌دهنده پشتیبانی می‌کند و می‌توانید برای هر نود مدل متفاوتی انتخاب کنید.

زیرساخت آماده برای اتوماسیون هوشمند

این استک را روی سرورهای مجازی تراست هاست یا برای اجرای سریع مدل‌ها روی سرورهای GPU راه‌اندازی کنید.

ریورس پروکسی Nginx؛ ۶ گام کانفیگ حرفه‌ای همراه با Let’s Encrypt و HTTP/۲

مشاوره تراست‌هاست​

با متخصصان و کارشناسان به صورت رایگان!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *