ollila  Top-level Files of tip

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 权限配置决定。

备份与恢复

  1. 定期备份元数据库 ollila.db。
  2. 定期备份所有 .fossil 文件,或使用管理台的仓库备份功能。
  3. 备份目录应位于不同于仓库存储目录的可靠存储介质。
  4. 恢复时先停止服务,再还原元数据库和仓库文件;仓库路径必须与元数据中的 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"