资讯动态

Stalwart 邮件服务器:Docker 部署完整指南

发布时间:2026/9/12 2:28:37 来源:尧图企业网站定制
Stalwart 邮件服务器Docker 部署完整指南【免费下载链接】stalwartAll-in-one Mail Collaboration server. Secure, scalable and fluent in every protocol (IMAP, JMAP, SMTP, CalDAV, CardDAV, WebDAV).项目地址: https://gitcode.com/GitHub_Trending/ma/stalwart把一整套邮件服务器塞进一个容器Stalwart 用 Rust 写的All-in-One服务一个进程同时跑 SMTP、IMAP、JMAP、POP3 和 CalDAV/CardDAV内置反垃圾与 Web 管理面板。用Docker部署时你只需一条 compose 命令就能拿到一个可用的邮件服务器本文把最省事的路径和最容易踩的坑一次讲清。动手前自检开始之前确认环境满足以下条件Docker Engine 20.10已安装 Docker Compose v22GB 可用内存、20GB 可用磁盘SQLite 后端足够起步8080 端口空闲Web 管理界面生产对外还需 25/465/587/993/443服务器可被外网访问后续 ACME 证书自动签发的前提执行以下命令能同时看到 docker 与 compose 版本即说明已装好docker --version docker compose version三步拉起容器Stalwart 官方镜像自带默认配置首次启动会自动生成 config.json容器内位于/etc/stalwart/和数据库无需手写任何 TOML。最小路径如下先拉取镜像确认架构x86_64 / ARM64可用docker pull stalwartlabs/stalwart:latest创建两份持久化目录。镜像以非 root 用户UID 2000运行/etc/stalwart存配置、/var/lib/stalwart存数据必须挂出来才不会随容器销毁mkdir -p /opt/stalwart/{config,data} chown -R 2000:2000 /opt/stalwart编写 compose 文件只暴露管理端口做首次部署其余端口生产加固阶段再开services: stalwart: image: stalwartlabs/stalwart:latest container_name: stalwart-mail restart: unless-stopped ports: - 8080:8080 # Web 管理 / JMAP初始调试入口 volumes: - ./config:/etc/stalwart # 配置持久化 - ./data:/var/lib/stalwart # 数据持久化 # …省略…启动容器然后从启动日志里取出临时管理员密码——首次启动会进入 bootstrap 模式密码直接打印在日志中docker compose up -d docker logs stalwart-mail 21 | grep -A5 bootstrap浏览器打开http://服务器IP:8080/admin用刚拿到的密码登录在向导里完成域名、账户与存储后端配置。三个关键配置解读三个最影响运行行为的点先看清再动手配置项位置为什么这么配不配会怎样配置文件容器内/etc/stalwart/config.json首次启动自动生成后续改动都在 Web 面板里完成目录不挂卷docker rm后配置清零数据目录容器内/var/lib/stalwart邮件全文、索引、账号全在这里是备份唯一对象同上且丢的就是全部邮件端口映射composeportsEXPOSE只是声明不映射到宿主机的端口外部根本不可达容器跑着但 993/25 连不上另外两点容易踩镜像构建时已对二进制执行setcap cap_net_bind_service见 Dockerfile非 root 进程也能绑定 25/80/443compose 里不需要写cap_add: NET_BIND_SERVICE。镜像自带 HEALTHCHECK每 30 秒请求一次/healthz/livedocker ps里的healthy状态就是它给的结果。验证与联调三条命令分别确认进程存活、协议可用、面板可达。健康检查curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1:8080/healthz/live预期输出200。容器状态同理预期出现Up (healthy)docker ps --filter namestalwart-mail开放 993 后验证 IMAPS 握手预期收到* OK ... IMAP4rev2 ...横幅openssl s_client -connect 127.0.0.1:993 -quiet判定部署成功的标准健康检查返回 200、容器状态healthy、IMAP 端口有协议响应、/admin面板能登录。生产加固三件事TLS 证书自动化域名 A 记录指向服务器 IP 后在管理面板开启ACME内置支持 Lets Encrypt含 HTTP-01 / TLS-ALPN-01 / DNS-01 挑战证书签发与续期全自动不再手动管证书文件。端口最小化暴露对外只开必要端口管理端口绑定到 127.0.0.1 再套 SSH 隧道避免 8080 直接暴露公网ports: - 25:25 # SMTP 入站 - 465:465 # SMTPS 出站 - 587:587 # 客户端提交 - 993:993 # IMAPS - 443:443 # JMAP / 管理界面ACME 证书后 - 127.0.0.1:8080:8080 # 管理界面仅本机访问控制首次登录后立即改掉 bootstrap 临时密码或固定写入STALWART_RECOVERY_ADMINadmin:密码环境变量后重启。再叠加两层IMAP 侧用ACL控制每个邮箱可访问的文件夹SMTP 侧配置授权发信域名拒绝未授权中继防止你的服务器变成公开 spam 跳板。日常运维速查操作命令备注查看日志docker logs -f stalwart-mail排查启动失败先看这里健康检查curl -sk https://127.0.0.1/healthz/live期望 HTTP 200数据备份docker cp stalwart-mail:/var/lib/stalwart /backup/建议配合cron定时资源上限compose 中加deploy.resources.limits如memory: 4G、cpus: 2重启服务docker compose restart改完配置后执行版本升级docker compose pull docker compose up -d数据卷不受影响踩坑速查1. 端口冲突现象容器秒退日志address already in use。 根因宿主机 25/587/993 被 postfix 或旧实例占用。 解法ss -tlnp | grep 25找出占用者停掉旧服务。2. 数据目录权限错误现象反复重启日志报无法打开数据库。 根因宿主目录属主不是容器用户 UID 2000。 解法chown -R 2000:2000 /opt/stalwart。3. 忘记管理员密码现象/admin登录失败日志里的临时密码早已滚走。 根因bootstrap 密码只在启动日志出现一次。 解法docker logs回查或设置STALWART_RECOVERY_ADMIN后重启。4. ACME 签发失败现象面板提示证书请求超时。 根因域名 A 记录未指向服务器HTTP-01 挑战打不进来。 解法先dig short mail.example.com确认解析再重试。5. EXPOSE 不等于可访问现象容器 healthy但 993 连不上。 根因Dockerfile 里的EXPOSE只是声明未在 compose 映射。 解法按生产加固一节补齐ports。收束一个容器换来完整的 SMTP/IMAP/JMAP/DAV 服务配置、数据各挂一个卷即可长期运行。更多细节直接看仓库里的 Dockerfile 与 tests/docker/ 下的完整测试环境编排。【免费下载链接】stalwartAll-in-one Mail Collaboration server. Secure, scalable and fluent in every protocol (IMAP, JMAP, SMTP, CalDAV, CardDAV, WebDAV).项目地址: https://gitcode.com/GitHub_Trending/ma/stalwart创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价