自托管 Git 站点

之前公司内部都是采用 Gitea 做自己平台的内网脱管, 但是自从 Gitea 被其他公司收购后为了避免后续的商业纷争,
原版本 Gitea 额外分出 Forgejo 这个开源分支.

官方网站: forgejo

这里还是需要说明下个人的 Git 自托管服务系统配置:

  • 系统: 主流 Linux 发行版(Ubuntu 22.04/Debian 12/CentOS Stream 9 以上版本等)
  • 硬件: 最低 1GB 内存, 1 CPU 核心, 10GB 磁盘(生产环境建议 2GB+ 内存,当然内存越大越好)
  • 网络: 服务器需开放 22(SSH, 可以自定义端口设定), 80(HTTP)|443(HTTPS),3000(Forgejo 默认端口)端口
  • 依赖: Git(必须), 数据库(可选,SQLite/MySQL/MariaDB/PostgreSQL), Docker(采用容器部署才需要)

这里采用 debian/ubuntu 系统搭建, redhat 系的搭建方式可能有所不同

首先是必须要的组件, 我这里采用的 MariaDB 数据库配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 安装 Git 是必须, 我这边后续默认内网采用 http, 然后 nginx 转发到内网处理
# 暴露在外网的时候建议采用 nginx 代理一下, 方便识别 nginx 日志之后直接封禁一些非法IP
# git-lfs 是做大文件托管时候要用到的组件
sudo apt install git git-lfs wget

# 首先创建系统托管用户
# 这个托管用户需要支持 shell 操作并且关闭密码处理
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' \
--group --disabled-password --home /home/git git

# 需要注意, 建议采用外部扩展硬盘来管理空间, 避免提交文件过大把系统空间拥爆
# 这里我是托管到 /repository 目录下, 所以都是基于这个扩展外部硬盘目录来处理
# 首先目录权限需要赋予给他处理
sudo chown git:git /repository && sudo chmod 750 /repository

# 之后的配置文件的目录管理
sudo mkdir /etc/forgejo
sudo chown root:git /etc/forgejo && sudo chmod 770 /etc/forgejo

# 需要注意, 如果配置 MariaDB/PostgreSQL 之类数据库, 需要去官方处理SQL配置
# SQL: https://forgejo.org/docs/latest/admin/installation/database-preparation/
# 其实主要是创建好默认的数据库和数据库用户, 注意编码需要用 utf8mb4_bin 格式
# 我这里采用的数据库名称和数据库账号都是 forgejo, 注意只允许这个用户访问自己的 forgejo 仓库

# 之后就是下载远程二进制包, Forgejo 内部有 releases(标准版) 和 LTS(长期支持)
# Releases: https://forgejo.org/releases/
# 两个版本其实都见仁见智, 标准版对于组件支持比较快, 而长期支持版则是稳定性更高
# 我这里采用的是 released 版本, 先下载到 /tmp/forgejo-linux
# 如果你是采用 arm64 架构可能就需要对切换到对应平台
wget -O /tmp/forgejo-linux https://codeberg.org/forgejo/forgejo/releases/download/v13.0.3/forgejo-13.0.3-linux-amd64

# 移动二进制包到系统执行目录并授权
sudo cp /tmp/forgejo-linux /usr/local/bin/forgejo
sudo chmod 755 /usr/local/bin/forgejo

# 获取 systemd 的系统单元脚本
# 官方系统单元脚本一般够用的, 除非需要自己定义一些相关配置
sudo wget -O /etc/systemd/system/forgejo.service https://codeberg.org/forgejo/forgejo/raw/branch/forgejo/contrib/systemd/forgejo.service
# 不过很不巧的是我们用的是扩展的硬盘, 而官方配置写死的采用 /var/lib/forgejo
# 所以我们需要去编辑处理下 /etc/systemd/system/forgejo.service 系统单元文件
sudo -u git touch /etc/forgejo/app.env # 配置环境配置文件
sudo chmod 770 /etc/forgejo/app.env # 配置环境配置权限
sudo vim /etc/systemd/system/forgejo.service # 准备修改 systemd 配置

这里我重新更新部分配置, 最终的 /etc/systemd/system/forgejo.service 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[Unit]
Description=Forgejo (Beyond coding. We forge.)
Documentation=https://forgejo.org/docs/latest
After=syslog.target
After=network.target

# 追加硬盘和数据库依赖
After=local-fs.target
Wants=mariadb.service
After=mariadb.service

[Service]
RestartSec=2s
Type=simple
User=git
Group=git

# 硬盘空间是外部扩展硬盘空间
WorkingDirectory=/repository/

# 服务启动配置
ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
Restart=always
Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin

# 采用外部环境文件加载环境变量
# 这个文件内部有些环境量需要创建定义
EnvironmentFile=/etc/forgejo/app.env

# 开启启动配置
[Install]
WantedBy=multi-user.target

/etc/forgejo/app.env 内部的环境变量需要添加以下内容:

1
2
3
4
5
6
7
8
# 系统启动用户
USER=git

# 系统用户HOME目录
HOME=/home/git

# 项目本地目录, 也就是我们挂载的扩展目录
FORGEJO_WORK_DIR=/repository

确认配置完之后就可以准备刷新系统应用启动:

1
2
3
4
5
sudo systemctl daemon-reload # 刷新应用
sudo systemctl start forgejo.service # 启动应用
sudo systemctl status forgejo.service # 查看状态
sudo systemctl enable forgejo.service # 开机启动
sudo systemctl stop forgejo.service # 关闭应用

一般没有大问题都会显示 Starting new Web server: tcp:0.0.0.0:3000 on PID: 203145 类似成功的说明,
首次安装需要访问 http://localhost:3000/ 完成安装配置, 我们需要的就是配置之前说的数据库相关配置和访问配置.

注意: 完成之后会默认创建配置文件 /etc/forgejo/app.ini.

如果个人使用不要开启自助注册相关配置

这里我们就可以开始对配置配置就行修改,
具体配置查看: config-cheat-sheet

这里我们可以先关闭下之后自定义我们所需要的 forgejo 应用配置:

1
2
sudo systemctl stop forgejo.service # 关闭应用
sudo vim /etc/forgejo/app.ini # 修改配置

我这里主要对有些配置说明下配置即可, 这里需要抛开之前的 /etc/forgejo/app.env 定义的那些配置(不要去修改这些核心):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# forgejo 参考配置

################################################################
# 默认配置, 以下不需要怎么去修改
################################################################

# 应用名称
APP_NAME = Meteor Git Project

# 应用内容, 会默认设置页面的 title
APP_SLOGAN =

# 运行的系统用户
RUN_USER = git

# 工作目录
WORK_PATH = /repository

# 运行模式: prod - 生产/dev - 开发(输出调试日志)
RUN_MODE = prod


################################################################
# 数据库配置, 一般在初始化完成之后也不需要怎么修改
################################################################
[database]
DB_TYPE = mysql
HOST = 127.0.0.1:3306
NAME = forgejo
USER = forgejo
PASSWD = forgejo
SCHEMA =
SSL_MODE = disable
PATH = /repository/data/forgejo.db
LOG_SQL = false


################################################################
# Git仓库配置, 保持默认就行, 因为我们已经将主目录移动到扩展外的硬盘了
################################################################
[repository]
ROOT = /repository/data/forgejo-repositories

################################################################
# 设置提交最大文件大小
################################################################
[repository.upload]
# 注意默认 FILE_MAX_SIZE=3(默认单位:MB), MAX_FILES=5 做提交配置太小
# 这里需要设置提交的 4G(反向代理的时候也需要注意设置同样)
FILE_MAX_SIZE = 4095
MAX_FILES = 20

################################################################
# 外部访问配置, 这里就是我们常常需要处理的配置项目
################################################################
[server]
# 以下是仓库通过 ssh:// 拉取的配置项目
SSH_DOMAIN = 127.0.0.1
SSH_PORT = 22
# ssh 拉取地址合并为 ssh://{SSH_DOMAIN}:{SSH_PORT}/{仓库名}

# 以下是仓库通过 http(s):// 拉取的配置项目
DOMAIN = 127.0.0.1
HTTP_PORT = 3000
# http(s) 拉取地址合并为 http(s)://{DOMAIN}:{HTTP_PORT}/{仓库名}
# 实际上还有个 {HTTP_ADDR} 配置和 {DOMAIN} 类似, 但是那个配置负责处理 http|unix|https 的底层监听配置

# 默认页面访问地址, 默认地址为 %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/, 暴露到公网需要需要设置正确的外部访问域名
ROOT_URL = http://127.0.0.1:3000/

# 服务器数据目录, 不需要修改
APP_DATA_PATH = /repository/data

# 是否关闭 SSH 拉取功能, 如果没有设置域名解析, 在公网不想暴露 IP 可以直接关闭, 默认采用 http(s) 拉取
DISABLE_SSH = true

# git-lfs 是否 启用
LFS_START_SERVER = true

# git-lft 的安全哈希码, 可以通过 forgejo generate secret LFS_JWT_SECRET 命令生成
LFS_JWT_SECRET = L567FvDtY1zegLw7B6EG6U9AnSaqLw83lO8m_ynIMGs

# 是否开启离线模式, 一般推荐直接采用
OFFLINE_MODE = true


################################################################
# GitLfs配置, 保持默认就行
################################################################
[lfs]
PATH = /repository/data/lfs


################################################################
# OpenID自助注册, 个人使用直接关闭 OpenID 注册登陆
################################################################
[openid]
ENABLE_OPENID_SIGNIN = false
ENABLE_OPENID_SIGNUP = false


################################################################
# crontab 定时任务检查, 需要启动让内部定时处理对应状态任务
################################################################
[cron.update_checker]
ENABLED = true


################################################################
# 访问会话数据保存方式, 默认采用文件保持, 可以修改成 redis 之类加速
# 但是实际上个人直接采用 file 即可, 没必要引入 redis 增加复杂度
################################################################
[session]
PROVIDER = file
# 自定义的 cookie 绑定名称, 默认是 i_like_gitea
COOKIE_NAME = meteorcat-git-cookie


################################################################
# 其他相关服务配置
################################################################
[service]
# 关闭自助注册
DISABLE_REGISTRATION = true

# 未登录用户无法查看任何内容
REQUIRE_SIGNIN_VIEW = true

这里配置好之后返回页面会提示重新安装, 可以直接安装不会去覆盖掉原来的配置项,
具体配置在 http://{服务地址}/admin/config 页面查看.

后续就是具体的官方配置说明调整和 Nginx 反向代理之类的功能说明, 现在基本上已经足够满足个人私有配置.