-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.local.yml
More file actions
151 lines (144 loc) · 5.5 KB
/
Copy pathdocker-compose.local.yml
File metadata and controls
151 lines (144 loc) · 5.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# 本机单实例运行/测试(非 deploy/ 下的 3 节点集群演示)
#
# 用法:
# 1) 构建并拷贝二进制到 local-bin/:
# docker compose -f docker-compose.local.yml run --rm builder
# 2) 启动单实例(HTTP API 映射到本机 8384):
# docker compose -f docker-compose.local.yml up -d defing
# 3) 初始化 example 站点配置并启动站点(http://127.0.0.1:8000):
# docker compose -f docker-compose.local.yml run --rm example-setup
# docker compose -f docker-compose.local.yml up -d example-site
# 4) 冒烟验证:
# curl -s -X POST http://127.0.0.1:8384/api/v1/login -H 'Content-Type: application/json' -d '{"password":"dev-admin-pass"}'
# curl -s http://127.0.0.1:8000/api/state
#
# 说明:
# - 宿主为 Apple Silicon,Docker 引擎 linux/arm64,容器内原生编译产物即 arm64 Linux ELF。
# - 公共 target 目录复用 server/target(已在 .gitignore 中),容器内 CARGO_TARGET_DIR 指向该挂载。
# - Cargo/Rustup 工具链与 registry 缓存放在 named volume,重复构建无需重新下载。
# - defing 运行期只读环境变量 DSH_MASTER_KEY(base64 32B),其余均为 CLI 参数。
# - example 站点经 compose 网络以服务名 defing 访问配置服务(HTTP/SSE 数据面通道)。
name: dsh-local
x-ubuntu: &ubuntu
image: ubuntu:24.04
services:
# 一次性构建器:cargo build --release 后把二进制拷贝到 /app(= 宿主 local-bin/)
builder:
<<: *ubuntu
profiles: ["tools"]
environment:
DEBIAN_FRONTEND: noninteractive
CARGO_HOME: /cargo-home
RUSTUP_HOME: /cargo-home/rustup
CARGO_TARGET_DIR: /src/server/target
# 纯 Rust 存储(redb)后无需 C++ 工具链;clang/libclang 仅构建脚本遗留可再精简
CXXFLAGS: "-include cstdint"
volumes:
- ./server:/src/server # 源码(Cargo 需可写 Cargo.lock)
- ./proto:/src/proto # dsh-api/build.rs 经 ../../../proto 引用(只读即可)
- ./local-bin:/app # 产物输出目录
- dsh-cargo-home:/cargo-home # 工具链 + registry 缓存
command:
- bash
- -euxc
- |
exec > >(tee /app/build.log) 2>&1
apt-get update
apt-get install -y --no-install-recommends ca-certificates curl git build-essential pkg-config clang libclang-dev protobuf-compiler
if [ ! -x "$$CARGO_HOME/bin/cargo" ]; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
| sh -s -- -y --profile minimal --default-toolchain 1.97.0 --no-modify-path
fi
export PATH="$$CARGO_HOME/bin:$$PATH"
rustup toolchain install 1.97.0 --profile minimal
rustup default 1.97.0
cd /src/server
cargo build --release -p dsh-cli
cp -f "$$CARGO_TARGET_DIR/release/defing" /app/defing
chmod +x /app/defing
echo "=== OK: $(ls -lh /app/defing) ==="
# 单实例运行(dev-single 模式,Raft 关闭,数据落 /app/data = 宿主 local-bin/data)
defing:
<<: *ubuntu
init: true
environment:
# 开发用主密钥(仅供本机测试,勿用于生产)
# O3:可经宿主环境变量覆盖(生产务必注入自己的密钥,勿用默认值);
# 默认值仅供本机测试,泄露即全部 secret 可解。
DSH_MASTER_KEY: "${DSH_MASTER_KEY:-q4UbfiDw6b7wRGnKepAu2Xa0msYz/hIQOGlGr2uhcy8=}"
volumes:
- ./local-bin:/app
ports:
- "127.0.0.1:8384:8384" # HTTP API 仅绑定本机
command:
- /app/defing
- --dev-single
- --http-addr=0.0.0.0:8384
- --admin-password=dev-admin-pass
- --data-dir=/app/data
healthcheck:
test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/8384"]
interval: 5s
timeout: 3s
retries: 12
start_period: 5s
# 一次性:通过 defing admin API 初始化 example 站点配置(project/配置项/发布)
example-setup:
<<: *ubuntu
profiles: ["tools"]
environment:
DEBIAN_FRONTEND: noninteractive
DSH_ENDPOINT: http://defing:8384
DSH_PROJECT: example-site
DSH_BRANCH: dev
DSH_GROUP: site
ADMIN_PASSWORD: dev-admin-pass
TITLE: "defing 演示站"
LOGIN_USERNAME: admin
LOGIN_PASSWORD: example-pass-123
volumes:
- ./example:/site:ro
- ./sdk/python:/app/sdk:ro
depends_on:
defing:
condition: service_healthy
command:
- bash
- -euxc
- |
apt-get update -qq
apt-get install -y -qq --no-install-recommends python3 >/dev/null
exec python3 /site/app.py setup
# example 站点:从 defing 拉配置 + watch 热更新,登录账号/密码/标题均为配置项
example-site:
<<: *ubuntu
init: true
environment:
DEBIAN_FRONTEND: noninteractive
PORT: "8000"
DSH_ENDPOINT: http://defing:8384
DSH_PROJECT: example-site
DSH_BRANCH: dev
DSH_GROUP: site
volumes:
- ./example:/site:ro
- ./sdk/python:/app/sdk:ro
ports:
- "127.0.0.1:8000:8000" # 站点仅绑定本机
depends_on:
defing:
condition: service_healthy
command:
- bash
- -c
- |
apt-get update -qq && apt-get install -y -qq --no-install-recommends python3 >/dev/null
exec python3 /site/app.py serve
healthcheck:
test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/8000"]
interval: 5s
timeout: 3s
retries: 12
start_period: 10s
volumes:
dsh-cargo-home: