GitLab 16.5.10 Docker Compose 企业级部署实战SMTP邮件与Nginx反向代理全解析1. 为什么选择Docker Compose部署GitLab在容器化技术普及的今天传统的手动安装方式已逐渐被Docker部署所取代。相比原始的docker run命令Docker Compose提供了更优雅的解决方案声明式配置所有服务参数集中在一个YAML文件中版本控制友好环境隔离避免与宿主机环境产生冲突特别是端口和依赖项快速重建单条命令即可完成环境重建适合开发测试和生产环境资源可控精确配置CPU、内存等资源限制避免GitLab吃光服务器资源对于企业级部署我们还需要解决两个核心问题邮件通知系统用户注册、密码重置等关键操作依赖邮件服务Nginx反向代理当服务器已有Web服务时80/443端口冲突的优雅解决方案# 验证Docker环境是否就绪 docker --version docker-compose --version # 应输出类似Docker version 20.10.17 和 docker-compose version 1.29.22. 完整Docker Compose部署方案2.1 基础环境准备首先创建必要的目录结构确保数据持久化mkdir -p /srv/gitlab/{config,logs,data} chmod 777 -R /srv/gitlab # 确保容器有写入权限2.2 docker-compose.yml 核心配置version: 3.6 services: gitlab: image: gitlab/gitlab-ce:16.5.10-ce.0 container_name: gitlab restart: always hostname: gitlab.yourdomain.com environment: GITLAB_OMNIBUS_CONFIG: | external_url https://gitlab.yourdomain.com # SMTP配置将在后续章节添加 # Nginx配置将在后续章节添加 ports: - 2222:22 # SSH端口映射 - 5000:80 # HTTP临时端口 - 5443:443 # HTTPS临时端口 volumes: - /srv/gitlab/config:/etc/gitlab - /srv/gitlab/logs:/var/log/gitlab - /srv/gitlab/data:/var/opt/gitlab shm_size: 256m networks: - gitlab-net networks: gitlab-net: driver: bridge关键参数说明参数必要性说明shm_size必需解决Sidekiq内存不足问题2222:22推荐避免与宿主机SSH冲突5000:80临时最终将通过Nginx代理网络隔离可选增强安全性提示首次启动可能耗时5-10分钟GitLab需要初始化数据库和服务3. SMTP邮件服务深度配置3.1 主流通用邮件服务配置修改docker-compose.yml中的GITLAB_OMNIBUS_CONFIG部分添加SMTP配置gitlab_rails[smtp_enable] true gitlab_rails[smtp_address] smtp.example.com gitlab_rails[smtp_port] 465 gitlab_rails[smtp_user_name] no-replyexample.com gitlab_rails[smtp_password] yourpassword gitlab_rails[smtp_domain] example.com gitlab_rails[smtp_authentication] login gitlab_rails[smtp_enable_starttls_auto] true gitlab_rails[smtp_tls] true gitlab_rails[gitlab_email_from] no-replyexample.com gitlab_rails[gitlab_email_reply_to] no-replyexample.com常见邮件服务商配置对比服务商smtp_addresssmtp_portsmtp_tls阿里云企业邮smtp.qiye.aliyun.com465/587true腾讯企业邮smtp.exmail.qq.com465trueGmailsmtp.gmail.com587falseSendGridsmtp.sendgrid.net587true3.2 邮件服务测试与排错应用配置后进入容器执行测试docker exec -it gitlab bash gitlab-rails console Notify.test_email(recipientexample.com, GitLab SMTP Test, This confirms SMTP is working).deliver_now常见问题排查证书验证失败添加smtp_openssl_verify_mode: none连接超时检查防火墙是否放行出站流量认证失败确认用户名密码是否正确特别是应用专用密码4. Nginx反向代理实战方案4.1 标准HTTPS代理配置当已有Nginx服务占用80/443端口时我们需要修改GitLab使用非标准端口如5000在外部Nginx配置反向代理upstream gitlab { server 127.0.0.1:5000; # 对应docker-compose中的端口映射 } server { listen 443 ssl; server_name gitlab.yourdomain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://gitlab; 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; client_max_body_size 0; } } server { listen 80; server_name gitlab.yourdomain.com; return 301 https://$host$request_uri; }4.2 GitLab容器内配置调整同步修改GITLAB_OMNIBUS_CONFIGnginx[listen_port] 80 # 容器内端口 nginx[listen_https] false # 由外部Nginx处理SSL gitlab_rails[trusted_proxies] [172.0.0.0/8] # Docker网络段端口映射关系示意图外部访问 https:443 → Nginx → 内部GitLab http:5000 外部访问 ssh:22 → 直接映射到GitLab容器 22225. 高级调优与安全加固5.1 资源限制与性能优化在docker-compose.yml中添加资源限制deploy: resources: limits: cpus: 2 memory: 4G reservations: memory: 2G关键性能参数# 在GITLAB_OMNIBUS_CONFIG中添加 puma[worker_processes] 2 sidekiq[concurrency] 5 postgresql[shared_buffers] 256MB redis[max_memory] 512MB5.2 安全加固措施定期备份docker exec -t gitlab gitlab-backup create禁用注册gitlab_rails[gitlab_signup_enabled] false强制HTTPSgitlab_rails[gitlab_https] true nginx[redirect_http_to_https] true6. 日常运维与问题排查6.1 常用维护命令功能命令重启服务docker-compose restart查看日志docker logs -f gitlab进入控制台docker exec -it gitlab gitlab-rails console检查配置docker exec -it gitlab gitlab-rake gitlab:check6.2 典型问题解决方案问题1502错误页面检查内存是否充足free -h增加SWAP空间dd if/dev/zero of/swapfile bs1G count4 chmod 600 /swapfile mkswap /swapfile swapon /swapfile问题2SSH克隆失败确认gitlab.rb中SSH配置gitlab_rails[gitlab_shell_ssh_port] 2222问题3邮件发送延迟调整Sidekiq队列sidekiq[min_concurrency] 2 sidekiq[max_concurrency] 5通过这套方案您将获得一个生产级可用的GitLab环境兼具易用性与安全性。实际部署中根据企业需求调整SMTP和Nginx配置即可快速上线。