Files in the top-level directory from the latest check-in
- .fossil-settings
- docs
- scripts
- server
- web
- AGENTS.md
- compose.yml
- Dockerfile
- README.md
Ollila
Ollila 是一个基于 Web 的 Fossil 仓库综合管理工具,用于创建、浏览、同步、备份、归档和托管 Fossil 仓库,并提供独立的系统账号体系。
功能
- 系统初始化、登录、账号与角色管理
- 新建 Fossil 仓库,并创建具有
setup权限的初始 Fossil 用户 - 仓库列表、描述、timeline 统计、最后更新时间与创建时间展示
- timeline 浏览与 Fossil 用户管理
- push、pull、clone、fork、镜像同步
- 备份、Git fast-export、归档与物理删除
- 每个受管仓库提供 Fossil Web UI 与 clone 服务入口
技术栈
- 后端:Gleam(Erlang target)、Wisp、Mist、SQLite
- 前端:Gleam(JavaScript target)、Lustre SPA
- 仓库操作:Fossil CLI
- 前端产物由后端静态托管
本项目自身由 Fossil 管理,不使用 Git。
Docker Compose 部署
项目提供 Dockerfile 与 compose.yml。Compose 默认运行本地已构建的 ollila:latest AMD64 镜像。构建阶段用 Erlang/OTP 27,运行时用 Ubuntu 24.04(GLIBC 2.39),以便直接使用 Fossil 官方 x64 包 fossil-linux-x64-20260801193352.tar.gz。该预编译包需要 GLIBC 2.38+,不能跑在 Debian Bookworm(GLIBC 2.36)上。
1. 启动
不需要 .env。会话签名密钥在首次启动时自动生成,并写入 data/ollila.db。
docker compose up -d
打开 http://localhost:8080。数据库里还没有系统账号时,页面进入首次安装(Setup),创建第一个管理员账号。
要改宿主机端口,启动时带上变量即可,例如 OLLILA_PORT=9090 docker compose up -d。
镜像启动入口会以 sh 执行 Gleam 导出的 shipment 脚本,避免该脚本 SPDX 文件头位于 shebang 前导致的 exec format error。
Dockerfile 下载 Gleam 时默认通过 https://ghfast.top/ 加速 GitHub Release;代理不可用会自动回退至 GitHub 官方地址。构建时可用 --build-arg GITHUB_PROXY= 换成其他代理,或设为空字符串关闭代理。
查看日志或停止服务:
docker compose logs -f
docker compose down
持久化目录
以下目录均位于 compose.yml 同级目录,并由 Compose 绑定挂载:
| 宿主机目录 | 容器目录 | 内容 |
|---|---|---|
./repositories/ |
/var/lib/ollila/repositories/ |
受管 Fossil .fossil 仓库文件 |
./backups/ |
/var/lib/ollila/backups/ |
通过 Ollila 创建的仓库备份 |
./data/ |
/var/lib/ollila/data/ |
Ollila SQLite 元数据数据库 ollila.db |
不要删除 data/,其中包含系统用户、会话、仓库元数据、任务、设置和会话签名密钥。迁移、更新或重建容器前,应备份 data/、repositories/ 与 backups/。
容器启动时会自动创建这些目录,并将其所有权修正为服务用户;宿主机无需手动执行 chown。升级至包含该行为的新镜像后,通过 docker compose up -d --force-recreate 重新创建容器即可。
AMD64 镜像构建与推送
构建后推送到镜像仓库:
docker buildx build \
--platform linux/amd64 \
--tag <registry>/<namespace>/ollila:<tag> \
--push \
.
compose.yml 已指定 platform: linux/amd64。若改为使用已推送镜像,将 Compose 中的 build 替换为对应 image 即可。
本地开发
环境要求
- Gleam 与 Erlang/OTP
- Node.js(前端构建)
- Fossil CLI
- macOS 或 Linux
构建与测试
# 构建 Lustre 前端,并复制到 server/priv/static/
sh scripts/build-web.sh
# 后端测试
cd server && gleam test
# 前端测试
cd web && gleam test
运行开发服务
sh scripts/build-web.sh
cd server && gleam run
默认监听 :8080。
配置
| 环境变量 | 默认值 | 说明 |
|---|---|---|
OLLILA_HOME |
~/.ollila |
Ollila 数据根目录 |
OLLILA_PORT |
8080 |
HTTP 监听端口 |
OLLILA_BIND |
0.0.0.0 |
HTTP 监听地址(Docker 部署需为 0.0.0.0) |
OLLILA_STORAGE_ROOT |
$OLLILA_HOME/repositories |
新建 Fossil 仓库的存放根目录 |
OLLILA_BACKUP_DIR |
$OLLILA_HOME/backups |
仓库备份目录 |
OLLILA_DB_PATH |
$OLLILA_HOME/ollila.db |
Ollila SQLite 元数据数据库 |
OLLILA_FOSSIL_PATH |
fossil |
Fossil CLI 可执行文件路径 |
OLLILA_SITE_NAME |
Ollila |
站点名称 |
OLLILA_SECRET_KEY_BASE |
首次启动自动生成 | 会话签名密钥。未设置时写入数据库;之后以数据库中的值为准 |
OLLILA_STATIC_DIR |
priv/static |
前端静态资源目录 |
管理员可通过「管理 → 全局设置」调整站点名称、仓库存储目录、备份目录和 Fossil 路径。修改存储目录只影响之后新建的仓库;已有仓库仍按数据库中记录的绝对路径访问。
路由与反向代理
/:未登录时是独立的公开页,可登录或注册普通账号;登录后进入管理台。还没有系统账号时进入首次安装/:id:对应仓库的 Fossil HTTP 服务与 Web UI/:id.fossil:不会作为静态文件下载
生产环境可将域名反向代理至 Ollila 的监听端口。Fossil clone 是否允许由各仓库内的 Fossil 权限配置决定。
备份与恢复
- 定期备份元数据库
ollila.db。 - 定期备份所有
.fossil文件,或使用管理台的仓库备份功能。 - 备份目录应位于不同于仓库存储目录的可靠存储介质。
- 恢复时先停止服务,再还原元数据库和仓库文件;仓库路径必须与元数据中的
path保持一致。
文档
docs/requirements.md:需求文档docs/technical-design.md:技术方案docs/task.md:开发任务清单docs/CONVENTIONS.md:Fossil 提交规范docs/error-handling.md:API 错误约定docs/regression.md:需求回归清单
提交规范
详见 docs/CONVENTIONS.md。提交前执行:
fossil addremove
fossil commit -m "feat(scope): subject"