901 lines
24 KiB
Markdown
901 lines
24 KiB
Markdown
下面给出一套 **在 CentOS 上使用 Docker 快速部署 Git 服务器** 的完整思路与实操步骤。
|
||
你可以任选下面两种方案:
|
||
|
||
| 方案 | 适合场景 | 资源占用 | 主要功能 |
|
||
|------|----------|----------|----------|
|
||
| **Gitea(轻量)** | 个人/小团队、需要 Web UI(代码浏览、Issue、PR)| < 1 GB RAM | 开箱即用的 Git 服务,界面友好,支持 LDAP/OAuth |
|
||
| **GitLab CE(完整)** | 大团队、需要 CI/CD、Wiki、容器 Registry 等完整功能 | 至少 4 GB RAM(推荐 8 GB+)| 功能最全,但资源消耗大 |
|
||
| **仅 SSH 裸仓库** | 只想通过 `git clone ssh://...` 访问、无 Web UI | 基本无额外资源 | 手动管理权限、最轻量 |
|
||
|
||
下面重点演示 **Gitea**(Docker Compose)+ **Nginx 反向代理 + Let’s Encrypt HTTPS** 的完整链路,兼顾易用性和安全。若你想直接跑 **GitLab**,请跳到章节 “2️⃣ 用 Docker 运行 GitLab CE”。
|
||
|
||
---
|
||
|
||
## 1️⃣ 前期准备(CentOS 7/8)
|
||
|
||
```bash
|
||
# 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
|
||
```
|
||
|
||
> **提示**:如果机器内存 < 1 GB,请选 **仅 SSH 裸仓库**(后文的方案三),否则 Gitea 也能跑,但建议先把系统 Swap 开启:
|
||
|
||
```bash
|
||
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 创建项目目录
|
||
|
||
```bash
|
||
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。
|
||
|
||
```yaml
|
||
# /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. `DOMAIN`、`ROOT_URL` 换成你自己的域名,后面 Nginx 反代时需要匹配。
|
||
> 3. `SSH_PORT=2222` 表示容器内部 SSH 监听在 22,而我们在 `ports` 里把它映射到宿主机的 **2222**(避免冲突本机 22 端口)。
|
||
> 4. **密码** 一定要改成强密码,最好使用 `openssl rand -base64 32` 生成随机字符串。
|
||
|
||
### 2.3 启动并检查
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
docker-compose up -d # 后台启动
|
||
docker-compose logs -f gitea # 查看日志,出现 “HTTP Listen: :3000” 表示成功
|
||
```
|
||
|
||
> **第一次访问**:打开浏览器,访问 `http://<服务器IP>:3000`,会看到 Gitea 的 **安装向导**(设置管理员账号、数据库、域名等),完成后即进入主页。
|
||
|
||
### 2.4 (可选)配置 Systemd 监控 Docker Compose
|
||
|
||
```bash
|
||
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 反向代理 + HTTPS(Let’s Encrypt)
|
||
|
||
> **前置条件**:已拥有域名 `git.example.com`,并在 DNS 处把 `git.example.com` A 记录指向服务器 IP。
|
||
|
||
### 3.1 安装 Nginx 与 Certbot
|
||
|
||
```bash
|
||
sudo yum install -y epel-release
|
||
sudo yum install -y nginx certbot python3-certbot-nginx
|
||
```
|
||
|
||
### 3.2 创建 Nginx 配置
|
||
|
||
```bash
|
||
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 并获取证书
|
||
|
||
```bash
|
||
sudo systemctl enable nginx && sudo systemctl start nginx
|
||
# 初次自动生成证书(Let’s 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
|
||
|
||
```bash
|
||
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_GIT` 为 `true`,确保 `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.yml` 中 `GITEA__mailer__` 环境变量)配置 SMTP,使密码重置、PR/Issue 事件能收到邮件。 |
|
||
| **备份** | 定期把 `gitea-data`(仓库、数据库)tar.gz 备份到另一台机器。<br>示例:`tar czf /backup/gitea-$(date +%F).tar.gz -C /data/gitea gitea-data postgres-data` |
|
||
| **升级 Gitea** | <pre>docker-compose pull<br>docker-compose up -d</pre> |
|
||
| **日志查看** | `docker-compose logs -f --tail=200` |
|
||
| **资源限制** | 若机器内存紧张,可在 `docker-compose.yml` 中为服务添加 `mem_limit`、`cpus` 参数。 |
|
||
| **防火墙** | 只保留 **22**(宿主机 SSH) **2222**(Gitea SSH) **80/443**(Nginx) 端口,其他默认关闭。 |
|
||
|
||
---
|
||
|
||
## 5️⃣ 若想使用 GitLab CE(Docker)
|
||
|
||
> **注意**:GitLab 官方镜像非常大(≥ 2 GB),首次启动需要 4‑8 GB RAM 才能正常运行。下面给出 **最小化** 配置示例,若机器资源不足请跳过此节。
|
||
|
||
### 5.1 `docker-compose.yml`(GitLab CE)
|
||
|
||
```yaml
|
||
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 官方建议至少 4 GB RAM。若机器只有 2 GB,请改用 **GitLab EE 官方轻量版**(`gitlab/gitlab-ee:latest`)或直接选 Gitea。
|
||
|
||
---
|
||
|
||
## 6️⃣ 仅用 SSH + 裸仓库(最轻量的“Git 服务器”)
|
||
|
||
如果不需要 Web UI,只想团队成员通过 `ssh` 拉取/推送代码,可直接在宿主机上创建裸仓库:
|
||
|
||
```bash
|
||
# 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 | 1 GB RAM+(推荐 2 GB)| ✅ |
|
||
| **GitLab CE (Docker)** | 需要完整 DevOps 平台(CI/CD、容器 Registry、Wiki)| 22/80/443 | ≥ 4 GB RAM | ✅ |
|
||
| **SSH + 裸仓库** | 极简团队、只做代码托管、无需 UI | 22 | 基本无 | ❌ |
|
||
|
||
> **推荐**:如果是中小团队、机器配置一般(≤ 4 GB RAM),**Gitea** 是最佳平衡点;如果团队规模较大且需要 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 配置文件:
|
||
|
||
```bash
|
||
sudo vim /etc/nginx/conf.d/gitea.conf
|
||
```
|
||
|
||
找到 `proxy_set_header Host` 那行,**改成这样**:
|
||
|
||
```nginx
|
||
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;
|
||
}
|
||
```
|
||
|
||
或者,如果你使用的是域名访问,也可以试试:
|
||
|
||
```nginx
|
||
proxy_set_header Host git.example.com;
|
||
```
|
||
|
||
## 然后重载 Nginx
|
||
|
||
```bash
|
||
sudo nginx -t # 检查配置语法
|
||
sudo systemctl reload nginx
|
||
```
|
||
|
||
---
|
||
|
||
## 如果还不行,检查 Gitea 的 ROOT_URL
|
||
|
||
确保 `docker-compose.yml` 中的域名配置正确:
|
||
|
||
```yaml
|
||
environment:
|
||
- ROOT_URL=https://git.example.com/ # 这里要和实际访问的域名一致
|
||
- DOMAIN=git.example.com
|
||
```
|
||
|
||
修改后重启 Gitea:
|
||
|
||
```bash
|
||
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 用户和用户组
|
||
|
||
```bash
|
||
# 创建 git 用户(如果不存在)
|
||
sudo useradd -m -s /bin/bash git
|
||
|
||
# 或者如果已经存在,确保其主目录正确
|
||
sudo mkdir -p /home/git
|
||
sudo chown -R git:git /home/git
|
||
```
|
||
|
||
## 步骤 2:创建仓库目录并授权
|
||
|
||
```bash
|
||
# 创建仓库根目录
|
||
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
|
||
|
||
```bash
|
||
id git
|
||
```
|
||
|
||
输出类似:
|
||
```
|
||
uid=1000(git) gid=1000(git) groups=1000(git)
|
||
```
|
||
|
||
记录下 `uid` 和 `gid`(通常是 1000)。
|
||
|
||
## 步骤 4:更新 docker-compose.yml
|
||
|
||
编辑 `/data/gitea/docker-compose.yml`:
|
||
|
||
```yaml
|
||
environment:
|
||
- USER_UID=1000 # 改成 git 的 uid
|
||
- USER_GID=1000 # 改成 git 的 gid
|
||
- ROOT_URL=https://git.example.com/
|
||
- DOMAIN=git.example.com
|
||
```
|
||
|
||
## 步骤 5:重启 Gitea 服务
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
docker-compose down
|
||
docker-compose up -d
|
||
```
|
||
|
||
---
|
||
|
||
## 验证权限
|
||
|
||
```bash
|
||
# 检查目录权限
|
||
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. 如果又显示安装向导,按上面步骤配置第一个管理员
|
||
|
||
---
|
||
|
||
### 如果安装向导已完成且无法重置
|
||
|
||
可以通过命令行创建管理员:
|
||
|
||
```bash
|
||
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 用户存在
|
||
|
||
```bash
|
||
# 创建 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
|
||
|
||
```bash
|
||
id git
|
||
```
|
||
|
||
记住输出的 `uid` 和 `gid`(通常是 `1000`)。
|
||
|
||
### 步骤 3:修改 docker-compose.yml
|
||
|
||
编辑 `/data/gitea/docker-compose.yml`,确保环境变量设置正确:
|
||
|
||
```yaml
|
||
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 服务
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
|
||
# 停止并删除旧容器
|
||
docker-compose down
|
||
|
||
# 重新启动(会创建新的容器)
|
||
docker-compose up -d
|
||
```
|
||
|
||
### 步骤 5:创建管理员用户
|
||
|
||
```bash
|
||
docker exec -it gitea gitea admin user create \
|
||
--username admin \
|
||
--password 你的密码 \
|
||
--email admin@example.com \
|
||
--admin
|
||
```
|
||
|
||
---
|
||
|
||
## 验证
|
||
|
||
```bash
|
||
# 查看容器是否以 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:检查目录权限
|
||
|
||
```bash
|
||
# 确保目录属于 git 用户
|
||
sudo chown -R git:git /data/gitea
|
||
sudo chown -R git:git /data/git
|
||
|
||
# 检查权限
|
||
ls -la /data/
|
||
```
|
||
|
||
## 步骤 2:修改 docker-compose.yml
|
||
|
||
```bash
|
||
sudo vim /data/gitea/docker-compose.yml
|
||
```
|
||
|
||
修改 `environment` 部分,确保包含正确的 UID/GID:
|
||
|
||
```yaml
|
||
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:查看启动错误日志
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
docker-compose down
|
||
docker-compose up -d
|
||
docker-compose logs -f
|
||
```
|
||
|
||
把错误信息贴出来,我帮你分析具体原因。
|
||
|
||
---
|
||
|
||
## 可能的问题及解决
|
||
|
||
### 问题 1:SELinux 阻止挂载
|
||
|
||
```bash
|
||
# 查看 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:目录权限不够
|
||
|
||
```bash
|
||
# 完全重置权限
|
||
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 命令启动查看具体错误
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
docker-compose down
|
||
docker-compose run --rm gitea
|
||
```
|
||
|
||
把终端输出贴出来,我帮你定位问题。
|
||
|
||
|
||
# 卸载 Gitea
|
||
|
||
## 步骤 1:停止并删除容器
|
||
|
||
```bash
|
||
cd /data/gitea
|
||
|
||
# 停止服务
|
||
docker-compose down
|
||
|
||
# 删除容器(如果还存在)
|
||
docker rm -f gitea
|
||
docker rm -f gitea-db # 如果有单独的数据库容器
|
||
```
|
||
|
||
## 步骤 2:删除 Docker 镜像
|
||
|
||
```bash
|
||
# 查看 Gitea 相关镜像
|
||
docker images | grep gitea
|
||
|
||
# 删除镜像
|
||
docker rmi gitea/gitea:1.21 # 替换为你的版本
|
||
docker rmi postgres:15-alpine # 如果使用 PostgreSQL
|
||
```
|
||
|
||
## 步骤 3:删除数据目录(可选,谨慎操作)
|
||
|
||
> ⚠️ 这会删除所有仓库和用户数据,**不可恢复**
|
||
|
||
```bash
|
||
# 删除 Gitea 数据
|
||
sudo rm -rf /data/gitea
|
||
|
||
# 删除仓库数据
|
||
sudo rm -rf /data/git
|
||
|
||
# 删除 PostgreSQL 数据(如果使用)
|
||
sudo rm -rf /var/lib/docker/volumes/gitea_postgres-data
|
||
```
|
||
|
||
## 步骤 4:清理 systemd 服务(如果创建了)
|
||
|
||
```bash
|
||
# 停止服务
|
||
sudo systemctl stop gitea
|
||
|
||
# 禁用服务
|
||
sudo systemctl disable gitea
|
||
|
||
# 删除服务文件
|
||
sudo rm /etc/systemd/system/gitea.service
|
||
|
||
# 重新加载 systemd
|
||
sudo systemctl daemon-reload
|
||
```
|
||
|
||
## 步骤 5:清理 Nginx 配置(可选)
|
||
|
||
```bash
|
||
# 如果不再需要
|
||
sudo rm /etc/nginx/conf.d/gitea.conf
|
||
|
||
# 重载 Nginx
|
||
sudo systemctl reload nginx
|
||
```
|
||
|
||
---
|
||
|
||
## 快速卸载命令汇总
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
---
|
||
|
||
## 确认卸载完成
|
||
|
||
```bash
|
||
# 检查是否还有 Gitea 相关容器
|
||
docker ps -a | grep gitea
|
||
|
||
# 检查是否还有 Gitea 镜像
|
||
docker images | grep gitea
|
||
|
||
# 检查数据目录
|
||
ls /data/gitea 2>/dev/null # 应该提示不存在
|
||
```
|
||
|
||
卸载完成后,你是想重新安装 Gitea,还是用其他方案(如 GitLab 或 SSH 裸仓库)?
|