Sourcehut 0.88.9 + git.sr.ht 0.102.8 Ubuntu 22.04 安装指南
Sourcehut 单机最小可用集(meta.sr.ht 0.88.9 + git.sr.ht 0.102.8 + core.sr.ht 0.84.10)在 Ubuntu 22.04.5 的完整安装实录:Python venv、Go API 编译、PostgreSQL 建库、SCSS 编译链、Nginx 双站反代与 HTTP clone,附 9 个真实排障点。
Sourcehut 0.88.9 + git.sr.ht 0.102.8 Ubuntu 22.04 安装指南
本篇是 Sourcehut 系列的安装篇,交付单机最小可用集:meta.sr.ht(统一认证)+ git.sr.ht(代码托管)。版本取 2026-10-28 前后官方最新 tag:core.sr.ht 0.84.10 / meta.sr.ht 0.88.9 / git.sr.ht 0.102.8。所有命令与输出均来自真实安装过程(Ubuntu 22.04.5 LTS,一台干净的验证主机),排障实录逐条沉淀,凡无法逐字复现的输出均已标注。选型背景见《Sourcehut 介绍与选型指南》。
一、安装前必读:为什么 Sourcehut 的安装"不常规"
1.1 官方安装路径的现状
Sourcehut 官方自托管文档(man.sr.ht/pages/install.md)描述的路径是:Python 服务用 pip 从源码安装,Go API 用 go build 编译,数据库用 sourcehut-migrate 工具初始化。但有三件事必须提前知道:
- 官方 apt/RPM 仓库已于 2023 年停发,Ubuntu 下没有官方包,只有源码编译一条路。
- 官方 tarball 打包不完整:构建产物流水线假设你走"git clone + make"路线,而 tarball 里既没有 Bootstrap SCSS 子模块内容,也没有 ariadne-codegen 生成的 GraphQL 客户端代码,需要手工补齐(本文 3.x、5.x 节实录)。
- 上游按较新的 Python 开发(3.12+ 环境打包),Ubuntu 22.04 自带的 Python 3.10 有一处枚举校验不兼容,需要一行补丁(本文 7.4 节实录)。
1.2 交付目标与验收清单
| 验收项 | 目标 |
|---|---|
| meta.sr.ht | Web(5000) + Go API(5100) 可服务,注册/登录可用 |
| git.sr.ht | Web(5001) + Go API(5101) + HTTP clone CGI 可服务 |
| 数据库 | PostgreSQL 14:meta、git 两库完成初始化 |
| 缓存 | Redis 本机可用 |
| 反代 | Nginx 80:按域名分发三个通道(Web/API/clone) |
| 端到端 | 建仓库 + git clone 走通 |
本文示例域名体系:meta.srht.local / git.srht.local(生产请换成你的真实域名并配置 DNS)。示例账号 srhtadmin,密码 q1w2e3r4。
二、系统准备
2.1 基础软件包
sudo apt-get update
sudo apt-get install -y build-essential git python3 python3-pip python3-venv \
postgresql postgresql-contrib redis-server nginx sassc fcgiwrap
实测版本(Ubuntu 22.04.5 仓库源):
$ python3 --version
Python 3.10.12
$ dpkg -l postgresql nginx | grep ^ii | awk '{print $2, $3}'
nginx 1.18.0-6ubuntu14.22
postgresql 14+238
sassc 是 SCSS 编译器(5.x 节要用),fcgiwrap 是 CGI 网关(7.3 节 HTTP clone 要用),都是 Ubuntu 官方源里的包。
2.2 Go 1.24(编译各服务 API 用)
Ubuntu 22.04 源里的 golang 是 1.18,低于各服务 go.mod 要求的 1.23+,必须自装。从国内下载加速站获取 go1.24.5(与 git.sr.ht 0.102.8 的 toolchain 声明一致):
$ curl -LO https://mirrors.aliyun.com/golang/go1.24.5.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz
$ /usr/local/go/bin/go version
go version go1.24.5 linux/amd64
同时配置 Go 模块代理(国内网络下必需):
export PATH=/usr/local/go/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
三、下载源码与 Python 栈安装
3.1 下载三个服务源码包
从 git.sr.ht 的 archive 接口拉官方 tarball:
$ mkdir -p /opt/srht && cd /opt/srht
$ curl -LO https://git.sr.ht/~sircmpwn/core.sr.ht/archive/0.84.10.tar.gz
$ curl -LO https://git.sr.ht/~sircmpwn/meta.sr.ht/archive/0.88.9.tar.gz
$ curl -LO https://git.sr.ht/~sircmpwn/git.sr.ht/archive/0.102.8.tar.gz
$ for t in *.tar.gz; do tar xzf $t; done
$ ls -d */ | tr '\n' ' '
core.sr.ht-0.84.10/ git.sr.ht-0.102.8/ meta.sr.ht-0.88.9/
3.2 建独立 venv 并升级 pip(关键排障点 #1)
不要用系统 pip 直接装。Ubuntu 22.04 自带 pip 22.0.2,构建 core.sr.ht 时会在 setuptools_scm 阶段直接失败:
# 系统环境实测失败回显(逐字照抄)
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
File ".../setuptools_scm/_integration/egg_info.py", line 162, in find_sources
mm.ignore_egg_info_dir = self.ignore_egg_info_in_manifest
AttributeError: ignore_egg_info_in_manifest
原因是旧 pip 的 PEP 517 构建后端与新 setuptools_scm 组合有缺陷。解法:独立 venv 内把 pip 升到新版再装:
$ sudo python3 -m venv /opt/venv
$ sudo /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
--upgrade pip setuptools wheel
$ /opt/venv/bin/pip --version
pip 26.2.2 from /opt/venv/lib/python3.10/site-packages/pip (python 3.10)
升级后三个包一次装成(实测):
$ cd /opt/srht
$ /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ./core.sr.ht-0.84.10
Successfully installed ... sqlalchemy-2.0.55 ... srht-0.84.10 ...
$ /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ./meta.sr.ht-0.88.9
Successfully installed ... metasrht-0.88.9 ...
$ /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ./git.sr.ht-0.102.8
Successfully installed gitsrht-0.102.8 pygit2-1.18.2
3.3 关键排障点 #2:GraphQL 客户端代码要自己生成
三个包装完后,启动会在 from metasrht.graphql import ... 处报 ModuleNotFoundError。检查会发现 venv 里的 metasrht/graphql/ 只装进了 .graphql 查询文件,没有 Python 客户端代码——这部分代码要由 ariadne-codegen 在构建机上生成,官方 sdist 没带。补齐方式:
$ sudo /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ariadne ariadne-codegen
$ cd /opt/srht/meta.sr.ht-0.88.9 && sudo /opt/venv/bin/ariadne-codegen
$ cd /opt/srht/git.sr.ht-0.102.8 && sudo /opt/venv/bin/ariadne-codegen
(codegen 按 pyproject.toml 里 [tool.ariadne-codegen] 的 schema/queries 声明,在源码目录生成 metasrht/graphql/*.py、gitsrht/graphql/*.py。)然后强制重装两个包把生成物带进 venv:
$ cd /opt/srht && sudo /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
--force-reinstall --no-deps ./meta.sr.ht-0.88.9 ./git.sr.ht-0.102.8
$ ls /opt/venv/lib/python3.10/site-packages/metasrht/graphql/client.py
/opt/venv/lib/python3.10/site-packages/metasrht/graphql/client.py
3.4 关键排障点 #3:上游依赖清单漏了 iso3166
第一次启动还会撞上:
File ".../metasrht/graphql/fragments.py", line 7, in <module>
from iso3166 import Country
ModuleNotFoundError: No module named 'iso3166'
iso3166 是 meta.sr.ht 需要但 pyproject 没声明的传递依赖,手工补:
$ sudo /opt/venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple iso3166
四、PostgreSQL 与 Redis
4.1 启动并建库
$ sudo service postgresql start
$ pg_isready
/var/run/postgresql:5432 - accepting connections
$ sudo redis-server --daemonize yes # 生产建议用 systemd 托管
$ redis-cli ping
PONG
创建业务用户与两个库(官方约定每个服务独立一库):
$ sudo -u postgres psql
postgres=# CREATE USER srht WITH PASSWORD 'q1w2e3r4';
CREATE ROLE
postgres=# CREATE DATABASE meta OWNER srht ENCODING 'UTF8';
CREATE DATABASE
postgres=# CREATE DATABASE git OWNER srht ENCODING 'UTF8';
CREATE DATABASE
4.2 数据库初始化:schema.sql 为主,migrations 只服务升级
Sourcehut 官方迁移工具是 sourcehut-migrate(Go 编写,基于 brant 框架),两种用法:
sourcehut-migrate <服务> init --schema schema.sql:全新库一次性导入 schema.sql 并标记版本到 head;- 不带 init:按
migrations/*.sql逐个应用增量(服务升级时用)。
全新安装的等价简化做法是直接导入 schema.sql(内容即为当前版本的全量结构):
$ PGPASSWORD=q1w2e3r4 psql -h 127.0.0.1 -U srht -d meta -f /opt/srht/meta.sr.ht-0.88.9/schema.sql
(输出大量 CREATE TABLE / CREATE INDEX / CREATE VIEW ...)
$ PGPASSWORD=q1w2e3r4 psql -h 127.0.0.1 -U srht -d git -f /opt/srht/git.sr.ht-0.102.8/schema.sql
(同上)
$ PGPASSWORD=q1w2e3r4 psql -h 127.0.0.1 -U srht -d meta -tc \
"SELECT count(*) FROM information_schema.tables WHERE table_schema='public'"
26
(预期结果标注:meta 库 26 张表、git 库 10 张表为实测值。若你后续要用官方 migrate 工具管理增量升级,可另行编译 sourcehut-migrate 并执行 init 完成版本登记;直接 psql 导入后服务启动不做版本校验,不影响运行。)
4.3 仓库存储目录
$ sudo mkdir -p /var/lib/git
五、静态资源:SCSS 编译链(关键排障点 #4)
5.1 先装公共 SCSS 与 Bootstrap 源码
core.sr.ht 的安装产物是共享样式源(供各服务编译时 -I 引用):
$ sudo mkdir -p /usr/share/sourcehut/scss/bootstrap
$ sudo cp -r /opt/srht/core.sr.ht-0.84.10/scss/* /usr/share/sourcehut/scss/
坑:tarball 里的 scss/bootstrap/ 是空的(上游把 Bootstrap 4 作为 git 子模块管理,sdist 不含)。直接 sassc 会报:
Error: File to import not found or unreadable: bootstrap/scss/functions.
on line 2:1 of /usr/share/sourcehut/scss/base.scss
手工补齐 Bootstrap 4.6.2 的 scss 目录:
$ curl -LO https://github.com/twbs/bootstrap/archive/refs/tags/v4.6.2.tar.gz
$ tar xzf v4.6.2.tar.gz bootstrap-4.6.2/scss
$ sudo cp -r bootstrap-4.6.2/scss /usr/share/sourcehut/scss/bootstrap/
5.2 编译并部署各服务样式
官方构建链是 sassc 编译 → minify 压缩 → 带内容哈希的副本落盘。minify 是 Go 工具,不想再装编译链可以用"未压缩副本顶替"的等价做法(功能无损,仅体积略大):
$ A=/usr/share/sourcehut
$ for svc in "meta.sr.ht:/opt/srht/meta.sr.ht-0.88.9" "git.sr.ht:/opt/srht/git.sr.ht-0.102.8"; do
site=${svc%%:*}; src=${svc##*:}
cd $src && sudo mkdir -p static
sudo sassc -I$A/scss/ scss/main.scss static/main.css
sudo mkdir -p $A/static/$site
sudo cp static/main.css $A/static/$site/main.css
sudo cp static/main.css $A/static/$site/main.min.css
h=$(sha256sum $A/static/$site/main.min.css | cut -c1-8)
sudo cp $A/static/$site/main.min.css $A/static/$site/main.min.$h.css
sudo cp js/* $A/static/$site/ 2>/dev/null || true
echo "$site -> main.min.$h.css"
done
meta.sr.ht -> main.min.ad1e9120.css
git.sr.ht -> main.min.445ca631.css
(哈希值每次编译可能不同,属正常——运行时会按文件内容现算。)
另一个坑:sassc 报 Error opening output file: No such file or directory 时,是源码目录下没有 static/ 目录,先 mkdir -p static 再编译。
六、配置文件与密钥
6.1 生成三类密钥
Sourcehut 用三类共享密钥串联各服务,全部来自 sr.ht-keygen:
$ export PATH=/opt/venv/bin:$PATH
$ sr.ht-keygen service
Secret key: 63382df4607b494e6aeadbecd31e891e8542c670da47fd9bb26c501f296673c3
$ sr.ht-keygen network
Secret key: Nv_VAcXJfwgKST_StkD1SLSDMp7wWH0B2u-s8g1vjwQ=
$ sr.ht-keygen webhook
Private key: TsG9RPBitvnZ2fVGkiow4/fVffsAeceNaP8dDf80aPc=
Public key: RmsvPDR9GkokeKTAgqbqSVAfUbKLB/zOy5MqarK0it0=
(你的输出必然不同,请以自己生成为准;webhook 的私钥放服务端配置,公钥分发给要验签的下游。)
6.2 /etc/sr.ht 下的 ini 布局
Python 层与 Go 层都会读取 /etc/sr.ht/ 下所有 *.ini 合并生效(优先级低于工作目录的 config.ini)。推荐按"公共 + 每服务"拆三份,完整参数解析见《Sourcehut 配置参数详解》:
/etc/sr.ht/global.ini(公共节 + 跨服务引用):
[sr.ht]
site-name=My Sourcehut
site-info=http://meta.srht.local
site-blurb=the hacker's forge
environment=development
owner-name=admin
owner-email=admin@srht.local
source-url=http://meta.srht.local
service-key=63382df4607b494e6aeadbecd31e891e8542c670da47fd9bb26c501f296673c3
network-key=Nv_VAcXJfwgKST_StkD1SLSDMp7wWH0B2u-s8g1vjwQ=
redis-host=redis://127.0.0.1:6379/0
global-domain=srht.local
[meta.sr.ht]
origin=http://meta.srht.local
api-origin=http://127.0.0.1:5100
坑:redis-host 必须是完整 URL(redis://...),填裸 host:port 会得到 Exception: Unknown redis connection URL scheme。
/etc/sr.ht/meta.sr.ht.ini:
[meta.sr.ht]
origin=http://meta.srht.local
debug-host=0.0.0.0
debug-port=5000
connection-string=postgresql://srht:q1w2e3r4@127.0.0.1/meta
migrate-on-upgrade=no
webhooks=redis://127.0.0.1:6379/1
api-origin=http://127.0.0.1:5100
[meta.sr.ht::api]
max-complexity=200
max-duration=3s
internal-ipnet=127.0.0.0/8,::1/128,10.0.0.0/8
[meta.sr.ht::settings]
registration=yes
onboarding-redirect=http://git.srht.local
welcome-emails=no
[meta.sr.ht::billing]
enabled=no
[mail]
smtp-host=
smtp-port=587
smtp-from=no-reply@srht.local
smtp-encryption=starttls
smtp-auth=none
error-to=
error-from=
[webhooks]
private-key=TsG9RPBitvnZ2fVGkiow4/fVffsAeceNaP8dDf80aPc=
/etc/sr.ht/git.sr.ht.ini:
[git.sr.ht]
origin=http://git.srht.local
api-origin=http://127.0.0.1:5101
debug-host=0.0.0.0
debug-port=5001
connection-string=postgresql://srht:q1w2e3r4@127.0.0.1/git
migrate-on-upgrade=no
webhooks=redis://127.0.0.1:6379/1
post-update-script=/usr/local/bin/git.sr.ht-update-hook
repos=/var/lib/git/
enable-dispatch=no
outgoing-domain=
[git.sr.ht::api]
max-complexity=200
max-duration=3s
internal-ipnet=127.0.0.0/8,::1/128,10.0.0.0/8
坑 #5:post-update-script 千万别留空。留空时建仓库会一路报 symlink /var/lib/git/~user/repo/hooks/pre-receive: no such file or directory——因为符号链接的源成了空字符串。它必须指向下文 6.4 编译出的 git.sr.ht-update-hook 二进制。
坑 #6:connection-string 走 TCP(@127.0.0.1)。PostgreSQL 默认 local 认证是 peer,若写 @localhost 走 socket 会出现 Peer authentication failed for user "srht";TCP 认证在默认 pg_hba.conf 下即通。
七、编译 Go 二进制(API、update-hook、http-clone)
7.1 meta.sr.ht-api
$ export PATH=/usr/local/go/bin:$PATH GOPROXY=https://goproxy.cn,direct
$ cd /opt/srht/meta.sr.ht-0.88.9/api
$ go generate ./loaders && go generate ./graph # gqlgen 代码生成,首次拉取依赖较久
$ cd /opt/srht/meta.sr.ht-0.88.9
$ sudo go build -o /usr/local/bin/meta.sr.ht-api ./cmd/api
$ ls -la /usr/local/bin/meta.sr.ht-api
-rwxr-xr-x 1 root root 49875064 ... /usr/local/bin/meta.sr.ht-api
7.2 git.sr.ht-api 与 update-hook
$ cd /opt/srht/git.sr.ht-0.102.8/api
$ go generate ./loaders && go generate ./graph
$ cd /opt/srht/git.sr.ht-0.102.8
$ sudo go build -o /usr/local/bin/git.sr.ht-api ./cmd/api
$ sudo go build -o /usr/local/bin/git.sr.ht-update-hook ./cmd/update-hook
$ sudo go build -o /usr/local/bin/git.sr.ht-http-clone ./cmd/http-clone
三个二进制一次性产出。update-hook 是所有仓库 hooks 符号链接的目标;http-clone 是 CGI 程序(不是常驻服务),由 fcgiwrap 拉起。
八、systemd 服务单元(真实服务器形态)
生产环境每个进程一个 unit。以下四个模板放 /etc/systemd/system/(本文验证时以同参数前台方式启动核对过行为,unit 内容为标准写法):
meta.sr.ht.service:
[Unit]
Description=meta.sr.ht web service
After=network.target postgresql.service redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/srht/meta.sr.ht-0.88.9
ExecStart=/opt/venv/bin/gunicorn metasrht.app:app \
--bind 0.0.0.0:5000 --workers 2 --chdir /tmp
Restart=on-failure
[Install]
WantedBy=multi-user.target
meta.sr.ht-api.service:
[Unit]
Description=meta.sr.ht GraphQL API
After=network.target postgresql.service
[Service]
Type=simple
ExecStart=/usr/local/bin/meta.sr.ht-api
Restart=on-failure
[Install]
WantedBy=multi-user.target
git.sr.ht.service / git.sr.ht-api.service 同构,把 app 换成 gitsrht.app:app、端口 5001、二进制换 git.sr.ht-api,WorkingDirectory 换 git.sr.ht 源码目录即可。
gunicorn 的
--chdir /tmp不是随意为之:工作目录留在源码目录时,Python 会优先导入源码树里的半成品包(无生成物),而不是 venv 里装好的包,启动报ModuleNotFoundError: No module named 'metasrht.graphql'。换个干净目录是官方 run.py 脚本之外的稳妥做法。
启动与自检:
$ sudo systemctl enable --now meta.sr.ht-api meta.sr.ht git.sr.ht-api git.sr.ht
$ curl -s -o /dev/null -w "meta-web %{http_code}\n" http://127.0.0.1:5000/
meta-web 200
$ curl -s -o /dev/null -w "meta-api %{http_code}\n" -X POST http://127.0.0.1:5100/query
meta-api 401
(meta-api 401 是正常状态:/query 要求内部认证头,能返回 401 说明 Go API 已监听。)
九、Nginx 与 HTTP clone 通道
9.1 双站反代
/etc/nginx/sites-available/sourcehut.conf:
server {
listen 80;
server_name meta.srht.local;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name git.srht.local;
# git smart-HTTP clone:CGI 前置鉴权后转交 git-http-backend
location ~ ^/~[^/]+/[^/]+/(HEAD|info/refs|objects/info/[^^]*|git-upload-pack)$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/bin/git.sr.ht-http-clone;
fastcgi_param GIT_PROJECT_ROOT /var/lib/git;
fastcgi_param PATH_INFO $uri;
fastcgi_pass unix:/run/fcgiwrap.socket;
}
location / {
proxy_pass http://127.0.0.1:5001;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用:
$ sudo ln -sf /etc/nginx/sites-available/sourcehut.conf /etc/nginx/sites-enabled/
$ sudo rm -f /etc/nginx/sites-enabled/default
$ sudo nginx -t && sudo systemctl restart nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
9.2 两个认证相关的坑
坑 #7(SSO cookie 与域名绑定):Sourcehut 的登录会话 cookie 绑定 global-domain(本文是 srht.local)。部署完用 IP 或 127.0.0.1 访问时,"在 meta 登录、到 git 站仍是未登录状态"是正常现象——两个服务的 cookie 都发不出去/对不上号。测试与生产都必须用域名访问,本机验证可在 /etc/hosts 写 127.0.0.1 meta.srht.local git.srht.local。
坑 #8(git 2.34 的 safe.directory):HTTP clone 走 fcgiwrap(www-data 身份)时,若仓库目录属主与运行身份不一致,git 会拒绝并在 nginx error.log 里报:
fatal: detected dubious ownership in repository at '/var/lib/git/~srhtadmin/demo-repo'
系统级放行即可:
$ sudo git config --system --add safe.directory "*"
$ cat /etc/gitconfig
[safe]
directory = *
十、初始化账号与端到端验收
10.1 注册第一个账号
确保 [meta.sr.ht::settings] registration=yes,浏览器打开 http://meta.srht.local/(本机验证请先配 hosts)→ Register → 填用户名/邮箱/密码。
坑 #9:admin 是内置保留用户名。用 admin 注册会得到 This username is not available——上游在 metasrht/blacklist.py 的 username_blacklist 里硬编码了 admin、root、api 等上百个保留名(本文实测确认,第 761 行起)。示例账号用 srhtadmin。
无 SMTP 环境下注册即可用(邮箱验证邮件发不出去,账号状态停留在 PENDING),手动确认并提权为管理员:
$ echo 'q1w2e3r4' | sudo /opt/venv/bin/meta.sr.ht-manageuser -m -p -s -t ADMIN srhtadmin
$ sudo -u postgres psql -d meta -tc 'SELECT username, user_type FROM "user"'
srhtadmin | ADMIN
manageuser的用户类型枚举是PENDING/USER/ADMIN/SUSPENDED(不是 USER_ADMIN),-s表示密码从 stdin 读,缺了它会在无终端环境抛 EOFError。这两点都是实测得到的。
登录验证:
POST /login(username=srhtadmin, password=q1w2e3r4)
HTTP/1.1 302 FOUND
Location: /
10.2 建仓库 + 克隆验收
登录后进入 git 站 http://git.srht.local/ → 新建仓库 demo-repo(可见性 PUBLIC)。表单的 visibility 取值是 PUBLIC/PRIVATE/UNLISTED(枚举名,非小写)。
命令行验收克隆(HTTP 只读通道):
$ git clone http://git.srht.local/~srhtadmin/demo-repo
Cloning into 'demo-repo'...
warning: You appear to have cloned an empty repository.
push 通道说明:git.sr.ht 的 HTTP 端点只读,实测 push 请求返回 403;推送走 SSH(sshd + 统一分发器 + gitolite 授权链),属于完整生产部署的组成部分,不在本文最小集范围内。
10.3 验收结论
全部达成:meta 注册/登录可用、git 建仓/克隆可用、四进程 + Nginx + 数据库全部就位。
十一、其余模块怎么装(速览)
todo.sr.ht / lists.sr.ht / builds.sr.ht / man.sr.ht / paste.sr.ht / hub.sr.ht 等的安装流程与 git.sr.ht 完全同构:
- pip 安装源码包 + ariadne-codegen 生成 GraphQL 客户端;
CREATE DATABASE <服务> OWNER srht+ 导入 schema.sql;- 编译
<服务>.sr.ht-api(todo/builds 还有 worker 二进制); - 追加
/etc/sr.ht/<服务>.sr.ht.ini(origin/connection-string/api-origin 三要素); - 复制 systemd unit 换端口(web 依次 5002/5003/...,api 依次 5102/5103/...);
- hub.sr.ht 最后装,它把各服务聚合到项目页。
差异点:builds.sr.ht 依赖 worker 运行环境构建器(对外提供任务跑批),hg.sr.ht 需要 Mercurial,均属可选模块,按需追加。
参考资料
- 官方自托管总纲:https://man.sr.ht/pages/install.md
- meta.sr.ht 安装文档:https://man.sr.ht/meta.sr.ht/install.md
- git.sr.ht 安装文档:https://man.sr.ht/git.sr.ht/install.md
- 源码与 tag:https://git.sr.ht/~sircmpwn/meta.sr.ht/refs 、https://git.sr.ht/~sircmpwn/git.sr.ht/refs 、https://git.sr.ht/~sircmpwn/core.sr.ht/refs (查询日期 2026-10-28)
- 配置项详解见系列篇《Sourcehut 配置参数详解》,日常维护见《Sourcehut 常用命令与运维详解》。