Docker Compose实战:一键部署n8n工作流平台
1402 字
7 分钟
Docker Compose实战:一键部署n8n工作流平台
为什么需要Docker Compose?
单个容器用docker run很方便,但实际应用往往需要多个容器协同工作。比如一个完整的Web应用通常包含:
- 前端 - React/Vue应用
- 后端 - Node.js/Python API
- 数据库 - MySQL/PostgreSQL
- 缓存 - Redis
- 反向代理 - Nginx
如果用docker run一个一个启动,命令会非常冗长,而且容易出错。
Docker Compose 用一个YAML文件定义多个容器,一条命令启动全部服务,极大简化了多容器应用的部署。
核心概念
docker-compose.yml结构
version: '3.8' # Compose文件版本
services: # 定义服务(容器) service1: image: nginx:alpine ports: - "8080:80"
service2: image: postgres:14 environment: POSTGRES_PASSWORD: example volumes: - db_data:/var/lib/postgresql/data
volumes: # 定义数据卷 db_data:
networks: # 定义网络 default:核心命令
# 启动所有服务(后台运行)docker-compose up -d
# 查看服务状态docker-compose ps
# 查看日志docker-compose logs -f
# 停止所有服务docker-compose stop
# 删除所有服务(删除容器)docker-compose down
# 重启服务docker-compose restart
# 重新构建镜像docker-compose build实战:部署完整n8n工作流平台
场景描述
n8n是一个强大的工作流自动化工具,类似开源版的Zapier。完整部署需要:
- n8n主服务 - 工作流引擎
- PostgreSQL - 数据存储(比默认SQLite更适合生产)
- Redis - 队列和缓存
- Nginx - 反向代理和SSL
项目目录结构
mkdir -p n8n-docker/{nginx,data}cd n8n-docker
tree ..├── docker-compose.yml├── .env└── nginx └── nginx.conf1. 创建环境变量文件
cat > .env << 'EOF'# n8n配置N8N_HOST=your-domain.comN8N_PORT=5678N8N_PROTOCOL=httpsN8N_PATH=/
# 时区GENERIC_TIMEZONE=Asia/ShanghaiTZ=Asia/Shanghai
# 数据库配置POSTGRES_DB=n8nPOSTGRES_USER=n8nPOSTGRES_PASSWORD=your_strong_password_here
# Redis配置REDIS_PASSWORD=your_redis_password_hereEOF⚠️ 安全提示: 生产环境务必修改密码!
2. 创建Nginx配置
cat > nginx/nginx.conf << 'EOF'events { worker_connections 1024;}
http { upstream n8n { server n8n:5678; }
server { listen 80; server_name _;
location / { proxy_pass http://n8n; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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; } }}EOF3. 创建docker-compose.yml
cat > docker-compose.yml << 'EOF'version: '3.8'
services: # PostgreSQL数据库 postgres: image: postgres:14-alpine container_name: n8n-postgres restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data networks: - n8n-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5
# Redis缓存 redis: image: redis:7-alpine container_name: n8n-redis restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - redis_data:/data networks: - n8n-network healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 3s retries: 5
# n8n主服务 n8n: image: n8nio/n8n:latest container_name: n8n restart: unless-stopped ports: - "${N8N_PORT}:5678" environment: - N8N_HOST=${N8N_HOST} - N8N_PORT=5678 - N8N_PROTOCOL=${N8N_PROTOCOL} - N8N_PATH=${N8N_PATH} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${TZ}
# 数据库配置 - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
# Redis配置(队列模式) - QUEUE_BULL_REDIS_HOST=redis - QUEUE_BULL_REDIS_PORT=6379 - QUEUE_BULL_REDIS_PASSWORD=${REDIS_PASSWORD}
# 执行模式(队列+web) - EXECUTIONS_MODE=queue - QUEUE_BULL_REDIS_DB=0
# Webhook配置 - WEBHOOK_URL=https://${N8N_HOST}/ volumes: - n8n_data:/home/node/.n8n - /var/run/docker.sock:/var/run/docker.sock # 允许执行Docker命令 depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - n8n-network
# Nginx反向代理 nginx: image: nginx:alpine container_name: n8n-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro # SSL证书(如果有的话) depends_on: - n8n networks: - n8n-network
volumes: postgres_data: driver: local redis_data: driver: local n8n_data: driver: local
networks: n8n-network: driver: bridgeEOF4. 启动服务
# 启动所有服务docker-compose up -d
# 查看启动日志docker-compose logs -f
# 检查服务状态docker-compose ps5. 验证部署
访问 http://your-server-ip:5678,你应该能看到n8n的登录界面。
首次访问会要求创建管理员账户。
6. 查看服务状态
# 查看所有服务docker-compose ps
# 查看n8n日志docker-compose logs -f n8n
# 查看数据库日志docker-compose logs -f postgres
# 进入n8n容器docker-compose exec n8n sh高级技巧
1. 扩展功能:添加SSL证书
如果你有域名和SSL证书,修改nginx配置启用HTTPS:
# 将证书放到nginx目录mkdir nginx/sslcp /path/to/fullchain.pem nginx/ssl/cp /path/to/privkey.pem nginx/ssl/
# 修改nginx.conf添加SSL配置# (需要手动编辑nginx配置文件)2. 添加备份服务
# 在docker-compose.yml中添加 backup: image: postgres:14-alpine container_name: n8n-backup volumes: - ./backups:/backups depends_on: - postgres networks: - n8n-network command: > sh -c " while true; do pg_dump -h postgres -U ${POSTGRES_USER} ${POSTGRES_DB} > /backups/n8n_backup_$$(date +%Y%m%d_%H%M%S).sql echo 'Backup completed at $$(date)' sleep 86400 done "3. 监控和日志管理
# 安装Portainer(Docker可视化管理工具)docker run -d \ --name portainer \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest访问 http://your-server-ip:9000 即可看到所有容器的运行状态。
故障排查
服务无法启动
# 查看详细日志docker-compose logs service-name
# 检查端口占用sudo netstat -tulpn | grep :5678
# 检查磁盘空间df -h数据库连接失败
# 检查数据库是否就绪docker-compose exec postgres pg_isready -U n8n
# 进入数据库容器docker-compose exec postgres psql -U n8n -d n8n性能优化
# 在docker-compose.yml中添加资源限制services: n8n: deploy: resources: limits: cpus: '2.0' memory: 2G reservations: cpus: '1.0' memory: 1G实战场景扩展
场景1:添加监控服务
grafana: image: grafana/grafana:latest container_name: n8n-grafana restart: unless-stopped ports: - "3001:3000" volumes: - grafana_data:/var/lib/grafana networks: - n8n-network场景2:添加邮件服务
mailhog: image: mailhog/mailhog:latest container_name: n8n-mailhog restart: unless-stopped ports: - "1025:1025" # SMTP - "8025:8025" # Web UI networks: - n8n-network总结
通过Docker Compose,我们用一个YAML文件定义了完整的n8n工作流平台,包括:
- ✅ PostgreSQL数据库
- ✅ Redis队列和缓存
- ✅ n8n主服务
- ✅ Nginx反向代理
- ✅ 数据持久化
- ✅ 自动重启
- ✅ 健康检查
一条命令启动全部服务:
docker-compose up -d一条命令停止全部服务:
docker-compose down这就是Docker Compose的威力:声明式、可重复、易管理。
下一步学习:
- Docker网络深入理解
- 数据备份和恢复策略
- 容器监控和日志管理
- CI/CD集成
实战建议: 尝试用Compose部署你的第一个多容器应用,比如WordPress+MySQL+Nginx,感受一下编排带来的便利!
系列文章:
- Docker快速入门:5分钟搭建你的第一个容器
- Docker Compose实战:一键部署n8n工作流平台(本文)
- Docker网络完全指南:从bridge到macvlan
- Docker数据持久化:volume vs bind mount实战
- Docker安全加固:给容器加把锁
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Docker Compose实战:一键部署n8n工作流平台
https://doc.ebeb.fun/posts/docker-compose-practice/ 相关文章 智能推荐
1
摸鱼神器!一键部署最"忙"Docker项目
AI应用工具 兄弟们有没有这样的经历?老板走过工位时手忙脚乱切窗口,茶水间遇到领导查岗疯狂敲键盘,同事聚餐时假装在debug...今天二冰给大伙儿安利一款装忙神器genact,让你的电脑永远处在"看起来很忙"状态!
2
Docker神器!一键自建导航+网盘+短链全能平台
信息聚合 兄弟们,二冰今天要给大家安利一个能替代5个工具的Docker神器——UniBoard!这玩意儿直接把个人主页、导航页、云笔记、短链服务和文件分享整合到一个平台!
3
Docker容器更新不再错过!RSS订阅神器一键部署攻略
资源监控 兄弟们,你的Docker容器还在手动检查更新吗?身为搞机老司机,二冰每天要管理几十个Docker容器。最头疼的就是镜像更新提示总是后知后觉,直到发现了这个docker-rss神器!
4
Docker一键部署!打造你的私人知识库神器
笔记知识库 兄弟们,还在为碎片化知识管理发愁?今天二冰带来一款本地优先、支持双向链接的知识管理神器——思源笔记!程序员、知识工作者必看,手把手教你用Docker三分钟搭建私有知识库!
5
Docker神器!一键搭建私人文件保险库Chibisafe
存储方案 兄弟们有没有遇到过这样的场景?手机里的照片快撑爆存储空间,想找个私人图床存放;工作文档需要在多设备同步,但总担心网盘泄露隐私...
随机文章 随机推荐