chore(deploy): 优化 Docker 部署说明与安装脚本

- 将默认部署切换为拉取 GHCR 镜像,并补充本地源码构建的 override 用法。
- 新增单容器与多容器的构建编排文件,支持镜像版和源码构建版部署。
- 新增 `install.sh`,用于自动生成 `.env`、拉取镜像并启动服务。
This commit is contained in:
LanQin
2026-06-15 22:38:40 +08:00
parent f91b3143da
commit 2a5c4fcc0c
8 changed files with 137 additions and 61 deletions
+13 -8
View File
@@ -44,32 +44,37 @@ npm run check:shadcn
## Docker 部署 ## Docker 部署
默认单容器部署: 推荐单容器部署。服务器只需要 `deploy/docker-compose.yml``.env`,不需要源码构建
```bash ```bash
cd deploy cd deploy
cp .env.example .env cp .env.example .env
docker compose up -d --build # 修改 .env 里的域名和管理员密码
docker compose pull
docker compose up -d
``` ```
这个容器内部集成:API、Web、Nginx、Postfix、Dovecot、OpenDKIM。 这个容器内部集成:API、Web、Nginx、Postfix、Dovecot、OpenDKIM。
也可以直接使用 GitHub Actions 自动发布到 GHCR 镜像: 如果 GHCR 镜像是私有的,先登录
```bash
echo "<github_token>" | docker login ghcr.io -u <github_user> --password-stdin
```
本地源码构建:
```bash ```bash
cd deploy cd deploy
cp .env.example .env cp .env.example .env
# 修改 .env 里的域名、管理员密码,确认 LANQIN_IMAGE docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
# LANQIN_IMAGE=ghcr.io/lanqin996/lanqin-email:latest
docker compose pull
docker compose up -d
``` ```
如需多容器调试版: 如需多容器调试版:
```bash ```bash
cd deploy cd deploy
docker compose -f docker-compose.stack.yml up -d --build docker compose -f docker-compose.stack.yml -f docker-compose.stack.build.yml up -d --build
``` ```
真实公网收发前需要正确配置 MX/SPF/DKIM/DMARC,并确认云厂商开放 25/587/993 端口。 真实公网收发前需要正确配置 MX/SPF/DKIM/DMARC,并确认云厂商开放 25/587/993 端口。
+1 -1
View File
@@ -6,7 +6,7 @@
# Docker 镜像 # Docker 镜像
# ========================= # =========================
# 单容器部署镜像。默认使用你的 GHCR 镜像。 # 单容器部署镜像。默认使用你的 GHCR 镜像。
# 如果只想本机构建,可以临时改成 lanqin-email:local 后执行 docker compose up -d --build # 本地源码构建请用:docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
LANQIN_IMAGE=ghcr.io/lanqin996/lanqin-email:latest LANQIN_IMAGE=ghcr.io/lanqin996/lanqin-email:latest
# 多容器调试版镜像。只在 docker-compose.stack.yml 中使用。 # 多容器调试版镜像。只在 docker-compose.stack.yml 中使用。
+56 -27
View File
@@ -1,14 +1,26 @@
# LanQin Email Docker 部署说明 # LanQin Email Docker 部署说明
## 默认:单容器部署 ## 最简单部署:单容器镜像版
服务器上不需要源码构建,只要 `docker-compose.yml``.env` 即可。
```bash ```bash
cd deploy cd deploy
cp .env.example .env cp .env.example .env
# 修改 LANQIN_PUBLIC_HOSTNAME / LANQIN_ADMIN_EMAIL / LANQIN_ADMIN_PASSWORD # 修改 LANQIN_PUBLIC_HOSTNAME / LANQIN_PUBLIC_BASE_URL / LANQIN_ADMIN_EMAIL / LANQIN_ADMIN_PASSWORD
docker compose up -d --build docker compose pull
docker compose up -d
``` ```
也可以使用脚本:
```bash
cd deploy
bash install.sh
```
第一次执行会生成 `.env` 并提示你修改配置;修改完成后再次执行 `bash install.sh`
默认只启动一个业务容器: 默认只启动一个业务容器:
```text ```text
@@ -24,21 +36,23 @@ lanqin-email
- Dovecot - Dovecot
- OpenDKIM - OpenDKIM
常用日志 常用命令
```bash ```bash
# 查看日志
docker compose logs -f lanqin-email docker compose logs -f lanqin-email
# 更新镜像并重启
docker compose pull
docker compose up -d
# 停止
docker compose down
``` ```
## 使用 GitHub Actions 构建好的镜像 ## GHCR 镜像权限
仓库已添加 `.github/workflows/docker.yml` 默认镜像
- pull request:检查前端 shadcn 规则、前端构建、后端测试。
- push 到 `main` / `master`:检查通过后发布 Docker 镜像到 GHCR。
- push tag,例如 `v1.0.0`:发布对应 tag 镜像。
默认发布镜像:
```text ```text
ghcr.io/lanqin996/lanqin-email:latest ghcr.io/lanqin996/lanqin-email:latest
@@ -49,33 +63,49 @@ ghcr.io/lanqin996/lanqin-email-dovecot:latest
ghcr.io/lanqin996/lanqin-email-opendkim:latest ghcr.io/lanqin996/lanqin-email-opendkim:latest
``` ```
单容器部署时,确认 `.env` 里的 `LANQIN_IMAGE` 是你的 GHCR 镜像 如果拉取时报
```env ```text
LANQIN_IMAGE=ghcr.io/lanqin996/lanqin-email:latest unauthorized
``` ```
然后在服务器执行 说明 GHCR Package 还是私有,二选一
```bash 1. 到 GitHub Packages 把镜像改成 Public。
cd deploy 2. 在服务器登录 GHCR
docker compose pull
docker compose up -d
```
如果镜像是私有的,服务器需要先登录 GHCR:
```bash ```bash
echo "<github_token>" | docker login ghcr.io -u <github_user> --password-stdin echo "<github_token>" | docker login ghcr.io -u <github_user> --password-stdin
``` ```
## 可选:多容器调试部署 ## 本地源码构建
如果需要分别查看 Postfix / Dovecot / OpenDKIM 日志,可以使用保留的 stack 编排 如果你是在完整源码仓库里本机构建,使用 build override
```bash ```bash
cd deploy cd deploy
docker compose -f docker-compose.stack.yml up -d --build cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
```
这样会使用 `deploy/all-in-one/Dockerfile` 构建单容器镜像。
## 可选:多容器调试部署
如果需要分别查看 Postfix / Dovecot / OpenDKIM 日志,可以使用 stack 编排。
拉取镜像版:
```bash
cd deploy
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
``` ```
## DNS ## DNS
@@ -102,4 +132,3 @@ docker compose -f docker-compose.stack.yml up -d --build
- 建议在服务器或边缘网关配置 HTTPS。 - 建议在服务器或边缘网关配置 HTTPS。
- 云厂商通常默认封禁 25 端口,需要单独申请解封。 - 云厂商通常默认封禁 25 端口,需要单独申请解封。
- SQLite 适合 V1 单机部署;多节点部署前迁移到 PostgreSQL,并把 Postfix/Dovecot maps 改为 PostgreSQL。 - SQLite 适合 V1 单机部署;多节点部署前迁移到 PostgreSQL,并把 Postfix/Dovecot maps 改为 PostgreSQL。
+5
View File
@@ -0,0 +1,5 @@
services:
lanqin-email:
build:
context: ..
dockerfile: deploy/all-in-one/Dockerfile
+22
View File
@@ -0,0 +1,22 @@
services:
api:
build:
context: ..
dockerfile: deploy/api.Dockerfile
web:
build:
context: ..
dockerfile: deploy/web.Dockerfile
postfix:
build:
context: ./postfix
dovecot:
build:
context: ./dovecot
opendkim:
build:
context: ./opendkim
+5 -19
View File
@@ -1,11 +1,6 @@
version: "3.9"
services: services:
api: api:
image: ${LANQIN_API_IMAGE:-lanqin-email-api:local} image: ${LANQIN_API_IMAGE:-ghcr.io/lanqin996/lanqin-email-api:latest}
build:
context: ..
dockerfile: deploy/api.Dockerfile
env_file: .env env_file: .env
volumes: volumes:
- lanqin-data:/data - lanqin-data:/data
@@ -16,10 +11,7 @@ services:
restart: unless-stopped restart: unless-stopped
web: web:
image: ${LANQIN_WEB_IMAGE:-lanqin-email-web:local} image: ${LANQIN_WEB_IMAGE:-ghcr.io/lanqin996/lanqin-email-web:latest}
build:
context: ..
dockerfile: deploy/web.Dockerfile
restart: unless-stopped restart: unless-stopped
nginx: nginx:
@@ -35,9 +27,7 @@ services:
restart: unless-stopped restart: unless-stopped
postfix: postfix:
image: ${LANQIN_POSTFIX_IMAGE:-lanqin-email-postfix:local} image: ${LANQIN_POSTFIX_IMAGE:-ghcr.io/lanqin996/lanqin-email-postfix:latest}
build:
context: ./postfix
env_file: .env env_file: .env
volumes: volumes:
- lanqin-data:/data - lanqin-data:/data
@@ -51,9 +41,7 @@ services:
restart: unless-stopped restart: unless-stopped
dovecot: dovecot:
image: ${LANQIN_DOVECOT_IMAGE:-lanqin-email-dovecot:local} image: ${LANQIN_DOVECOT_IMAGE:-ghcr.io/lanqin996/lanqin-email-dovecot:latest}
build:
context: ./dovecot
env_file: .env env_file: .env
volumes: volumes:
- lanqin-data:/data - lanqin-data:/data
@@ -63,9 +51,7 @@ services:
restart: unless-stopped restart: unless-stopped
opendkim: opendkim:
image: ${LANQIN_OPENDKIM_IMAGE:-lanqin-email-opendkim:local} image: ${LANQIN_OPENDKIM_IMAGE:-ghcr.io/lanqin996/lanqin-email-opendkim:latest}
build:
context: ./opendkim
env_file: .env env_file: .env
volumes: volumes:
- lanqin-data:/data:ro - lanqin-data:/data:ro
+1 -6
View File
@@ -1,11 +1,6 @@
version: "3.9"
services: services:
lanqin-email: lanqin-email:
image: ${LANQIN_IMAGE:-lanqin-email:local} image: ${LANQIN_IMAGE:-ghcr.io/lanqin996/lanqin-email:latest}
build:
context: ..
dockerfile: deploy/all-in-one/Dockerfile
env_file: .env env_file: .env
ports: ports:
- "80:80" - "80:80"
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
if ! command -v docker >/dev/null 2>&1; then
echo "未检测到 docker,请先安装 Docker Engine / Docker Compose。" >&2
exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
echo "未检测到 docker compose,请先安装 Docker Compose v2。" >&2
exit 1
fi
if [ ! -f .env ]; then
cp .env.example .env
echo "已生成 deploy/.env。请先编辑域名和管理员密码:"
echo " LANQIN_PUBLIC_HOSTNAME"
echo " LANQIN_PUBLIC_BASE_URL"
echo " LANQIN_ADMIN_EMAIL"
echo " LANQIN_ADMIN_PASSWORD"
echo
echo "编辑完成后再次执行:./install.sh"
exit 0
fi
echo "拉取镜像..."
docker compose pull
echo "启动服务..."
docker compose up -d
echo "完成。查看日志:docker compose logs -f lanqin-email"