- 前言
Gitea 是一个用 Go 语言编写的极轻量、自建型的 Git 仓库服务。相比重量级的 GitLab,Gitea 内存占用极低(仅需几十 MB 到上百 MB),性能出众,非常适合中小企业内部研发协同或个人私有代码托管。
本文记录了在 AlmaLinux release 9.7 (x86_64) 环境下,从零搭建 Gitea,搭配 PostgreSQL 数据库,并通过 Nginx 实现 443 HTTPS 反向代理的全过程。文末还重点复盘了 RHEL 9 系系统下 PostgreSQL 默认认证策略导致的 Ident / Password 认证失败 的排查与解决方案。
-
部署环境与规划
操作系统:AlmaLinux release 9.7 (x86_64)
数据库:PostgreSQL 13
Web 代理:Nginx (监听 443 端口,配置 SSL)
宿主机 SSH 端口:27892 (非标准端口)
安全配置:SELinux 与 Firewalld 处于关闭状态
-
详细安装与配置步骤
第一步:PostgreSQL 安装与用户数据库初始化
在 AlmaLinux 9 下安装 PostgreSQL 并启动:
bash
# 1. 安装 PostgreSQL 服务端
dnf install -y postgresql-server postgresql-contrib
# 2. 初始化数据库集群
postgresql-setup --initdb
# 3. 设置开机自启并立即启动
systemctl enable --now postgresql
第二步:【避坑核心】修复 PostgreSQL 密码认证机制
⚠️ 核心坑点说明:
RHEL/AlmaLinux 9 默认的 pg_hba.conf 会将本地 TCP (127.0.0.1/32) 认证模式设为 ident,导致 Gitea 连接时抛出:用户 "gitadmin" Ident 认证失败。必须将其改为 scram-sha-256 密码认证,并使用对应的加密算法生成密码。
bash
# 1. 获取 pg_hba.conf 文件路径
HBA=$(sudo -u postgres psql -tAc "SHOW hba_file")
# 2. 备份原配置
sudo cp "$HBA" "$HBA.bak"
# 3. 将本地 IPv4/IPv6 认证模式从 ident 替换为 scram-sha-256
sudo sed -i -E 's/^host(\s+all\s+all\s+127\.0\.0\.1\/32\s+)ident/host\1scram-sha-256/' "$HBA"
sudo sed -i -E 's/^host(\s+all\s+all\s+::1\/128\s+)ident/host\1scram-sha-256/' "$HBA"
# 4. 重新加载配置生效
sudo -u postgres psql -c "SELECT pg_reload_conf();"
# 5. 使用 scram-sha-256 加密创建专用用户和数据库
sudo -u postgres psql -c "SET password_encryption='scram-sha-256'; CREATE USER gitadmin WITH PASSWORD 'YourStrongPassword';"
sudo -u postgres psql -c "CREATE DATABASE giteadb OWNER gitadmin ENCODING 'UTF8';"
# 6. 本地连接连通性验证
PGPASSWORD='YourStrongPassword' psql -h 127.0.0.1 -p 5432 -U gitadmin -d giteadb -c "SELECT current_user, current_database();"
若输出 gitadmin | giteadb,说明数据库层完全就绪。不然回头配置web就会认证有问题,如下图:

第三步:创建专用运行环境与目录权限
为了保证服务安全,严禁使用 root 用户直接运行 Gitea。
bash
# 1. 创建专用的系统 git 用户
adduser --system --shell /bin/bash --comment 'Git Version Control' --create-home --home-dir /home/git git
# 2. 创建 Gitea 所需的工作与配置目录
mkdir -p /var/lib/gitea/{custom,data,log}
mkdir -p /etc/gitea
# 3. 配置目录属主与权限
chown -R git:git /var/lib/gitea
chmod -R 750 /var/lib/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea
第四步:下载 Gitea 并配置 Systemd 守护进程
bash
# 1. 下载官方二进制包并赋予可执行权限
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.21.11/gitea-1.21.11-linux-amd64
chmod +x /usr/local/bin/gitea
# 2. 创建 Systemd 服务配置文件
cat << 'EOF' > /etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target postgresql.service
Requires=postgresql.service
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
EOF
# 3. 启动并设置开机自启
systemctl daemon-reload
systemctl enable --now gitea
第五步:生成 SSL 证书与 Nginx 反向代理配置
由于服务器 80 端口已被其他业务占用,我们将 Gitea 挂载在 443 (HTTPS) 端口上,反向代理后端的 127.0.0.1:3000。
bash
# 1. 生成自签名 SSL 证书(如已有商业证书直接替换对应路径即可)
mkdir -p /etc/pki/nginx/
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/pki/nginx/gitea.key \
-out /etc/pki/nginx/gitea.crt \
-subj "/CN=gitea.local"
# 2. 写入 Nginx 站点配置
cat << 'EOF' > /etc/nginx/conf.d/gitea.conf
server {
listen 443 ssl http2;
server_name _;
ssl_certificate /etc/pki/nginx/gitea.crt;
ssl_certificate_key /etc/pki/nginx/gitea.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 允许大文件提交 (根据需要调整)
client_max_body_size 512M;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_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;
}
}
EOF
# 3. 检查语法并重载 Nginx
nginx -t && systemctl reload nginx
第六步:Web 初始化与命令行创建管理员
打开浏览器访问:https://<你的服务器IP>/
在初始化安装页面填写如下关键参数:
- 数据库类型:PostgreSQL
- 数据库主机:127.0.0.1:5432
- 数据库用户名:前面创建的用户名
- 数据库用户密码:YourStrongPassword
- 数据库名称:前面创建的库名
- SSL 模式:Disable
- SSH服务端口:27892(填写你服务器真实的 SSH 端口)
- Gitea 基本 URL:https://<你的服务器IP>/
其他的看着随便填,不影响
然后点击页面底部的 "立即安装"。
命令行创建管理员账号(避免表单超时或遗忘密码)
初始化完成后,可直接在终端通过 CLI 命令秒建管理员:
bash
su - git -c "/usr/local/bin/gitea admin user create --admin --username gitadmin --password 'YourAdminPassword' --email 'admin@example.com' --config /etc/gitea/app.ini"
也可以通过页面注册,第一个注册的账号默认是管理员
第七步:安全收尾(锁定配置目录权限)
安装完成后,必须收紧 /etc/gitea 及其配置文件的权限,防止数据库明文密码泄露或被篡改:
bash
chmod 750 /etc/gitea
chmod 640 /etc/gitea/app.ini
附上安装后的界面:

- 深度复盘:PostgreSQL 认证排错心得
在本次搭建过程中,最具代表性的问题就是 数据库认证机制引发的连锁反应:
1.Ident 认证失败:
原因:Linux 发行版(特别是 RHEL 9 系列)初始化 PostgreSQL 后,pg_hba.conf 默认配置为 ident。这种模式要求操作系统 登录用户与 PostgreSQL 角色名完全一致。而 Gitea 进程是以 git 用户运行并试图以 gitadmin 身份连接,自然会被拒绝。
解决:必须将 pg_hba.conf 中的本地网段认证规则由 ident 改为 scram-sha-256。
2.从 Ident 改为 SCRAM 后的 Password 认证失败:
原因:如果在修改 pg_hba.conf 之前就创建了用户,用户密码可能使用的是 md5 格式哈希,而服务端切换为 scram-sha-256 后无法向下兼容校验。
解决:在 psql 中执行 SET password_encryption = 'scram-sha-256'; 并重新通过 ALTER USER gitadmin WITH PASSWORD '...'; 刷新密码哈希即可彻底解决。