
战略品牌合作方
VMRACK.NET | 让Dujiao-Next部署更简单
⚡️官方合作闪购款,仅需76刀/年,三网优化线路,助力您业务起飞,支持:支付宝/paypal/USDT。点我享低价独家闪购!🎉







更新时间:2026-07-26
若你尚未确定部署方式,建议先阅读 部署总览与选型建议。
本文档适合希望完全掌控构建过程、或需要二次开发的开发者。
自 v1.4.0 起,前端源码已并入主仓库的 frontend/ 目录,只需要 clone 一个仓库,构建产物通过 go:embed 打进二进制。
go.mod)corepack enable 即可)git clone https://github.com/dujiao-next/dujiao-next.git
cd dujiao-next仓库结构:
dujiao-next/
├── cmd/server/ # 程序入口
├── internal/
│ └── web/ # 前端嵌入与 SPA 路由挂载
├── frontend/
│ ├── admin/ # 管理后台(Vue 3 + Vite)
│ └── user/ # 用户前台(Vue 3 + Vite)
├── config.yml.example
└── .goreleaser.yaml仓库已经用 GoReleaser 描述了完整构建流程(含前端构建与嵌入),本地跑一条命令即可:
goreleaser build --snapshot --single-target --clean产物在 dist/ 下,是一个内嵌前端的完整二进制。这条命令与 CI 发布走的是同一条路径。
如果没装 GoReleaser,按下一节手工构建。
# 管理后台:必须用 fullstack 模式,会注入 <base> 占位符供后端运行时替换
cd frontend/admin
pnpm install --frozen-lockfile
pnpm run build:fullstack
# 用户前台
cd ../user
pnpm install --frozen-lockfile
pnpm run build
cd ../..admin 必须用 build:fullstack
pnpm run build(不带 :fullstack)产出的是给独立域名部署用的版本,base 固定为 /, 嵌入后挂在自定义前缀下会加载不到静态资源。嵌入场景一律用 build:fullstack。
go:embed 只能读取包目录内的文件,所以前端产物必须放到 internal/web/dist/ 下:
rm -rf internal/web/dist
mkdir -p internal/web/dist
cp -r frontend/admin/dist internal/web/dist/admin
cp -r frontend/user/dist internal/web/dist/userCGO_ENABLED=0 go build -trimpath -tags release,fullstack \
-ldflags="-s -w" \
-o dujiao-next ./cmd/server-tags fullstack 是关键:不带它编译出来的二进制不含前端,只提供 API。
交叉编译示例(在 macOS 上编译 Linux 版本):
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -tags release,fullstack \
-ldflags="-s -w" -o dujiao-next-linux-amd64 ./cmd/server用于二次开发或前后端分离的自定义场景:
go build -o dujiao-api ./cmd/server此时 / 与后台路径都不会被挂载,你需要自行用 Nginx 托管前端产物, 并把 /api、/uploads、/sitemap.xml、/robots.txt 反代到本服务。
cp config.yml.example config.yml
# 按实际环境修改 config.yml关键项至少要确认:
server.mode(debug/release)database.driver / database.dsnapp.secret_key / jwt.secret / user_jwt.secretweb.admin_path(后台入口路径,务必改掉默认的 /admin)redis、queue、email(按需启用)⚠️ 重要安全提醒:上线前必须分别修改
app.secret_key、jwt.secret与user_jwt.secret,使用至少 32 位的高强度随机字符串,并确保三者不同。严禁使用模板默认值;否则服务会拒绝启动。
app.secret_key用于解密敏感数据,必须与数据库一起备份。
./dujiao-next默认监听:http://0.0.0.0:8080
启动日志出现下面这行,说明前端已正确内嵌:
Embedded SPAs: admin (/dj-mgmt-7x9k2), user (/)当数据库中 admins 表为空时,系统会在首次启动时尝试创建默认管理员:
adminadmin123强烈建议:首次登录后台后,立刻在「后台 -> 修改密码」中更换为强密码。
说明:
DJ_DEFAULT_ADMIN_USERNAMEDJ_DEFAULT_ADMIN_PASSWORDserver.mode=release 且未设置 DJ_DEFAULT_ADMIN_PASSWORD,系统会跳过默认管理员初始化(不会自动创建 admin/admin123)。整站转发到同一个端口即可,不需要按路径拆分:
server {
listen 443 ssl http2;
server_name shop.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}开发时不需要每次都嵌入前端,直接分别跑三个进程,前端有热重载:
# 终端 1:后端(不带 fullstack tag,不挂载 SPA)
go run ./cmd/server
# 终端 2:用户前台 http://localhost:5173
cd frontend/user && pnpm run dev
# 终端 3:管理后台 http://localhost:5174
cd frontend/admin && pnpm run dev两个前端的 Vite dev server 已配置好把 /api、/uploads 代理到 localhost:8080, 用户前台还额外代理了 /sitemap.xml 与 /robots.txt。
systemd / supervisor 托管(systemd unit 示例见 单二进制部署)GET /health