自托管 Git 站点
之前公司内部都是采用 Gitea 做自己平台的内网脱管, 但是自从 Gitea 被其他公司收购后为了避免后续的商业纷争,
原版本 Gitea 额外分出 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 数据库配置:
# 安装 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 文件如下:
[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 内部的环境变量需要添加以下内容:
# 系统启动用户
USER=git
# 系统用户HOME目录
HOME=/home/git
# 项目本地目录, 也就是我们挂载的扩展目录
FORGEJO_WORK_DIR=/repository
确认配置完之后就可以准备刷新系统应用启动:
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 应用配置:
sudo systemctl stop forgejo.service # 关闭应用
sudo vim /etc/forgejo/app.ini # 修改配置
我这里主要对有些配置说明下配置即可, 这里需要抛开之前的 /etc/forgejo/app.env 定义的那些配置(不要去修改这些核心):
# 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 反向代理之类的功能说明, 现在基本上已经足够满足个人私有配置.