Docker 运行 Release 单文件(推荐)
这种方式与线上 store.noxue.com 的实际部署一致:Docker 构建镜像时直接从 GitHub Releases 下载并校验 Linux musl 单文件,运行时只有一个 zebra-store-app 容器。前台、/admin/ 后台、API 和后台任务都在同一个 zebra-store 二进制中。
浏览器 / Cloudflare
│
▼
Caddy 或 Nginx(HTTPS)
│ reverse_proxy 127.0.0.1:18180
▼
zebra-store-app(Docker,单个 Release 二进制)
├── / 用户前台
├── /admin/ 管理后台
├── /api/v1/ API
└── data + uploads Docker 卷服务器不需要 Rust、Node.js、Zig,也不会在服务器上编译源码。
准备
- 64 位 Linux,支持
x86_64或aarch64; - Docker Engine 24 或更新版本,带 Compose v2;
- 80、443 端口对外开放;
- 18180 只绑定到
127.0.0.1,不需要开放防火墙。
确认 Docker 可用:
docker version
docker compose version1. 获取部署文件
sudo mkdir -p /opt/zebra-store
sudo chown "$USER":"$(id -gn)" /opt/zebra-store
cd /opt/zebra-store
BASE=https://raw.githubusercontent.com/noxue/zebra-store/main
curl -fsSLO "$BASE/deploy/release/Dockerfile"
curl -fsSLo compose.yml "$BASE/deploy/release/compose.yml"
curl -fsSLo config.yml "$BASE/backend/config.example.yml"不需要克隆仓库。部署目录只有三个必要文件:
/opt/zebra-store/
├── Dockerfile # 从 GitHub Release 下载、校验并复制单文件
├── compose.yml # 一个容器、两个数据卷、本机端口 18180
└── config.yml # 站点配置,不提交到 Git2. 修改配置
编辑 config.yml,至少替换以下四项:
app:
secret_key: 换成至少32位随机字符串
jwt:
secret: 换成至少32位随机字符串
user_jwt:
secret: 换成至少32位随机字符串
bootstrap:
default_admin_username: admin
default_admin_password: 换成强密码可以执行 openssl rand -hex 32 生成密钥。Docker 内监听地址保持 0.0.0.0:8081,SQLite 地址保持 sqlite://data/zebra.db?mode=rwc,上传目录保持 uploads。
3. 构建并启动
普通 Intel / AMD 服务器:
RELEASE=v0.1.4 docker compose build --no-cache
RELEASE=v0.1.4 docker compose up -d --no-buildARM64 服务器把构建命令改为:
TARGET=aarch64 RELEASE=v0.1.4 docker compose build --no-cache
RELEASE=v0.1.4 docker compose up -d --no-build不写 RELEASE 时默认下载最新 Release。固定版本更容易确认当前运行的程序,也方便回滚。
构建日志中必须出现类似内容:
zebra-store-linux-x86_64-musl.tar.gz: OK这表示下载的压缩包已经通过 Release 中 SHA256SUMS 的校验。
4. 检查容器
docker compose ps
docker compose logs --tail=100 store
curl -fsS http://127.0.0.1:18180/health
curl -fsS http://127.0.0.1:18180/api/v1/public/config | head -c 200正常情况下只有一个业务容器:
zebra-store-app zebra-store/release:v0.1.4 Up ... (healthy)数据库与上传文件分别保存在 zebra-store_store_data 和 zebra-store_store_uploads 卷中。
5. 获取或重置后台密码
后台地址是 https://你的域名/admin/。默认用户名是 admin,首次密码就是启动前写入 config.yml 的 bootstrap.default_admin_password:
grep -E 'default_admin_(username|password)' config.yml程序只在数据库第一次初始化时用这两项创建管理员。后台修改密码后,数据库只保存密码哈希,不能读取出原密码; 此时 config.yml 里的值也不会再代表当前密码。
忘记密码时,在 deploy/release 目录执行:
NEW_PASSWORD="Zs9-$(openssl rand -hex 10)"
docker compose exec store zebra-store --config /app/config.yml \
admin reset-password --username admin --password "$NEW_PASSWORD"
printf '新后台密码:%s\n' "$NEW_PASSWORD"命令成功后会撤销这个管理员已有的登录会话。请立即用新密码登录,再保存到密码管理器。
6. 配置 HTTPS
Caddy:
shop.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:18180
}caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddyNginx 或宝塔反向代理的目标填写 http://127.0.0.1:18180,整个域名都转发过去,不需要分别配置 /api/、/admin/ 或静态资源目录。
升级
刷新两个部署文件并指定新 Release。不要重新下载 config.yml,否则会覆盖站点密钥和管理员初始配置:
cd /opt/zebra-store
BASE=https://raw.githubusercontent.com/noxue/zebra-store/main
curl -fsSLO "$BASE/deploy/release/Dockerfile"
curl -fsSLo compose.yml "$BASE/deploy/release/compose.yml"
RELEASE=v新版本 docker compose build --no-cache
RELEASE=v新版本 docker compose up -d --no-build
curl -fsS http://127.0.0.1:18180/healthCompose 会复用原来的数据库卷、上传卷和 config.yml。确认新容器健康后,可以删除不用的旧镜像:
docker image prune -f常用命令
docker compose ps
docker compose logs -f store
docker compose restart store
docker compose down
docker compose up -d --no-builddocker compose down 不会删除数据库和上传卷。不要执行 docker compose down -v,除非确定要删除全部站点数据。