2026-06-14 01:07:48 +08:00
|
|
|
|
# LanQin Email Docker 部署说明
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
## 最简单部署:单容器镜像版
|
|
|
|
|
|
|
|
|
|
|
|
服务器上不需要源码构建,只要 `docker-compose.yml` 和 `.env` 即可。
|
2026-06-14 01:07:48 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd deploy
|
|
|
|
|
|
cp .env.example .env
|
2026-06-15 22:38:40 +08:00
|
|
|
|
# 修改 LANQIN_PUBLIC_HOSTNAME / LANQIN_PUBLIC_BASE_URL / LANQIN_ADMIN_EMAIL / LANQIN_ADMIN_PASSWORD
|
|
|
|
|
|
docker compose pull
|
|
|
|
|
|
docker compose up -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
也可以使用脚本:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd deploy
|
|
|
|
|
|
bash install.sh
|
2026-06-14 01:07:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
第一次执行会生成 `.env` 并提示你修改配置;修改完成后再次执行 `bash install.sh`。
|
|
|
|
|
|
|
2026-06-15 00:57:34 +08:00
|
|
|
|
默认只启动一个业务容器:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
lanqin-email
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
容器内部包含:
|
|
|
|
|
|
|
|
|
|
|
|
- Go API
|
|
|
|
|
|
- Web 静态站点
|
|
|
|
|
|
- Nginx
|
|
|
|
|
|
- Postfix
|
|
|
|
|
|
- Dovecot
|
2026-06-15 23:41:21 +08:00
|
|
|
|
- Rspamd
|
2026-06-15 00:57:34 +08:00
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
常用命令:
|
2026-06-15 00:57:34 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-15 22:38:40 +08:00
|
|
|
|
# 查看日志
|
2026-06-15 00:57:34 +08:00
|
|
|
|
docker compose logs -f lanqin-email
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
# 更新镜像并重启
|
|
|
|
|
|
docker compose pull
|
|
|
|
|
|
docker compose up -d
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
# 停止
|
|
|
|
|
|
docker compose down
|
|
|
|
|
|
```
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
## GHCR 镜像权限
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
默认镜像:
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
2026-06-15 22:19:24 +08:00
|
|
|
|
ghcr.io/lanqin996/lanqin-email:latest
|
|
|
|
|
|
ghcr.io/lanqin996/lanqin-email-api:latest
|
|
|
|
|
|
ghcr.io/lanqin996/lanqin-email-web:latest
|
|
|
|
|
|
ghcr.io/lanqin996/lanqin-email-postfix:latest
|
|
|
|
|
|
ghcr.io/lanqin996/lanqin-email-dovecot:latest
|
2026-06-15 23:41:21 +08:00
|
|
|
|
ghcr.io/lanqin996/lanqin-email-rspamd:latest
|
2026-06-15 22:05:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
如果拉取时报:
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
```text
|
|
|
|
|
|
unauthorized
|
2026-06-15 22:05:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
说明 GHCR Package 还是私有,二选一:
|
|
|
|
|
|
|
|
|
|
|
|
1. 到 GitHub Packages 把镜像改成 Public。
|
|
|
|
|
|
2. 在服务器登录 GHCR:
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-15 22:38:40 +08:00
|
|
|
|
echo "<github_token>" | docker login ghcr.io -u <github_user> --password-stdin
|
2026-06-15 22:05:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
## 本地源码构建
|
|
|
|
|
|
|
|
|
|
|
|
如果你是在完整源码仓库里本机构建,使用 build override:
|
2026-06-15 22:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-15 22:38:40 +08:00
|
|
|
|
cd deploy
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
2026-06-15 22:05:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-15 22:38:40 +08:00
|
|
|
|
这样会使用 `deploy/all-in-one/Dockerfile` 构建单容器镜像。
|
|
|
|
|
|
|
2026-06-15 00:57:34 +08:00
|
|
|
|
## 可选:多容器调试部署
|
|
|
|
|
|
|
2026-06-15 23:41:21 +08:00
|
|
|
|
如果需要分别查看 Postfix / Dovecot / Rspamd 日志,可以使用 stack 编排。
|
2026-06-15 22:38:40 +08:00
|
|
|
|
|
|
|
|
|
|
拉取镜像版:
|
2026-06-15 00:57:34 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd deploy
|
2026-06-15 22:38:40 +08:00
|
|
|
|
docker compose -f docker-compose.stack.yml up -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
源码构建版:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd deploy
|
|
|
|
|
|
docker compose -f docker-compose.stack.yml -f docker-compose.stack.build.yml up -d --build
|
2026-06-15 00:57:34 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-14 01:07:48 +08:00
|
|
|
|
## DNS
|
|
|
|
|
|
|
2026-06-15 00:57:34 +08:00
|
|
|
|
进入 Web 管理后台后,在域名管理中查看每个域名需要配置的:
|
2026-06-14 01:07:48 +08:00
|
|
|
|
|
|
|
|
|
|
- MX
|
|
|
|
|
|
- SPF TXT
|
|
|
|
|
|
- DKIM TXT
|
|
|
|
|
|
- DMARC TXT
|
|
|
|
|
|
|
|
|
|
|
|
配置完成后点击“检测”。
|
|
|
|
|
|
|
|
|
|
|
|
## 邮件服务边界
|
|
|
|
|
|
|
|
|
|
|
|
- Postfix 读取 `/data/lanqin.db` 中的 `domains`、`mailboxes`、`aliases`。
|
|
|
|
|
|
- Dovecot 读取同一个 SQLite 数据库进行邮箱认证,并使用 `/var/mail/vhosts` 作为 Maildir 根目录。
|
2026-06-15 23:41:21 +08:00
|
|
|
|
- Rspamd 通过 milter 接入 Postfix,负责 DKIM 签名和垃圾邮件标记。
|
|
|
|
|
|
- Rspamd 会周期性从 SQLite 导出域名 DKIM 私钥到容器内 `/var/lib/rspamd/dkim`。
|
2026-06-14 01:07:48 +08:00
|
|
|
|
- Go API 是 Webmail 和管理后台唯一入口;浏览器不直接连接 SMTP/IMAP。
|
|
|
|
|
|
- Go API 会读取 `LANQIN_MAILDIR_ROOT=/var/mail/vhosts`,周期扫描 Maildir,把 Postfix/Dovecot 入站邮件同步成 Webmail 索引。
|
|
|
|
|
|
|
2026-06-16 21:21:56 +08:00
|
|
|
|
## SMTP 发信排查
|
|
|
|
|
|
|
|
|
|
|
|
单容器部署时,Webmail 发信默认提交给同容器内的 Postfix:
|
|
|
|
|
|
|
|
|
|
|
|
```env
|
|
|
|
|
|
LANQIN_SMTP_HOST=127.0.0.1
|
|
|
|
|
|
LANQIN_SMTP_PORT=25
|
|
|
|
|
|
LANQIN_SMTP_REQUIRE_TLS=false
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
如果页面提示 `smtp delivery failed: EOF`,通常是 Postfix 会话被中断。优先检查:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker compose exec lanqin-email supervisorctl status
|
|
|
|
|
|
docker compose exec lanqin-email postconf -M smtp/inet submission/inet
|
|
|
|
|
|
docker compose exec lanqin-email sqlite3 /data/lanqin.db "select key,value from system_settings where key like 'smtp%' order by key;"
|
|
|
|
|
|
docker compose logs --tail=200 lanqin-email
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
确认后台“系统设置”里没有把本机 Postfix 的 `SMTP Require TLS` 打开;本机 `127.0.0.1:25` 必须保持 TLS=false。
|
|
|
|
|
|
|
2026-06-14 01:07:48 +08:00
|
|
|
|
## 生产注意
|
|
|
|
|
|
|
2026-06-15 00:57:34 +08:00
|
|
|
|
- 建议在服务器或边缘网关配置 HTTPS。
|
2026-06-14 01:07:48 +08:00
|
|
|
|
- 云厂商通常默认封禁 25 端口,需要单独申请解封。
|
2026-06-15 00:57:34 +08:00
|
|
|
|
- SQLite 适合 V1 单机部署;多节点部署前迁移到 PostgreSQL,并把 Postfix/Dovecot maps 改为 PostgreSQL。
|
2026-06-15 23:41:21 +08:00
|
|
|
|
|