Skip to content

Gogs 部署指南

概述

Gogs 是一款基于 Go 语言开发的极易搭建的自助 Git 服务。它的目标是构建一个最简单、最快速、最轻松的方式搭建自助 Git 服务。Gogs 以其轻量级和易用性著称,特别适合个人开发者和小型团队。

Gogs 简介

核心功能

  • Git 托管: 完整的 Git 仓库管理
  • Web 界面: 友好的用户界面
  • 协作功能: Issue 追踪、Pull Request
  • 权限管理: 用户和组织管理
  • Webhook: 支持多种 Webhook
  • Wiki: 项目文档管理

技术特点

  • 极致轻量: 最低配置要求极低
  • 快速部署: 几分钟即可完成安装
  • 跨平台: 支持 Linux、macOS、Windows
  • 开源免费: MIT 许可证

安装部署

系统要求

yaml
最低配置:
  CPU: 单核
  内存: 128MB
  磁盘: 1GB

推荐配置:
  CPU: 双核+
  内存: 512MB+
  磁盘: 10GB+

软件依赖:
  - Git (>= 1.8.3)
  - SSH Server (可选)
  - 数据库 (可选: MySQL/PostgreSQL/SQLite3)

Debian/Ubuntu 安装

1. 创建用户

bash
sudo adduser --system --shell /bin/bash \
  --gecos 'Git Version Control' \
  --group \
  --disabled-password \
  --home /home/git git

2. 下载 Gogs

bash
# 创建安装目录
sudo mkdir -p /usr/local/gogs
cd /usr/local/gogs

# 下载二进制文件
wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_amd64.tar.gz

# 解压文件
tar -zxvf gogs*.tar.gz --strip-components=1

# 设置权限
sudo chown -R git:git /usr/local/gogs

3. 配置系统服务

创建 /etc/systemd/system/gogs.service:

ini
[Unit]
Description=Gogs
After=syslog.target
After=network.target
After=mysqld.service

[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/usr/local/gogs
ExecStart=/usr/local/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git

[Install]
WantedBy=multi-user.target
bash
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable gogs
sudo systemctl start gogs

# 查看状态
sudo systemctl status gogs

CentOS/RHEL 安装

1. 安装 Git

bash
# 安装依赖
sudo yum install -y epel-release
sudo yum install -y git

# 验证版本
git --version

2. 创建用户

bash
sudo groupadd git
sudo useradd -g git -s /bin/bash -d /home/git git

3. 下载安装

bash
sudo mkdir -p /usr/local/gogs
cd /usr/local/gogs

wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_amd64.tar.gz
sudo tar -zxvf gogs*.tar.gz --strip-components=1
sudo chown -R git:git /usr/local/gogs

4. 防火墙配置

bash
# 开放端口
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload

# 或使用 SELinux
sudo setsebool -P httpd_can_network_connect 1

Docker 安装

简单部署

bash
# 拉取镜像
docker pull gogs/gogs

# 创建数据目录
mkdir -p /var/gogs

# 运行容器
docker run -d \
  --name=gogs \
  -p 10022:22 \
  -p 3000:3000 \
  -v /var/gogs:/data \
  gogs/gogs

Docker Compose 部署

yaml
# docker-compose.yml
version: "3"

services:
  gogs:
    image: gogs/gogs
    container_name: gogs
    restart: always
    ports:
      - "3000:3000"
      - "222:22"
    volumes:
      - ./gogs:/data
    environment:
      - SOCAT_LINK=false
    depends_on:
      - db

  db:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=gogs
      - MYSQL_USER=gogs
      - MYSQL_PASSWORD=gogs
    volumes:
      - ./mysql:/var/lib/mysql
bash
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

配置管理

初始配置

首次访问 http://your-server:3000 进行安装配置:

yaml
数据库设置:
  数据库类型: SQLite3 (推荐) / MySQL / PostgreSQL
  主机: 127.0.0.1:3306
  用户: gogs
  密码: your-password
  数据库名: gogs

应用基本设置:
  域名: your-domain.com
  SSH 端口: 22
  HTTP 端口: 3000
  应用 URL: http://your-domain.com:3000/

可选设置:
  管理员账号: admin
  管理员密码: your-password
  管理员邮箱: admin@example.com

配置文件

配置文件位于 /usr/local/gogs/custom/conf/app.ini:

ini
[server]
APP_DATA_PATH = /usr/local/gogs/data
DOMAIN = your-domain.com
HTTP_PORT = 3000
ROOT_URL = http://your-domain.com:3000/
DISABLE_SSH = false
SSH_PORT = 22
START_SSH_SERVER = false

[database]
DB_TYPE = sqlite3
PATH = /usr/local/gogs/data/gogs.db

[repository]
ROOT = /usr/local/gogs/repository

[security]
INSTALL_LOCK = true
SECRET_KEY = your-secret-key

[service]
DISABLE_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = false

[mailer]
ENABLED = true
HOST = smtp.example.com:587
FROM = gogs@example.com
USER = your-email@example.com
PASSWD = your-email-password

反向代理配置

Nginx 配置

nginx
server {
    listen 80;
    server_name your-domain.com;

    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;
        
        client_max_body_size 50M;
    }
}

Apache 配置

apache
<VirtualHost *:80>
    ServerName your-domain.com
    
    ProxyPreserveHost On
    ProxyRequests Off
    
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>

HTTPS 配置

bash
# 使用 Let's Encrypt
sudo apt install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d your-domain.com

# 自动续期
sudo crontab -e
# 添加以下行
0 0 * * * /usr/bin/certbot renew --quiet

使用指南

创建仓库

bash
# 通过网页创建
# 1. 登录 Gogs
# 2. 点击 "+" 按钮
# 3. 选择 "新建仓库"
# 4. 填写仓库信息:
#    - 仓库名称
#    - 描述
#    - 可见性
#    - 初始化选项

# 通过 Git 命令
git init my-project
cd my-project
git remote add origin git@your-domain.com:username/my-project.git
git add .
git commit -m "Initial commit"
git push -u origin master

用户管理

bash
# 通过网页创建用户
# 管理员面板 -> 用户管理 -> 添加新用户

# 通过 API 创建用户
curl -X POST \
  -H "Authorization: token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":"newuser","password":"password","email":"user@example.com"}' \
  http://your-domain.com/api/v1/admin/users

组织管理

bash
# 创建组织
# 点击 "+" -> "新建组织"

# 组织设置
# - 成员管理
# - 团队管理
# - 仓库权限

Webhook 配置

yaml
# 仓库设置 -> Webhooks -> 添加 Webhook

Webhook 类型:
  - Slack
  - Discord
  - Dingtalk

触发事件:
  ☑ Push
  ☑ Create
  ☑ Delete
  ☑ Issues
  ☑ Pull Request

备份与恢复

备份

bash
#!/bin/bash
# backup.sh

BACKUP_DIR="/backup/gogs"
DATE=$(date +%Y%m%d)
BACKUP_FILE="gogs-backup-${DATE}.tar.gz"

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 备份数据
tar -czf ${BACKUP_DIR}/${BACKUP_FILE} \
  /usr/local/gogs/custom \
  /usr/local/gogs/data \
  /usr/local/gogs/log

# 备份数据库(如果使用 MySQL)
mysqldump -u gogs -p'password' gogs > ${BACKUP_DIR}/gogs-db-${DATE}.sql

# 删除旧备份
find ${BACKUP_DIR} -mtime +30 -delete

echo "Backup completed: ${BACKUP_FILE}"

恢复

bash
# 停止服务
sudo systemctl stop gogs

# 恢复数据
tar -xzf gogs-backup.tar.gz -C /

# 恢复数据库
mysql -u gogs -p'password' gogs < gogs-db-backup.sql

# 启动服务
sudo systemctl start gogs

性能优化

数据库优化

sql
-- MySQL 优化
SET GLOBAL innodb_buffer_pool_size = 536870912;
SET GLOBAL max_connections = 100;

缓存配置

ini
[cache]
ENABLED = true
ADAPTER = memory
INTERVAL = 60
HOST =

日志配置

ini
[log]
ROOT_PATH = /usr/local/gogs/log
MODE = file
LEVEL = Info

[log.file]
FILE_NAME = gogs.log
MAX_SIZE_SHIFT = 26
DAILY_ROTATE = true
MAX_DAYS = 7

升级指南

升级步骤

bash
# 1. 备份数据
./backup.sh

# 2. 停止服务
sudo systemctl stop gogs

# 3. 下载新版本
cd /usr/local/gogs
wget https://dl.gogs.io/VERSION/gogs_VERSION_linux_amd64.tar.gz

# 4. 备份旧版本
cp gogs gogs.bak

# 5. 解压新版本
tar -zxvf gogs*.tar.gz --strip-components=1

# 6. 恢复配置
cp -r custom/conf/app.ini custom/conf/app.ini.bak

# 7. 启动服务
sudo systemctl start gogs

# 8. 验证升级
# 访问 http://your-server:3000

常见问题

忘记管理员密码

bash
# 方法1: 重置密码
# 登录数据库
sqlite3 /usr/local/gogs/data/gogs.db

-- 更新密码
UPDATE user SET passwd='new-password-hash' WHERE name='admin';

-- 或删除用户重新创建
DELETE FROM user WHERE name='admin';

SSH 连接问题

bash
# 检查 SSH 配置
cat /etc/ssh/sshd_config | grep -i "AllowUsers"

# 添加 git 用户
echo "AllowUsers git" >> /etc/ssh/sshd_config
sudo systemctl restart sshd

# 检查 SSH 密钥
ls -la /home/git/.ssh

端口占用问题

bash
# 检查端口占用
sudo netstat -tlnp | grep :3000

# 修改端口
vim /usr/local/gogs/custom/conf/app.ini
# 修改 HTTP_PORT

# 重启服务
sudo systemctl restart gogs

性能问题

bash
# 检查系统资源
top
free -h
df -h

# 优化建议:
# 1. 使用 MySQL 替代 SQLite
# 2. 增加服务器内存
# 3. 使用缓存
# 4. 定期清理日志

与 Gitea 的对比

特性GogsGitea
开发活跃度较低活跃
功能丰富度基础丰富
CI/CD内置 Actions
包管理支持
性能极致轻量轻量
社区支持较少活跃

总结

Gogs 是一个极致轻量的 Git 托管平台:

优势:

  • 极致轻量: 资源占用极少
  • 快速部署: 几分钟即可完成安装
  • 简单易用: 界面简洁,易于上手
  • 开源免费: MIT 许可证

局限性:

  • 功能较少: 相比 Gitea/GitLab 功能较少
  • 维护较少: 开发活跃度较低
  • 扩展性: 缺少 CI/CD 等高级功能

适用场景:

  • 个人开发者
  • 小型团队
  • 资源受限的环境
  • 简单的代码托管需求

对于追求极致轻量和简单部署的场景,Gogs 是一个不错的选择。如果需要更多功能和更好的社区支持,建议考虑 Gitea。