Ubuntu 安装 Gitea 详细教程:自建 Git 服务与 Docker/apt/yum 包仓库全方案
内网开发最常用的一套组合:Gitea 管代码,Gitea 自带的包仓库管镜像和安装包——Docker 镜像、deb、rpm 全放在一个地方,内网机器统一从这里拉。本文以 Gitea 28.3.0 为例,在 Ubuntu 24.04 LTS 上从零装起:二进制安装、systemd 托管、Nginx 反代 + HTTPS,再把包仓库的三大件——Docker 镜像仓库、apt 源(Debian 仓库)、yum/dnf 源(RPM 仓库)——逐个打通,最后讲备份升级和排障。22.04 照着做也一样。
1. Gitea 是什么,先说清“代理源”这件事
Gitea 是一个用 Go 写的轻量自建 Git 服务,GitHub 的平替,单二进制就能跑。除了管代码,它从 1.17 开始内置了包仓库(Package Registry),一个实例就能同时当 Docker 镜像仓库、apt 源、yum 源用,客户端(docker、apt、dnf)直接指过来就行。
先把一个容易误会的概念说清楚:Gitea 的包仓库是 hosted 仓库——你把自己的镜像和安装包传上去,内网机器从它这里拉。它不缓存上游,也就是不能像 Nexus、Artifactory 那样去代理 Docker Hub、Ubuntu 官方源。如果你的需求是“内网机器拉不到外网,想让 Gitea 帮忙缓存上游”,那不是 Gitea 的活:Docker Hub 缓存用官方 registry:2 的 pull-through 模式,Ubuntu 源缓存用 apt-cacher-ng。Gitea 负责的是你自己的东西:自研镜像、自打的 deb/rpm 包、内部工具链。
| 包类型 | 客户端 | 本文讲不讲 |
|---|---|---|
| Container(Docker/OCI 镜像) | docker、podman、helm | 重点讲(第 7 节) |
| Debian | apt | 重点讲(第 8 节) |
| RPM | yum、dnf、zypper | 重点讲(第 9 节) |
| npm、PyPI、Maven、NuGet、Helm、Cargo、Generic 等 | 各语言自带客户端 | 第 10 节一句话速览 |
2. 环境与准备
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 24.04 LTS(22.04 也一样),64 位 x86_64 或 aarch64 |
| Git 版本 | 2.25 以上(Gitea 28 的硬性要求;Ubuntu 24.04 自带 Git 2.43,满足) |
| 域名 | 一个能解析到这台机器的域名,如 git.example.com(没域名先用 IP 也能跑,但 Docker 登录和 HTTPS 会受影响,第 7.4 节会讲) |
| 端口 | 80、443(Nginx),3000(Gitea 自身,内网监听即可),22(SSH 克隆,可选) |
| 磁盘 | 仓库 + 镜像 + 安装包都存在 /var/lib/gitea,视规模预留,建议 50GB 起 |
| 数据库 | 小团队直接用 SQLite(零配置);生产多人用 PostgreSQL(第 4.4 节) |
# 更新系统,装好依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl ca-certificates gnupg sqlite3 nginx
git --version # 应为 2.25 以上
3. 安装 Gitea 二进制
Ubuntu 没有 Gitea 官方 apt 源(不要用第三方 PPA),标准装法是下载官方二进制。当前最新版是 28.3.0(2026 年 11 月发布;Gitea 从 1.27 之后去掉了版本号里的“1.”前缀,1.27 的下一版就是 28.0.0)。想装更新的版本,先查最新号再替换:
# 查最新版本(dl.gitea.com 官方 version.json)
curl -s https://dl.gitea.com/gitea/version.json | python3 -c 'import sys,json; print(json.load(sys.stdin)["latest"]["version"])'
# 输出:28.3.0
# 下载二进制与校验文件(x86_64;ARM 机器把 amd64 换成 arm64)
GITEA_VER=28.3.0
wget https://dl.gitea.com/gitea/${GITEA_VER}/gitea-${GITEA_VER}-linux-amd64 -O /tmp/gitea
wget https://dl.gitea.com/gitea/${GITEA_VER}/gitea-${GITEA_VER}-linux-amd64.sha256 -O /tmp/gitea.sha256
# 校验(必须对上,否则不要往下装)
cd /tmp && sha256sum -c gitea.sha256
# 输出:gitea-28.3.0-linux-amd64: OK(文件名以实际为准)
# 创建 git 专用用户与目录
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' \
--group --disabled-password --home /home/git git
sudo mkdir -p /var/lib/gitea/{custom,data,log} /etc/gitea
sudo chown -R git:git /var/lib/gitea /etc/gitea
sudo chmod -R 750 /var/lib/gitea
sudo chmod 770 /etc/gitea
# 安装二进制
sudo install -m 755 /tmp/gitea /usr/local/bin/gitea
/usr/local/bin/gitea --version
# 输出:Gitea version 28.3.0 built with GNU Make 4.4.1, go1.2x.x
3.1 写 systemd 服务文件
sudo tee /etc/systemd/system/gitea.service > /dev/null <<'EOF'
[Unit]
Description=Gitea
After=network.target
Wants=network.target
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable gitea
先别启动——第一次启动前要先有配置文件,或者走 Web 安装向导。两种方式下一节讲。
4. 首次配置:Web 向导与 app.ini
4.1 方式一:Web 安装向导(推荐新手)
sudo systemctl start gitea
# 浏览器打开 http://服务器IP:3000,按向导填:
# 数据库类型:SQLite3(默认,数据库路径 /var/lib/gitea/data/gitea.db)
# 站点标题:如“内部 Git 服务”
# 仓库根目录:/var/lib/gitea/data/gitea-repositories
# 服务器域名:git.example.com(有域名填域名,没域名先填 IP)
# Gitea 基本 URL:http://git.example.com:3000/(配好反代后改成 https://git.example.com/)
# 管理员账号:现在就建一个 admin 账号(用户名、密码、邮箱)
点“立即安装”,Gitea 会把配置写进 /etc/gitea/app.ini 并自动重启。装完先别急着用,往下看 4.3 节把关键配置改对。
4.2 方式二:命令行建管理员(无人值守)
不想开浏览器,也可以在命令行直接建管理员账号(适合写进自动化脚本):
sudo -u git /usr/local/bin/gitea admin user create \
--username admin --password '你的强密码' --email admin@example.com --admin \
-c /etc/gitea/app.ini
4.3 app.ini 关键配置
不管用哪种方式装,装完都要检查这几个配置。改完重启 Gitea 生效(sudo systemctl restart gitea):
[server]
HTTP_PORT = 3000
DOMAIN = git.example.com
ROOT_URL = https://git.example.com/
; ROOT_URL 是最容易错的一项:它决定了仓库页上显示的克隆地址,
; 一定要写用户最终访问的地址(反代后的 https 域名),不能写 127.0.0.1:3000
DISABLE_SSH = false
SSH_PORT = 22
LFS_START_SERVER = true
[database]
DB_TYPE = sqlite3
PATH = /var/lib/gitea/data/gitea.db
[service]
; 公网暴露时关掉公开注册,只留管理员手动加人
DISABLE_REGISTRATION = true
DEFAULT_KEEP_EMAIL_PRIVATE = true
[packages]
; 包仓库默认就是开的,这里显式写出来是让意图明确
ENABLED = true
[security]
INSTALL_LOCK = true
SECRET_KEY = 安装时自动生成的随机串,不要动它
4.4 生产环境建议用 PostgreSQL
SQLite 对几十人的小团队完全够用;人多、仓库多、包仓库流量大时,换 PostgreSQL 更稳。Ubuntu 24.04 自带 PostgreSQL 16:
sudo apt install -y postgresql
sudo -u postgres psql -c "CREATE USER gitea WITH PASSWORD 'gitea强密码';"
sudo -u postgres psql -c "CREATE DATABASE gitea OWNER gitea;"
然后在 app.ini 的 [database] 段改成:
[database]
DB_TYPE = postgres
HOST = 127.0.0.1:5432
NAME = gitea
USER = gitea
PASSWD = gitea强密码
SSL_MODE = disable
注意:换数据库必须在首次安装之前决定,装好之后再换库要导数据,别等数据跑起来才换。
5. Nginx 反代 + HTTPS
Gitea 自身只监听 3000,生产上前面挂 Nginx 做反代和 HTTPS。先拿证书(有公网域名用 Let's Encrypt,没有就按下面自签一段做内网用):
# 公网域名:Let's Encrypt 免费证书
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d git.example.com
# 按提示走完,证书在 /etc/letsencrypt/live/git.example.com/
# 纯内网域名:自签证书(浏览器会报不安全,内网自用可以接受)
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/git.example.com.key \
-out /etc/nginx/ssl/git.example.com.crt \
-subj "/CN=git.example.com"
server {
listen 80;
server_name git.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name git.example.com;
ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
# 内网自签证书时把上面两行换成 /etc/nginx/ssl/ 下的 crt/key
# 关键:包仓库要传大文件(镜像、安装包),默认 1m 会报 413
client_max_body_size 512m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo nginx -t && sudo systemctl reload nginx
# 验证:浏览器打开 https://git.example.com,应看到 Gitea 登录页
# 同时把 app.ini 里的 ROOT_URL 改成 https://git.example.com/ 并重启 Gitea
sudo systemctl restart gitea
curl -s -o /dev/null -w "%{http_code}\n" https://git.example.com/api/v1/version
6. 包仓库总览与访问令牌
包仓库默认就是开的,不用专门启用。包属于某个用户或组织(不是某个仓库),读权限跟着包所属用户/组织的可见性走;写权限只有所有者本人(组织则是团队里有包写权限的成员)。所有上传、下载都要用访问令牌(Access Token),不要用登录密码:
# 创建令牌(网页操作):
# 右上角头像 → 设置 → 应用 → 生成新令牌
# 权限至少勾选:package(读/写都要用到)
# 注意:令牌只显示一次,创建完立刻复制保存好,丢了只能重新生成
# 2FA 用户必须用令牌,登录密码在包仓库接口上是行不通的
下面三节都用同一个约定:Gitea 域名是 git.example.com,包的 owner 是 ops(可以是你自己的用户名,也可以是一个组织名),令牌存在环境变量里用:
export GITEA_HOST=git.example.com
export GITEA_OWNER=ops
export GITEA_TOKEN=你的令牌
7. Docker 镜像仓库
Gitea 的容器仓库遵循 OCI 规范,docker、podman、helm 都能用。镜像命名必须是 {域名}/{owner}/{镜像名}:{标签} 这种三段式——没有 Docker Hub 那种 library/nginx 的简写。
7.1 登录、推送、拉取
# 1. 登录(用户名是 Gitea 用户名,密码填访问令牌)
docker login git.example.com
# Username: ops
# Password: <粘贴令牌>
# Login Succeeded
# 2. 给本地镜像打上 Gitea 的命名
docker build -t git.example.com/ops/webapp:1.0.0 .
# 已有镜像直接改名也行:
docker tag nginx:1.25.4 git.example.com/ops/nginx:1.25.4
# 3. 推送
docker push git.example.com/ops/webapp:1.0.0
docker push git.example.com/ops/nginx:1.25.4
# 4. 在别的机器上拉取(公开仓库不用登录,私有仓库先 docker login)
docker pull git.example.com/ops/webapp:1.0.0
推上去的镜像在网页端 https://git.example.com/ops/-/packages 里能看到,可以点进详情看每一层、删版本。也可以把某个包关联到指定仓库,仓库页的 Packages 栏就会显示它。
7.2 给内网机器配好:compose 里直接引用
# compose.yaml(内网部署时直接引用 Gitea 上的镜像)
services:
webapp:
image: git.example.com/ops/webapp:1.0.0
ports:
- "8080:80"
restart: unless-stopped
# 私有仓库的机器先登录一次(登录信息存在 ~/.docker/config.json,之后不用重复登)
docker login git.example.com
docker compose up -d
7.3 镜像版本管理习惯
- 每次发版打一个语义化标签(
1.0.0、1.0.1),再顺手打一个latest浮动标签,别只推latest,回滚时找不到旧版。 - 包一旦发布就不能改,只能删了重传;发错版本先在网页端删掉那个版本再重新推。
- 网页端可以按包设清理规则(比如只保留最近 10 个版本),镜像攒多了记得开清理,不然磁盘涨得很快。
7.4 没 HTTPS 时的注意点
Docker 客户端默认只认 HTTPS。如果你的 Gitea 是内网纯 HTTP(比如 http://192.168.1.10:3000),docker login 会报 server gave HTTP response to HTTPS client。每台客户端都要加 insecure 配置:
# 客户端 /etc/docker/daemon.json 里加一行
# "insecure-registries": ["192.168.1.10:3000"]
sudo systemctl restart docker
docker login 192.168.1.10:3000
这只是实验室的凑合办法,生产环境还是把 HTTPS 配好(第 5 节),省得每台机器都改 daemon.json。
8. apt 源:Debian 仓库
把自打的 .deb 包传到 Gitea,内网 Ubuntu/Debian 机器就能像用官方源一样 apt install。Gitea 会自动生成仓库索引并用 PGP 签名,客户端要先信任这个签名。
8.1 先做一个测试 .deb 包
# 用 dpkg-deb 做一个最小的测试包(内含一个 /usr/bin/hello 脚本)
mkdir -p /tmp/hello-pkg/DEBIAN /tmp/hello-pkg/usr/bin
cat > /tmp/hello-pkg/DEBIAN/control <<'EOF'
Package: hello-gitea
Version: 1.0.0
Section: base
Priority: optional
Architecture: amd64
Maintainer: ops <ops@example.com>
Description: Gitea Debian 仓库测试包
EOF
cat > /tmp/hello-pkg/usr/bin/hello-gitea <<'EOF'
#!/bin/sh
echo "hello from gitea debian repo"
EOF
chmod +x /tmp/hello-pkg/usr/bin/hello-gitea
dpkg-deb --build /tmp/hello-pkg /tmp/hello-gitea_1.0.0_amd64.deb
ls -lh /tmp/hello-gitea_1.0.0_amd64.deb
8.2 上传到 Gitea
# PUT 上传:distribution 一般用系统代号(如 noble、jammy),component 用 main
curl --user ops:${GITEA_TOKEN} \
--upload-file /tmp/hello-gitea_1.0.0_amd64.deb \
https://git.example.com/api/packages/ops/debian/pool/noble/main/upload
# 成功返回 201 Created
# 同名、同版本、同 distribution、同 component、同架构的包已存在会报 409,
# 要先在网页端删掉旧版再传
8.3 客户端配置 apt 源
# 1. 下载 Gitea 的 PGP 公钥(仓库文件就是用它签的)
sudo mkdir -p /etc/apt/keyrings
sudo curl https://git.example.com/api/packages/ops/debian/repository.key \
-o /etc/apt/keyrings/gitea-ops.asc
# 2. 加源(distribution 和 component 必须和上传时一致)
echo "deb [signed-by=/etc/apt/keyrings/gitea-ops.asc] https://git.example.com/api/packages/ops/debian noble main" \
| sudo tee /etc/apt/sources.list.d/gitea.list
# 私有仓库的写法(URL 里带上用户名和令牌):
# echo "deb [signed-by=/etc/apt/keyrings/gitea-ops.asc] https://ops:${GITEA_TOKEN}@git.example.com/api/packages/ops/debian noble main" \
# | sudo tee /etc/apt/sources.list.d/gitea.list
# 3. 更新索引并安装
sudo apt update
sudo apt install hello-gitea
hello-gitea
# 输出:hello from gitea debian repo
# 指定版本安装:
sudo apt install hello-gitea=1.0.0
8.4 删除包
curl --user ops:${GITEA_TOKEN} -X DELETE \
https://git.example.com/api/packages/ops/debian/pool/noble/main/hello-gitea/1.0.0/amd64
# 成功返回 204 No Content(包没文件了,版本也会一起删掉)
9. yum / dnf 源:RPM 仓库
RPM 仓库的路子和 Debian 一样,只是客户端换成 yum/dnf。Gitea 用 group 来区分不同系统(比如 el7、rocky/el9、test/fc38),group 可以为空,不填就是全部混在一起。
9.1 上传 .rpm 包
# 不带 group 的上传
curl --user ops:${GITEA_TOKEN} \
--upload-file /path/to/example-1.0.0-1.el9.x86_64.rpm \
https://git.example.com/api/packages/ops/rpm/upload
# 成功返回 201 Created;同名文件重复上传报 409,先删旧版再传
# 按系统分组上传(推荐:el9 的包和 el7 的包分开)
curl --user ops:${GITEA_TOKEN} \
--upload-file /path/to/example-1.0.0-1.el9.x86_64.rpm \
https://git.example.com/api/packages/ops/rpm/rocky/el9/upload
测试用的 rpm 去哪找:在 Rocky/RHEL 机器上 dnf download example 就能拿到现成的 rpm;自己打的包用 rpmbuild 生成。
9.2 客户端配置 yum/dnf 源
# 不带 group
sudo dnf config-manager --add-repo https://git.example.com/api/packages/ops/rpm.repo
# 带 group(和上传时用的 group 对应)
sudo dnf config-manager --add-repo https://git.example.com/api/packages/ops/rpm/rocky/el9.repo
# 私有仓库:URL 里带上用户名和令牌,并且要同步改 /etc/yum.repos.d/ 里生成的 .repo 文件,
# 把 baseurl 也加上同样的用户名和令牌,否则 dnf 能加源却拉不到包
sudo dnf config-manager --add-repo https://ops:${GITEA_TOKEN}@git.example.com/api/packages/ops/rpm/rocky/el9.repo
# 验证并安装
sudo dnf makecache
sudo dnf install example
# 指定版本:
sudo dnf install example-1.0.0-1.el9.x86_64
9.3 删除包
curl --user ops:${GITEA_TOKEN} -X DELETE \
https://git.example.com/api/packages/ops/rpm/rocky/el9/package/example/1.0.0/x86_64
# 成功返回 204 No Content
10. 其他包类型一句话速览
三大件之外,Gitea 的包仓库还支持很多类型,配置思路都一样(令牌 + 对应客户端命令),这里列一张表备查:
| 类型 | 客户端命令示例 |
|---|---|
| npm | npm publish / npm install(先 npm login --registry=https://git.example.com/api/packages/ops/npm/) |
| PyPI | twine upload / pip install(--index-url 指向 Gitea 的 pypi 地址) |
| Maven | mvn deploy(settings.xml 里配 Gitea 的 maven 地址和令牌) |
| Helm | helm push / helm pull(OCI 方式走容器仓库地址) |
| NuGet | nuget push / dotnet restore(源地址为 Gitea 的 nuget v3 接口) |
| Cargo | cargo publish(registry 地址配成 Gitea 的 cargo 接口) |
| Generic | 任意文件:curl PUT 上传,curl GET 下载,适合内部工具、二进制分发 |
具体每种类型的地址格式,在网页端点进对应包的详情页,页面上会直接给出可复制的客户端配置命令,照着贴就行。
11. 运维:备份、升级与检查
11.1 备份
# Gitea 自带 dump 命令:数据库 + 仓库 + 配置打成一个 zip
sudo -u git /usr/local/bin/gitea dump -c /etc/gitea/app.ini \
--work-path /var/lib/gitea --file /backup/gitea-dump-$(date +%Y%m%d).zip
# 恢复时解压 zip,把内容放回原位置再重启服务
# 建议每天定时备份一次,备份文件异地再存一份
11.2 升级
# 1. 先备份(见 11.1)
# 2. 停服务
sudo systemctl stop gitea
# 3. 下载新版二进制,校验,替换
GITEA_VER=28.4.0 # 换成目标版本
wget https://dl.gitea.com/gitea/${GITEA_VER}/gitea-${GITEA_VER}-linux-amd64 -O /tmp/gitea-new
sudo install -m 755 /tmp/gitea-new /usr/local/bin/gitea
# 4. 启动,Gitea 会自动跑数据库迁移
sudo systemctl start gitea
sudo journalctl -u gitea -f # 看迁移日志,确认没有报错
# 注意:大版本升级前先读官方 release notes 里的 Breaking Changes,
# 比如 28.0.0 要求 Git 2.25+、不再提供 32 位构建
11.3 自检
# 检查配置、数据库、仓库完整性
sudo -u git /usr/local/bin/gitea doctor -c /etc/gitea/app.ini
# 看日志
sudo journalctl -u gitea --no-pager | tail -50
sudo tail -f /var/lib/gitea/log/gitea.log
12. 常见问题排查
12.1 打开页面是 3000 端口的安装向导,但我已经装过了
app.ini 里 [security] INSTALL_LOCK 不是 true,或者 /etc/gitea/app.ini 权限不对导致 Gitea 读不到。检查文件归属是 git:git、权限 770,确认 INSTALL_LOCK=true 后重启。
12.2 仓库页显示的克隆地址是 127.0.0.1:3000
ROOT_URL 写错了(见 4.3 节)。改成用户最终访问的地址(https://git.example.com/,末尾带斜杠),重启 Gitea。已经建的仓库不用动,地址是按 ROOT_URL 实时生成的。
12.3 docker login 报 server gave HTTP response to HTTPS client
Gitea 是 HTTP,docker 客户端默认走 HTTPS。见 7.4 节:生产配好 HTTPS,或者客户端 daemon.json 里加 insecure-registries。
12.4 上传包报 403
令牌权限不够。令牌必须勾选 package 的写权限;组织包还要确认账号在组织团队里有包写权限。用登录密码而不是令牌也会 403(2FA 用户必须用令牌)。
12.5 上传包报 409
同名同版本同架构的包已存在。Gitea 不允许覆盖已发布的包,先在网页端删掉旧版本再传。
12.6 push 大镜像/大文件报 413
Nginx 的 client_max_body_size 太小。第 5 节的配置里写的是 512m,按实际包大小往上调,改完 nginx -t && systemctl reload nginx。
12.7 apt update 报签名验证失败
PGP 公钥没导对。确认 /etc/apt/keyrings/gitea-ops.asc 是从 https://git.example.com/api/packages/ops/debian/repository.key 下载的,并且 sources.list 里的 signed-by 指向的就是这个文件。owner 变了,key 的 URL 和文件名里的 owner 也要跟着变。
12.8 docker push 报 404:unexpected status from POST request to /v2/.../blobs/uploads/
镜像名缺了 owner 这一段。Gitea 的容器仓库强制要求三段式命名 {域名}/{owner}/{镜像名},直接推 域名/镜像名(比如 gitea.example.com/nginx:latest)时,Gitea 找不到 owner,blob 上传接口直接报 404:
# 错的:缺了 owner
docker push gitea.example.com/nginx:latest
# 对的:域名/owner/镜像名
docker tag nginx:latest gitea.example.com/ops/nginx:latest
docker push gitea.example.com/ops/nginx:latest
如果改成三段式还是 404,再查两点:包仓库有没有被关掉(app.ini 里 [packages] ENABLED 必须是 true),以及 owner 是不是真实存在的用户或组织名。
13. 附录:app.ini 完整模板与命令速查
; /etc/gitea/app.ini(归属 git:git,权限 770)
[server]
HTTP_PORT = 3000
DOMAIN = git.example.com
ROOT_URL = https://git.example.com/
DISABLE_SSH = false
SSH_PORT = 22
LFS_START_SERVER = true
[database]
DB_TYPE = sqlite3
PATH = /var/lib/gitea/data/gitea.db
[service]
DISABLE_REGISTRATION = true
DEFAULT_KEEP_EMAIL_PRIVATE = true
[packages]
ENABLED = true
[security]
INSTALL_LOCK = true
SECRET_KEY = 安装时自动生成
# 服务管理
sudo systemctl start|stop|restart|status gitea
sudo journalctl -u gitea -f
# 管理员与自检
sudo -u git gitea admin user create --username admin --password '密码' --email a@b.c --admin -c /etc/gitea/app.ini
sudo -u git gitea doctor -c /etc/gitea/app.ini
sudo -u git gitea dump -c /etc/gitea/app.ini --work-path /var/lib/gitea --file /backup/gitea.zip
# 包仓库地址速查(owner 以 ops 为例)
# Docker:docker login git.example.com;镜像名 git.example.com/ops/镜像名:标签
# apt 源:deb [signed-by=/etc/apt/keyrings/gitea-ops.asc] https://git.example.com/api/packages/ops/debian noble main
# yum 源:dnf config-manager --add-repo https://git.example.com/api/packages/ops/rpm/rocky/el9.repo
到这里,一台 Ubuntu 上的 Gitea 就完整跑起来了:代码托管、Docker 镜像仓库、apt 源、yum 源全在一台机器上,内网其他机器只要指过来就能用。记住三条主线就行:ROOT_URL 写对(克隆地址和包仓库地址都从它来)、令牌只做包操作(别拿登录密码去调接口)、大文件先调 client_max_body_size。后面人多了,把 SQLite 换成 PostgreSQL、把包仓库的清理规则打开,就能长期稳定跑下去。





