
מדריך: התקנת n8n ב-Production עם Docker, Caddy ועדכונים אוטומטיים
לאחרונה החלטתי להעביר את מערך ה-Workflows שלי ל-n8n בתצורת Self-hosted על גבי Cloud Server. המטרה הייתה פשוטה: להרים סביבת Production מאובטחת, שעובדת עם Custom Domain (HTTPS), ויודעת לתחזק ולעדכן את עצמה באופן אוטומטי בלי שאיאלץ להתחבר לשרת כל שבוע ב-SSH.
במדריך הזה אציג את השלבים המלאים לבניית ארכיטקטורה יציבה ומאובטחת באמצעות Docker Compose, הכוללת את n8n, Caddy (כ-Reverse Proxy), ו-Watchtower לניהול ה-Updates האוטומטיים.
למה Caddy?
כשמריצים Service כמו n8n, אסור לחשוף אותו לאינטרנט דרך HTTP (ובדומיינים מסוג .dev, ה-Browsers אפילו חוסמים את זה מראש באמצעות מדיניות HSTS). Caddy הוא Web Server קליל שמשמש כ-Reverse Proxy. היתרון העצום שלו הוא שהוא מבצע Provision וחידוש של תעודות SSL (מ-Let's Encrypt) באופן אוטומטי לחלוטין, ללא צורך ב-Configuration מסורבל.
שלב 1: הגדרת DNS
לפני שניגשים לשרת, צריך להפנות את הדומיין שלנו אליו. ב-DNS Provider שלכם (למשל Google Cloud DNS, Cloudflare וכו'), צרו רשומת A Record חדשה:
Host/Subdomain:
n8n(או כל שם שתבחרו, למשלn8n.yourdomain.com).Target: ה-Public IP של השרת שלכם (
<YOUR_SERVER_IP>).TTL: 300.
שלב 2: הגדרת Firewall (פתיחת פורטים)
כדי ש-Caddy יוכל לקבל בקשות מבחוץ ולבצע את אתגר האימות של תעודת ה-SSL, עלינו לפתוח את הפורטים הסטנדרטיים: 80 ו-443.
1. ברמת ה-Cloud Provider: אם אתם משתמשים ב-Oracle Cloud, AWS או GCP, היכנסו להגדרות ה-Security List (או Security Groups) והוסיפו Ingress Rules המאפשרים TCP Traffic מ-0.0.0.0/0 לפורטים 80 ו-443.
2. ברמת מערכת ההפעלה (Ubuntu/Linux): שרתים רבים מגיעים עם Firewall פנימי קשוח. כדי לפתוח את הפורטים ברמת ה-iptables, הריצו בטרמינל של השרת:
Bash
sudo iptables -I INPUT 6 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save
שלב 3: יצירת ה-Environment
נתחבר לשרת דרך SSH (אני ממליץ לעבוד עם תוסף Remote-SSH ב-VS Code לנוחות מקסימלית), וניצור Directory ייעודי ל-Stack שלנו:
Bash
mkdir ~/n8n-docker
cd ~/n8n-docker
בתוך התיקייה הזו ניצור שני קבצים: Caddyfile ו-docker-compose.yml.
הקובץ הראשון: Caddyfile
זהו קובץ ה-Config של Caddy. הוא פשוט להפליא. צרו קובץ בשם Caddyfile (שימו לב ל-C גדולה, ללא סיומת) והכניסו לתוכו את הקוד הבא (החליפו את הדומיין בשלכם):
Plaintext
n8n.yourdomain.com {
reverse_proxy n8n:5678
}
הסבר: הקוד אומר ל-Caddy להאזין לבקשות שמגיעות ל-Host הזה, ולבצע Routing פנימה לקונטיינר שנקרא n8n בפורט 5678.
הקובץ השני: docker-compose.yml
כאן הארכיטקטורה מקבלת צורה. צרו קובץ בשם docker-compose.yml והדביקו את התצורה הבאה:
YAML
version: '3.8'
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- n8n
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: always
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
volumes:
- n8n_data:/home/node/.n8n
watchtower:
image: containrrr/watchtower
restart: unless-stopped
environment:
- DOCKER_API_VERSION=1.44
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 604800 --cleanup
volumes:
caddy_data:
caddy_config:
n8n_data:
הערות חשובות על הארכיטקטורה:
אבטחה והסתרת פורטים: שימו לב שה-Service של n8n לא חושף את הפורט שלו החוצה (אין לו בלוק
ports). הדרך היחידה להגיע אליו היא דרך Caddy שמטפל ב-TLS Termination.Environment Variables ב-n8n: ההגדרה של
WEBHOOK_URLקריטית כדי ש-n8n יידע לג'נרט כתובות Webhook תקינות שמתחילות ב-https עבור ה-Workflows שלכם.הטריק של Watchtower: הוספתי את הקונטיינר Watchtower שיבצע Polling פעם בשבוע (604,800 שניות) כדי לבדוק אם יש Image חדש ל-n8n ב-Registry ויבצע Update אוטומטי תוך ניקוי ה-Images הישנים (
--cleanup). טיפ של אלופים: שרתי לינוקס מודרניים מריצים גרסאות חדשות של Docker Engine ה-Watchtower הוא פרויקט שלא מתעדכן בתדירות גבוהה ועלול לקרוס עם השגיאהclient version 1.25 is too old. כדי לעקוף את זה, הוספנו את המשתנהDOCKER_API_VERSION=1.44שמכריח אותו לתקשר עם ה-Docker Daemon בגרסת API נתמכת.
שלב 4: Deployment ובדיקה
כעת, כששני הקבצים מוכנים, כל מה שנותר הוא להריץ את הפקודה שתעשה Deploy לכל ה-Stack:
Bash
docker-compose up -dתנו למערכת דקה או שתיים להתארגן. Caddy יפנה ל-Let's Encrypt כדי להנפיק את התעודה, n8n יאתחל את ה-Database שלו, ו-Watchtower ייכנס לכוננות ברקע.
פתחו דפדפן וגלשו ל-URL שלכם: https://n8n.yourdomain.com. אתם אמורים לראות את מסך ה-Login הראשוני של n8n, מלווה במנעול ירוק ומאובטח בשורת הכתובת.
מילת סיכום על אבטחה
ברגע שתיצרו את משתמש ה-Owner הראשון, ה-Instance יינעל אוטומטית. מכיוון שהמערכת פתוחה לאינטרנט (כדי לאפשר קבלת בקשות מ-3rd Party Services), הקפידו:
לבחור סיסמה חזקה ל-Admin.
להוסיף שכבת Authentication מובנית לכל Webhook Node שאתם חושפים.
בהצלחה באוטומציות!


