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 节)
Debianapt重点讲(第 8 节)
RPMyum、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 的包仓库还支持很多类型,配置思路都一样(令牌 + 对应客户端命令),这里列一张表备查:

类型客户端命令示例
npmnpm publish / npm install(先 npm login --registry=https://git.example.com/api/packages/ops/npm/)
PyPItwine upload / pip install(--index-url 指向 Gitea 的 pypi 地址)
Mavenmvn deploy(settings.xml 里配 Gitea 的 maven 地址和令牌)
Helmhelm push / helm pull(OCI 方式走容器仓库地址)
NuGetnuget push / dotnet restore(源地址为 Gitea 的 nuget v3 接口)
Cargocargo 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、把包仓库的清理规则打开,就能长期稳定跑下去。

发表回复

后才能评论