knowledge-vault/sources/references/开发笔记/CentOS/安装Git.md

24 KiB
Raw Blame History

下面给出一套 在 CentOS 上使用 Docker 快速部署 Git 服务器 的完整思路与实操步骤。 你可以任选下面两种方案:

方案 适合场景 资源占用 主要功能
Gitea轻量 个人/小团队、需要 Web UI代码浏览、Issue、PR <1GB RAM 开箱即用的 Git 服务,界面友好,支持 LDAP/OAuth
GitLab CE完整 大团队、需要 CI/CD、Wiki、容器 Registry 等完整功能 至少 4GB RAM推荐 8GB+ 功能最全,但资源消耗大
仅 SSH 裸仓库 只想通过 git clone ssh://... 访问、无 Web UI 基本无额外资源 手动管理权限、最轻量

下面重点演示 GiteaDocker Compose+ Nginx 反向代理 + Lets Encrypt HTTPS 的完整链路,兼顾易用性和安全。若你想直接跑 GitLab,请跳到章节 “2 用 Docker 运行 GitLab CE”。


1 前期准备CentOS 7/8

# 1. 安装 Docker如果还没装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker && sudo systemctl enable docker

# 2. 安装 Docker Compose推荐 v2.x最新版请自行替换
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version   # 看到版本号即成功

# 3. 防火墙 & SELinux如果开启的话
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --add-port=3000/tcp   # Gitea Web
sudo firewall-cmd --permanent --add-port=2222/tcp   # Gitea SSH容器内部 22 映射到 2222
sudo firewall-cmd --reload

# SELinux可选若遇到卷挂载权限问题请先设为 permissive
sudo setenforce 0   # 测试阶段可直接关闭,生产环境请使用 chcon / semanage

提示:如果机器内存 <1GB请选 仅 SSH 裸仓库(后文的方案三),否则 Gitea 也能跑,但建议先把系统 Swap 开启:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

2 使用 Docker Compose 部署 Gitea

2.1 创建项目目录

sudo mkdir -p /data/gitea && cd /data/gitea
sudo chown -R $(id -u):$(id -g) /data/gitea   # 让当前用户可写

2.2 编写 docker-compose.yml

说明:我们使用 PostgreSQL 作为 Gitea 的数据库(比 SQLite 更稳、适合长期运行)。如果只想单节点、磁盘空间有限,可以改用 SQLite去掉 db 服务并把 DB_TYPE 改成 sqlite3),但建议使用 PostgreSQL。

# /data/gitea/docker-compose.yml
version: "3.8"

services:
  gitea:
    image: gitea/gitea:1.21          # 使用最新的 LTS 版
    container_name: gitea
    restart: always
    environment:
      - USER_UID=1000
      - USER_GID=1000
      # 下面三行是让 Gitea 知道它被放在什么端口(如果以后改 Nginx 反代,可保持不变)
      - HTTP_PORT=3000
      - SSH_PORT=2222
      - DOMAIN=git.example.com
      - ROOT_URL=https://git.example.com/
      # 数据库配置
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=mqFUjbWzf7utWA
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - ./gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      - db
    networks:
      - gitea-net

  db:
    image: postgres:15-alpine
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=mqFUjbWzf7utWA
      - POSTGRES_DB=gitea
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - gitea-net

networks:
  gitea-net:
    driver: bridge

volumes:
  gitea-data:
  postgres-data:

⚠️ 关键点

  1. USER_UID / USER_GID 必须与宿主机上运行 Docker 进程的用户对应(通常是 1000),否则 Gitea 生成的仓库文件权限会报错。
  2. DOMAINROOT_URL 换成你自己的域名,后面 Nginx 反代时需要匹配。
  3. SSH_PORT=2222 表示容器内部 SSH 监听在 22而我们在 ports 里把它映射到宿主机的 2222(避免冲突本机 22 端口)。
  4. 密码 一定要改成强密码,最好使用 openssl rand -base64 32 生成随机字符串。

2.3 启动并检查

cd /data/gitea
docker-compose up -d          # 后台启动
docker-compose logs -f gitea  # 查看日志,出现 “HTTP Listen: :3000” 表示成功

第一次访问:打开浏览器,访问 http://<服务器IP>:3000,会看到 Gitea 的 安装向导(设置管理员账号、数据库、域名等),完成后即进入主页。

2.4 (可选)配置 Systemd 监控 Docker Compose

sudo tee /etc/systemd/system/gitea.service <<EOF
[Unit]
Description=Gitea Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/data/gitea
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
ExecReload=/usr/local/bin/docker-compose restart
User=${USER}
Group=${GROUP}

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable gitea.service
sudo systemctl start gitea.service

3 配置 Nginx 反向代理 + HTTPSLets Encrypt

前置条件:已拥有域名 git.example.com,并在 DNS 处把 git.example.com A 记录指向服务器 IP。

3.1 安装 Nginx 与 Certbot

sudo yum install -y epel-release
sudo yum install -y nginx certbot python3-certbot-nginx

3.2 创建 Nginx 配置

sudo tee /etc/nginx/conf.d/gitea.conf <<EOF
server {
    listen 80;
    server_name git.example.com;

    # 重定向到 HTTPS
    return 301 https://\$host\$request_uri;
}

server {
    listen 443 ssl http2;
    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;

    # 安全头部
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # 日志
    access_log /var/log/nginx/gitea.access.log;
    error_log  /var/log/nginx/gitea.error.log;

    client_max_body_size 100M;   # 允许较大的仓库上传

    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;

        # WebSocket 支持Gitea 的实时通知)
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

3.3 启动 Nginx 并获取证书

sudo systemctl enable nginx && sudo systemctl start nginx
# 初次自动生成证书Lets Encrypt 会检查 80 端口是否可达)
sudo certbot --nginx -d git.example.com --agree-tos -m admin@example.com --non-interactive

证书自动续期Certbot 已自带定时任务,可通过 systemctl status certbot renew.timer 检查;亦可手动测试:sudo certbot renew --dry-run

3.4 防火墙放行 80/443

sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload

3.5 验证 HTTPS

在浏览器打开 https://git.example.com,应该能看到 Gitea 的登录页面,且浏览器地址栏显示绿色锁标。


4 基本运维 & 安全加固

项目 操作建议
管理员账号 首次安装后立刻在 Gitea UI 创建管理员(不要使用默认的 root 或弱密码)。
强制 HTTPS Gitea 配置 DISABLE_HTTP_GITtrue,确保 git clone 只能走 ssh://https://
SSH 密钥 所有开发者在 Gitea 个人设置里上传公钥,克隆时使用 git clone ssh://git@git.example.com:2222/<user>/<repo>.git
邮件通知 gitea-data/gitea/conf/app.ini(或在 docker-compose.ymlGITEA__mailer__ 环境变量)配置 SMTP使密码重置、PR/Issue 事件能收到邮件。
备份 定期把 gitea-data仓库、数据库tar.gz 备份到另一台机器。
示例:tar czf /backup/gitea-$(date +%F).tar.gz -C /data/gitea gitea-data postgres-data
升级 Gitea
docker-compose pull
docker-compose up -d
日志查看 docker-compose logs -f --tail=200
资源限制 若机器内存紧张,可在 docker-compose.yml 中为服务添加 mem_limitcpus 参数。
防火墙 只保留 22(宿主机 SSH 2222Gitea SSH 80/443Nginx 端口,其他默认关闭。

5 若想使用 GitLab CEDocker

注意GitLab 官方镜像非常大2GB首次启动需要 48GB RAM 才能正常运行。下面给出 最小化 配置示例,若机器资源不足请跳过此节。

5.1 docker-compose.ymlGitLab CE

version: "3.8"
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: git.example.com
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://git.example.com'
        nginx['enable'] = true
        nginx['ssl_certificate'] = '/etc/gitlab/ssl/fullchain.pem'
        nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/privkey.pem'
        # 最小资源限制(建议在实际部署时把下面两行删除,以使用默认资源)
        unicorn['worker_processes'] = 2
        sidekiq['concurrency'] = 2        
    ports:
      - "22:22"
      - "80:80"
      - "443:443"
    volumes:
      - gitlab-config:/etc/gitlab
      - gitlab-log:/var/log/gitlab
      - gitlab-data:/var/opt/gitlab
    shm_size: '256m'   # 防止 GitLab 因为 /dev/shm 太小而崩溃

启动docker-compose up -d 首次登录:访问 https://git.example.com,系统会自动生成 root 初始密码(可在 gitlab-config/gitlab-secrets.json 里查看或自行重置)。

资源限制GitLab 官方建议至少 4GB RAM。若机器只有 2GB请改用 GitLab EE 官方轻量版gitlab/gitlab-ee:latest)或直接选 Gitea。


6 仅用 SSH + 裸仓库最轻量的“Git 服务器”)

如果不需要 Web UI只想团队成员通过 ssh 拉取/推送代码,可直接在宿主机上创建裸仓库:

# 1. 创建 git 用户(可选)
sudo useradd -m -s /bin/bash git
sudo mkdir -p /home/git/repos
sudo chown -R git:git /home/git/repos

# 2. 创建裸仓库
sudo -u git git init --bare /home/git/repos/myproject.git

# 3. 配置 SSH可选使用密钥登录
# 将成员的公钥添加到 /home/git/.ssh/authorized_keys
sudo mkdir -p /home/git/.ssh
sudo tee /home/git/.ssh/authorized_keys <<EOF
ssh-rsa AAAA....(成员的公钥)
EOF
sudo chmod 600 /home/git/.ssh/authorized_keys
sudo chown -R git:git /home/git/.ssh

# 4. 防火墙放行 22 端口(默认已开)
# 5. 客户端克隆
git clone git@your-server:/home/git/repos/myproject.git

优点:几乎不占用额外资源,适合对 安全 有严格控制、且不需要 Issue、PR 等功能的团队。 缺点:权限管理只能靠 SSH 密钥,缺乏可视化。


7 小结

方案 适用人群 关键端口 资源需求 Web UI
Gitea (Docker) 想快速拥有完整 Git 服务仓库浏览、Issue、PR、CI 3000/2222 → Nginx 80/443 1GB RAM+(推荐 2GB
GitLab CE (Docker) 需要完整 DevOps 平台CI/CD、容器 Registry、Wiki 22/80/443 4GB RAM
SSH + 裸仓库 极简团队、只做代码托管、无需 UI 22 基本无

推荐如果是中小团队、机器配置一般4GB RAMGitea 是最佳平衡点;如果团队规模较大且需要 CI/CD、容器 Registry 等完整生态,GitLab CE 是不二之选;只想快速在内部共享代码且不想跑额外进程,SSH + 裸仓库 已足够。

祝你部署顺利 🚀!如果在实际操作中遇到 端口冲突权限报错证书问题,欢迎把错误日志贴出来,我可以帮你进一步排查。祝玩得开心 🎉.


git启动了Nginx我也配置了但是用浏览器访问时页面显示

400 Bad Request: malformed Host header

这个错误怎么解决

解决 Gitea 400 Bad Request: malformed Host header

这个错误通常是因为 Host 请求头 没有正确传递给 Gitea。修改 Nginx 配置即可:

解决方案

编辑 Nginx 配置文件:

sudo vim /etc/nginx/conf.d/gitea.conf

找到 proxy_set_header Host 那行,改成这样

location / {
    proxy_pass http://127.0.0.1:3000;
  
    # 关键修改:用 $http_host 而不是 $host
    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;
}

或者,如果你使用的是域名访问,也可以试试:

proxy_set_header Host git.example.com;

然后重载 Nginx

sudo nginx -t           # 检查配置语法
sudo systemctl reload nginx

如果还不行,检查 Gitea 的 ROOT_URL

确保 docker-compose.yml 中的域名配置正确:

environment:
  - ROOT_URL=https://git.example.com/   # 这里要和实际访问的域名一致
  - DOMAIN=git.example.com

修改后重启 Gitea

cd /data/gitea
docker-compose down
docker-compose up -d

常见原因总结

原因 解决方法
Host header 丢失或错误 proxy_set_header Host $http_host;
ROOT_URL 与实际访问域名不匹配 保持一致
使用了内网 IP 访问 改用域名或修改 ROOT_URL 为 IP 地址

重启后刷新浏览器缓存Ctrl+Shift+R再试试。


我已经进入了页面,页面中有个以用户名运行默认是git说明为

输入 Gitea 运行的操作系统用户名。请注意,此用户必须具有对仓库根路径的访问权限。

git目录是/data/gitea 仓库根目录是/data/git/repositories

我当前是用root创建启动的服务我若想添加git这样的用户应该怎么操作

创建 git 用户并配置权限

步骤 1创建 git 用户和用户组

# 创建 git 用户(如果不存在)
sudo useradd -m -s /bin/bash git

# 或者如果已经存在,确保其主目录正确
sudo mkdir -p /home/git
sudo chown -R git:git /home/git

步骤 2创建仓库目录并授权

# 创建仓库根目录
sudo mkdir -p /data/git/repositories

# 授权给 git 用户
sudo chown -R git:git /data/git/repositories

# 同时确保 Gitea 数据目录也属于 git 用户(可选,因为数据目录在容器内映射)
sudo chown -R git:git /data/gitea/gitea-data

步骤 3查看 git 用户的 UID 和 GID

id git

输出类似:

uid=1000(git) gid=1000(git) groups=1000(git)

记录下 uidgid(通常是 1000

步骤 4更新 docker-compose.yml

编辑 /data/gitea/docker-compose.yml

environment:
  - USER_UID=1000          # 改成 git 的 uid
  - USER_GID=1000          # 改成 git 的 gid
  - ROOT_URL=https://git.example.com/
  - DOMAIN=git.example.com

步骤 5重启 Gitea 服务

cd /data/gitea
docker-compose down
docker-compose up -d

验证权限

# 检查目录权限
ls -la /data/git/

输出应该类似:

drwxr-xr-x  git git /data/git/repositories

填写 Gitea 安装向导

完成上述步骤后,在 Gitea 安装页面填写:

字段
域名 git.example.com
仓库根路径 /data/git/repositories
以用户名运行 git

然后继续完成安装即可。


现在进入了首次登录界面,我应该注册,还是登录,登录用户名、密码是什么?

Gitea 首次登录说明

情况判断

如果是安装向导页面Setup Wizard

页面应该显示数据库配置、管理员设置等内容:

  • 选择"注册"或"安装" → 这里会创建第一个管理员账号
  • 第一个注册的用户就是管理员

填写示例:

字段 建议值
管理员用户名 admin 或你的名字
管理员密码 设置一个强密码
确认密码 重复输入
管理员邮箱 admin@example.com

⚠️ 注意:这个账号就是未来的管理员账号,请记住用户名和密码。


如果已经是登录页面

说明安装向导已经完成,需要用管理员账号登录:

  1. 关闭当前页面
  2. 重新访问 https://git.example.com
  3. 如果又显示安装向导,按上面步骤配置第一个管理员

如果安装向导已完成且无法重置

可以通过命令行创建管理员:

cd /data/gitea

# 停止服务
docker-compose down

# 重新启动(带初始化参数)
docker-compose up -d

# 进入容器
docker exec -it gitea bash

# 创建管理员用户
gitea admin user create \
  --username admin \
  --password 你的密码 \
  --email admin@example.com \
  --admin

总结

场景 操作
首次显示安装向导 填写管理员信息 → 完成安装 → 自动登录
已完成安装但没记住账号 重启容器或用命令行创建管理员

你现在看到的页面是安装向导还是登录页面

gitea admin user create
--username wantsong
--password NJq77PPXBYhrtZY
--email w@wantsong.cc
--admin

docker exec -it gitea gitea admin user create
--username wantsong
--password NJq77PPXBYhrtZY
--email w@wantsong.cc
--admin


现在是登录页面了,安装向导页面没注意管理员的账号。

我在创建管理员用户的时候,报错:

2026/06/01 05:42:56 ...s/setting/setting.go:183:loadRunModeFrom() [F] Gitea is not supposed to be run as root. Sorry. If you need to use privileged TCP ports please instead use setcap and the cap_net_bind_service permission

怎么解决?

解决 Gitea 不允许 root 运行的问题

这是 Gitea 的安全限制,需要使用非 root 用户(如 git)运行。

解决方案

步骤 1确保 git 用户存在

# 创建 git 用户(如果不存在)
sudo useradd -m -s /bin/bash git

# 创建目录并授权
sudo mkdir -p /data/git/repositories
sudo chown -R git:git /data/git/repositories
sudo chown -R git:git /data/gitea/gitea-data

步骤 2获取 git 用户的 UID 和 GID

id git

记住输出的 uidgid(通常是 1000)。

步骤 3修改 docker-compose.yml

编辑 /data/gitea/docker-compose.yml,确保环境变量设置正确:

services:
  gitea:
    image: gitea/gitea:1.21
    container_name: gitea
    restart: always
    environment:
      - USER_UID=1000          # 改成 git 的 uid
      - USER_GID=1000          # 改成 git 的 gid
      # ... 其他环境变量保持不变
    user: "1000:1000"          # 添加这行,指定容器以哪个用户运行

步骤 4重启 Gitea 服务

cd /data/gitea

# 停止并删除旧容器
docker-compose down

# 重新启动(会创建新的容器)
docker-compose up -d

步骤 5创建管理员用户

docker exec -it gitea gitea admin user create \
  --username admin \
  --password 你的密码 \
  --email admin@example.com \
  --admin

验证

# 查看容器是否以 git 用户运行
docker exec -it gitea whoami

输出应该是 git 而不是 root


常见问题

问题 解决方法
之前创建的容器没更新 必须 docker-compose down 删除旧容器后再 up
权限不够 sudo chown -R git:git /data/gitea /data/git

我检查了下git用户的id是1005,我添加了这行后,user: "1005:1005" 服务没法起来。 去掉这行服务启动但是还是root用户

解决 Gitea 以 git 用户运行

步骤 1检查目录权限

# 确保目录属于 git 用户
sudo chown -R git:git /data/gitea
sudo chown -R git:git /data/git

# 检查权限
ls -la /data/

步骤 2修改 docker-compose.yml

sudo vim /data/gitea/docker-compose.yml

修改 environment 部分,确保包含正确的 UID/GID

services:
  gitea:
    image: gitea/gitea:1.21
    container_name: gitea
    restart: always
    environment:
      - USER_UID=1005          # git 用户的 uid
      - USER_GID=1005          # git 用户的 gid
      # ... 其他环境变量
    user: "1005:1005"          # 添加这行

步骤 3查看启动错误日志

cd /data/gitea
docker-compose down
docker-compose up -d
docker-compose logs -f

把错误信息贴出来,我帮你分析具体原因。


可能的问题及解决

问题 1SELinux 阻止挂载

# 查看 SELinux 状态
getenforce

# 如果是 Enforcing临时关闭测试
sudo setenforce 0

# 或者给目录打标签
sudo chcon -R -t svirt_sandbox_file_t /data/gitea
sudo chcon -R -t svirt_sandbox_file_t /data/git

问题 2目录权限不够

# 完全重置权限
sudo chown -R 1005:1005 /data/gitea
sudo chown -R 1005:1005 /data/git

# 给完全权限测试(后续再收紧)
sudo chmod -R 777 /data/gitea/gitea-data
sudo chmod -R 777 /data/git/repositories

问题 3使用 run 命令启动查看具体错误

cd /data/gitea
docker-compose down
docker-compose run --rm gitea

把终端输出贴出来,我帮你定位问题。

卸载 Gitea

步骤 1停止并删除容器

cd /data/gitea

# 停止服务
docker-compose down

# 删除容器(如果还存在)
docker rm -f gitea
docker rm -f gitea-db    # 如果有单独的数据库容器

步骤 2删除 Docker 镜像

# 查看 Gitea 相关镜像
docker images | grep gitea

# 删除镜像
docker rmi gitea/gitea:1.21    # 替换为你的版本
docker rmi postgres:15-alpine  # 如果使用 PostgreSQL

步骤 3删除数据目录可选谨慎操作

⚠️ 这会删除所有仓库和用户数据,不可恢复

# 删除 Gitea 数据
sudo rm -rf /data/gitea

# 删除仓库数据
sudo rm -rf /data/git

# 删除 PostgreSQL 数据(如果使用)
sudo rm -rf /var/lib/docker/volumes/gitea_postgres-data

步骤 4清理 systemd 服务(如果创建了)

# 停止服务
sudo systemctl stop gitea

# 禁用服务
sudo systemctl disable gitea

# 删除服务文件
sudo rm /etc/systemd/system/gitea.service

# 重新加载 systemd
sudo systemctl daemon-reload

步骤 5清理 Nginx 配置(可选)

# 如果不再需要
sudo rm /etc/nginx/conf.d/gitea.conf

# 重载 Nginx
sudo systemctl reload nginx

快速卸载命令汇总

cd /data/gitea
docker-compose down
docker-compose down --volumes   # 同时删除数据卷
docker system prune -a          # 清理所有未使用的镜像、容器、网络

# 删除数据目录(根据需要选择)
sudo rm -rf /data/gitea
sudo rm -rf /data/git

# 清理 systemd
sudo systemctl stop gitea 2>/dev/null
sudo systemctl disable gitea 2>/dev/null
sudo rm /etc/systemd/system/gitea.service 2>/dev/null
sudo systemctl daemon-reload

确认卸载完成

# 检查是否还有 Gitea 相关容器
docker ps -a | grep gitea

# 检查是否还有 Gitea 镜像
docker images | grep gitea

# 检查数据目录
ls /data/gitea 2>/dev/null   # 应该提示不存在

卸载完成后,你是想重新安装 Gitea还是用其他方案如 GitLab 或 SSH 裸仓库)?