English · 中文
mega2 开源版只交付一种形态:trunk / storage-only——无 Web UI、无 Change List;交互式浏览用 Libra 的 libra mega2 browser。本文是该形态的安装与上线指南。运行时行为、鉴权语义与形态切换的运维事实源是 deploy-trunk.md;产品规则见 monorepo.md;配置键见 config/config.toml(重注释样例)与 refactoring/config.md。本文不重复这些事实,只做导航与落地步骤。
唯一支持的部署形态是 trunk / storage-only:
- 唯一公开分支
main;所有写(git push 与产品 API 写)经 MonoWriteQueue 全局串行化,共享 tip 权威;不注册 CL / issue / reviewer / OAuth user 路由。 - HTTP 表面:Git smart HTTP(
info/refs、git-upload-pack、git-receive-pack)、LFS(/info/lfs、/api/v1/lfs)、storage-only/api/v1/*(status、file/blob、file/tree、preview 读,create-entry / delete-entry / move-entry / edit/save、tags 写)、可选 OCI/v2([oci].enabled)、可选 Agent Capture/api/v1/agent-capture([agent_capture].enabled)、Swagger UI/swagger-ui、OpenAPI/api/openapi.json。 - SSH 仅 upload-pack(clone / fetch / pull);
ssh_receive_pack必须显式false,省略会拒绝启动。 - 写鉴权:
git.push_auth = "token"(推荐)或"none"(仅受控网络)。鉴权语义、fail-closed 清单与 SSH 细节见deploy-trunk.md§1–§4。
仓库根的 Compose 文件分两类:正式评估栈与测试 / 实验栈。
评估栈按平台提供两个变体;两者都从 Docker Hub 拉取正式发布镜像 genedna/mega2:latest(pull_policy: always),不构建源码。组件:mega2 + Postgres + Redis + RustFS + rustfs-init(自动建 mega2 桶);mega2 在服务启动时自动初始化空 Monorepo,不需要 service init bootstrap。
macos-orbstack-mega2-compose.yml——macOS + OrbStack。利用 OrbStack 的*.orb.localDNS,让 RustFS endpoint(http://mega2-rustfs.orb.local:9000)在宿主机与容器内都能解析。linux-mega2-compose.yml——Linux Docker。把 Postgres/Redis/RustFS 发布到宿主机回环,并让 mega2 以network_mode: host运行,使http://127.0.0.1:29000对两侧都可达。
之所以分两个变体,是因为 artifact 预签名 URL 的 host 参与 SigV4 签名:同一个地址必须同时服务 mega2 进程(SDK + 签名)与宿主机客户端(直连下载 blob),而两个平台提供这一共享名称的机制不同。
docker compose -f macos-orbstack-mega2-compose.yml up -d --wait # macOS + OrbStack
docker compose -f linux-mega2-compose.yml up -d --wait # Linux Docker
docker compose -f <文件> logs -f mega2
docker compose -f <文件> down # 具名卷保留数据;down -v 清空两个栈都是仅限本机的匿名设置:push_auth=none、匿名读写,HTTP 只绑定 127.0.0.1:9000。不要绑定 0.0.0.0 或经反向代理暴露;共享 / 公网部署用下面的 token 栈或自建编排。端到端操作演示见 quick-start.zh.md。
docker/docker-compose-storage-only.yml 是从源码构建镜像的本地 / 实验室参考栈(用于部署演练与 smoke,不是正式分发形态):mega2 + Postgres + Redis + RustFS,挂载 config/config-storage-only.toml。与 IT 栈 docker/docker-compose.test.yml 可并存(端口不冲突)。
服务与宿主端口(以 compose 文件为准):
| 服务 | 容器端口 | 宿主发布 | 说明 |
|---|---|---|---|
| mega2 HTTP | 8000 | 127.0.0.1:9000 |
Git smart HTTP + LFS + storage-only API + Swagger UI |
| mega2 SSH | 2222 | 127.0.0.1:2222 |
仅 upload-pack(receive-pack 由配置关闭) |
| postgres | 5432 | 127.0.0.1:25432 |
|
| redis | 6379 | 127.0.0.1:26379 |
|
| rustfs API | 9000 | 127.0.0.1:29000 |
默认 S3 兼容对象存储 |
| rustfs console | 9001 | 127.0.0.1:29001 |
|
| git-smoke | — | 不发布端口 | --profile smoke 黑盒冒烟(见 deploy-trunk.md §8.1) |
首次启动与 bootstrap:
# 首次构建(context = 仓库根)
docker compose -p mega2-trunk -f docker/docker-compose-storage-only.yml build mega2
# 启动(默认 RustFS,不要加 --env-file)
docker compose -p mega2-trunk -f docker/docker-compose-storage-only.yml up -d --wait
# 空卷 bootstrap(一次性;创建初始图,不起监听)
docker compose -p mega2-trunk -f docker/docker-compose-storage-only.yml exec -T mega2 \
mega2 --config /etc/mega2/config.toml service init --yesPush token secret:compose 把 token 文件挂载为 /run/secrets/mega2-push-token,默认源 ./secrets/mega2-push-token.local(secrets/ 已 gitignore,需自行创建)。生产部署用 MEGA2_PUSH_TOKEN_FILE=/path/to/secret 指向真实 secret 文件,勿提交明文。token 配置与 paths 授权语义见 deploy-trunk.md §3。
docker/docker-compose-storage-only.auth-none.yml 是 opt-in 覆盖:与基础文件双 -f 组合,把 mega2 的配置重挂载为 config/config-storage-only.none.toml,并 --force-recreate mega2:
docker compose -p mega2-trunk \
-f docker/docker-compose-storage-only.yml \
-f docker/docker-compose-storage-only.auth-none.yml \
up -d --wait --force-recreate mega2警告:
push_auth=none等于匿名 receive-pack 以及匿名 LFS 上传,只适用于受控内网、回环或 Unix socket 前置的部署。绝不暴露到公网。切回 token:去掉第二个-f,再--force-recreate mega2。
默认后端是 RustFS(s3compatible),直接 up 即可。仅当把 mega2 改成本地文件系统后端时加 --env-file(RustFS 容器仍会启动,只切 mega2 的 storage_type):
docker compose -p mega2-trunk -f docker/docker-compose-storage-only.yml \
--env-file config/compose.env.storage-only.local up -d --waitenv 文件内容见 config/compose.env.storage-only.local;后端契约见 refactoring/orbit.md。
不想从源码构建时,可以直接用 Docker Hub 上的正式发布镜像 genedna/mega2:latest(评估栈 compose 文件拉取的就是它)。自行构建二进制:
cargo build --release -p mega2 # 产物 target/release/mega2Dockerfile 是同一产物的容器化:双阶段(rust:1.97-bookworm builder → debian:bookworm-slim runtime),配置拷入 /etc/mega2/config.toml,MEGA_BASE_DIR=/var/lib/mega2,EXPOSE 8000,ENTRYPOINT 为 mega2,默认 CMD 为 service http --host 0.0.0.0 -p 8000。
按需要选择 service 形态(CLI 全貌见 src/commands/mod.rs 与 AGENTS.md):
service http --host 0.0.0.0 -p 8000— 仅 HTTP(Dockerfile 默认)。service ssh— 仅 SSH(upload-pack)。service multi http ssh -p 8000 --ssh-port 2222— 单进程同时起 HTTP + SSH(compose 栈用法)。
进程管理:mega2 是单一长驻进程,用 systemd 或容器 restart policy 管理即可;状态全部在外部依赖(Postgres / Redis / 对象存储)与 MEGA_BASE_DIR 数据目录。配置热重载为 5s 轮询 watcher,只有白名单字段即时生效,其余字段报 restart_required(见 src/config/reload.rs)——改配置后留意日志,需要时重启进程。
| 依赖 | 说明 |
|---|---|
| PostgreSQL | 必需。compose 栈用 18.x。 |
| Redis | 必需。compose 栈用 8.x。 |
| 对象存储 | 必需,三选一:本地文件系统(storage_type="local",仅单节点)、S3 兼容(默认,RustFS / MinIO / 云 S3)、GCS。经 refactoring/orbit.md 的 build_object_storage 构建。 |
| Vault | 无外部服务:内嵌 Vault 来自 crates.io libvault + src/contract/vault/,见 refactoring/vault.md。 |
资源规格随仓库规模与推送并发而定;写路径全局串行(MonoWriteQueue),读路径水平伸缩受 Postgres / 对象存储限制。部署前用 mega2 --config <path> config validate(可加 --show-sources / --deny-warnings)验证配置,见 refactoring/config.md。
-
push_auth = "token",[[git.push_tokens]]用paths按组件边界收窄到最小范围;绝不把push_auth=none暴露到公网(见 §2.1 警告与deploy-trunk.md§3)。 - 凭据经
${file:...}文件挂载或 Vault SecretRef 注入;提交的config.toml不含明文(样例见config/config.toml)。 - 反向代理终止 TLS;
MEGA_HTTP__PUBLIC_BASE_URL与 LFS URL 指向外部 https 地址(HTTP 明文 registry 需客户端配 insecure registry,见refactoring/oci.md)。 -
log.print_std = false,日志落盘到mega_cache()/logs;compose 栈的print_std=true仅适合容器场景。 - 宿主端口绑定回环 / 内网地址,按需放行。
-
cedar.enforcement保持off(trunk 形态的启动前置,见deploy-trunk.md§1)。 - OCI
/v2与 Agent Capture 按需显式开启(缺省不挂载)。 - 备份三件套:Postgres dump、对象存储 bucket、
mega2 --config <path> config vault backup <destination>(Vault core key;恢复用config vault restore,见src/commands/config.rs)。
- 升级:替换镜像 / 二进制并重启。标注
restart_required的配置变更必须重启才生效。 - 形态切换(
review ↔ trunk)的启动前置(无 open CL、排空push_queue、显式push_auth)与索引水位重置,运维事实源是deploy-trunk.md§5,设计论证见refactoring/trunk-push.md。
- 健康检查:
GET /api/v1/status;compose healthcheck 用GET /api/openapi.json。 - 日志:
mega_cache()/logs下的小时滚动文件(log.print_std=true时走 stdout,compose 栈即如此)。 - API 目录:Swagger UI
/swagger-ui、OpenAPI JSON/api/openapi.json。 - 栈级冒烟:
scripts/git_protocol_smoke_storage_only.sh(Git 协议)与scripts/api_write_smoke_storage_only.sh(API 写 → Git 可见性),用法见deploy-trunk.md§8.1;OCI 冒烟scripts/oci_smoke_storage_only.sh(deploy-trunk.md§10.2)。
- 本套文档:
quick-start.zh.md·user-guide.zh.md·configuration.zh.md·architecture.zh.md·contributing.zh.md deploy-trunk.md— trunk / storage-only 运维事实源(鉴权、SSH、LFS、形态切换、OCI、smoke)。monorepo.md— 产品规则(唯一公开分支、不变式、tag 限制)。development.md— 本地开发与测试。config/config.toml+refactoring/config.md— 配置键与加载 / 校验语义。refactoring/orbit.md、refactoring/vault.md、refactoring/oci.md、refactoring/agent-capture.md— 各子系统契约。