前言

Gitea 搭好了、代码也推上去了,但很多新手都会忽略一个关键问题:维护

Gitea 团队每个月都会发布新版本,修复安全漏洞、加新功能、修 bug。如果你一直不升级,可能会遇到这些问题:

  • 安全漏洞被利用(Git 仓库泄露)
  • 有些功能用不了(新版本改了一些接口)
  • 想装新插件,但版本太老不支持

别担心,维护 Gitea 没有你想象的那么复杂。这篇文章会教你 升级 + 日常维护 的全流程,全是实战经验。


一、升级前最重要的事:备份

不管你怎么升级,第一步永远是备份。

Gitea 的数据分两部分:

数据类型存在哪里怎么备份
配置文件/etc/gitea/app.ini/opt/gitea/custom/conf/app.ini直接复制
仓库数据/home/git/gitea-repositories/ 或你自己设的路径压缩打包
数据库SQLite 文件或 MySQL 数据库导出 SQL

SQLite 备份(最简单)

如果你装 Gitea 时选了 SQLite,备份就一个文件:

# 找到你的数据库文件(通常在 Gitea 数据目录下)
find / -name "gitea.db" 2>/dev/null

# 假设路径是 /var/lib/gitea/data/gitea.db,复制它就行
cp /var/lib/gitea/data/gitea.db /tmp/gitea-backup.db

MySQL 备份(如果你用 MySQL)

mysqldump -u root -p gitea > /tmp/gitea-backup.sql

一键全量备份脚本

把下面这段保存成 backup-gitea.sh

#!/bin/bash
# Gitea 一键备份脚本

BACKUP_DIR="/backup/gitea"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

echo "📦 开始备份 Gitea..."

# 1. 备份配置文件
cp /etc/gitea/app.ini $BACKUP_DIR/app.ini.$DATE

# 2. 备份仓库数据
tar -czf $BACKUP_DIR/repos.$DATE.tar.gz /home/git/gitea-repositories/

# 3. 备份数据库(SQLite 版本)
cp /var/lib/gitea/data/gitea.db $BACKUP_DIR/gitea.db.$DATE

echo "✅ 备份完成:$BACKUP_DIR"
ls -lh $BACKUP_DIR/

设置每周自动备份:

crontab -e
# 添加下面这行,每周日凌晨 3 点自动备份
0 3 * * 0 /root/backup-gitea.sh

二、升级 Gitea

Gitea 的升级非常简单——本质上就是替换一个二进制文件

方法一:手动升级(理解原理)

先停服务,下载新版本,替换文件,重启服务:

# 1. 停止 Gitea
systemctl stop gitea

# 2. 备份当前版本(万一新版本有问题可以回退)
cp /usr/local/bin/gitea /tmp/gitea-old

# 3. 下载最新版本
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.22/gitea-1.22-linux-amd64

# 4. 设置可执行权限
chmod +x /usr/local/bin/gitea

# 5. 启动 Gitea
systemctl start gitea

# 6. 验证版本
gitea -v

就这么几步。但每次都要查版本号、手打命令,有点麻烦。所以我写了一个自动化脚本。

方法二:一键升级脚本(推荐)

我写了一个升级脚本,全自动检测最新版本、下载、替换、启动一条龙:

#!/bin/bash
# Gitea 一键升级脚本
# 自动检测最新版本并升级
set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

脚本做了哪些事情?

来逐个看一下核心部分:

1. 检测当前版本:

get_current_version() {
    gitea -v | grep -o 'gitea version [0-9.]*' | grep -o '[0-9.]*'
}

Gitea 自带的 -v 参数会输出版本号,脚本从中提取数字部分。

2. 获取最新版本:

get_latest_version() {
    latest_version=$(curl -s https://api.github.com/repos/go-gitea/gitea/releases/latest \
        | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//')
    # 如果 GitHub API 连不上,备选方案
    if [ -z "$latest_version" ]; then
        latest_version=$(curl -s https://dl.gitea.com/gitea/ \
            | grep -oE 'gitea-[0-9]+\.[0-9]+\.[0-9]+-linux-amd64' | head -1 | sed 's/gitea-//' | sed 's/-linux-amd64//')
    fi
    echo "$latest_version"
}

先去 GitHub API 查最新版本号,如果网络问题查不到,就去 Gitea 官方下载站列表里找最新版本。双重保险。

3. 版本比较,自动判断是否需要升级:

version_compare() {
    higher_version=$(printf '%s\n' "$1" "$2" | sort -V | tail -n1)
    # 判断哪个更新
}

利用 Linux 的 sort -V(版本号排序)来比较,比自己写正则靠谱多了。

4. 智能检测架构:

get_architecture() {
    arch=$(uname -m)
    case "$arch" in
        x86_64|amd64) echo "amd64"    ;;
        aarch64|arm64) echo "arm64"   ;;
        # ...
    esac
}

不管是 x86 服务器还是 ARM 开发板(树莓派、Oracle ARM),脚本自动检测下载对应版本。

5. 升级核心流程:

# 停止服务 → 备份 → 下载 → 替换 → 启动
systemctl stop gitea                                     # 停服务
cp /usr/local/bin/gitea /tmp/gitea_backup_$(date +%s)    # 备份旧版
wget -O gitea $download_url                              # 下载新版
install -m 0755 gitea /usr/local/bin/gitea               # 安装
systemctl start gitea                                    # 启动服务

如果下载失败,脚本会自动恢复备份,不会让你的 Gitea 变砖。

使用方法

# 给执行权限
chmod +x gitea-upgrade.sh

# 以 root 运行
sudo ./gitea-upgrade.sh

输出类似这样:

[INFO] 当前版本: 1.22.0
[INFO] 最新版本: 1.25.0
[INFO] 发现新版本,开始升级...
[INFO] 检测到系统: linux-amd64
[INFO] 下载URL: https://dl.gitea.com/gitea/1.25.0/gitea-1.25.0-linux-amd64
[INFO] 下载成功
[INFO] 安装成功
[INFO] Gitea服务启动成功
[INFO] 升级完成,当前版本: 1.25.0

还可以加参数:

sudo ./gitea-upgrade.sh -v       # 只看当前版本
sudo ./gitea-upgrade.sh -f       # 强制重新升级(版本相同也重装)

三、日常维护

除了升级,日常还要关注这几个方面。

1. 查看服务状态

systemctl status gitea
# 应该显示 active (running)

2. 查看日志

# 查看 Gitea 日志
journalctl -u gitea -n 50 --no-pager

# 实时查看日志(按 Ctrl+C 退出)
journalctl -u gitea -f

如果看到 errorpanic 关键词,说明有问题需要处理。

3. 检查磁盘空间

# Git 仓库占空间会越来越大,定期检查
df -h

# 查看 Gitea 数据目录大小
du -sh /home/git/gitea-repositories/

建议保持 剩余空间 20% 以上,否则 Git 操作可能失败。

4. 检查端口是否正常

# Gitea 默认端口是 3000
ss -tlnp | grep 3000
# 或者检查 Nginx 是否在监听
ss -tlnp | grep 80
# 如果配了 HTTPS
ss -tlnp | grep 443

5. 健康检查脚本

把下面这段加到你的定时任务里,每天自动检查:

#!/bin/bash
# Gitea 健康检查

# 检查进程
if ! pgrep gitea > /dev/null; then
    echo "[$(date)] Gitea 进程挂了,正在重启..." >> /var/log/gitea-health.log
    systemctl restart gitea
fi

# 检查 HTTP 响应
if ! curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q 200; then
    echo "[$(date)] Gitea HTTP 无响应" >> /var/log/gitea-health.log
fi

# 检查磁盘空间
usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$usage" -gt 85 ]; then
    echo "[$(date)] 磁盘使用率 ${usage}%,请清理" >> /var/log/gitea-health.log
fi

四、常见问题

Q:升级后 Gitea 打不开了怎么办?

别慌,恢复备份:

# 如果脚本自动备份了
cp /tmp/gitea_backup_*/gitea_backup /usr/local/bin/gitea
systemctl restart gitea

# 或者把之前备份的旧版二进制文件复制回去

Q:升级后代码仓库会丢吗?

不会。 Gitea 的仓库数据存在 /home/git/gitea-repositories/ 目录下,升级只是替换二进制文件,不影响仓库数据。但是不怕一万就怕万一,升级前还是建议备份。

Q:多久升级一次?

建议 每个月检查一次。Gitea 平均每 1-2 个月发一个版本。

可以设置定时任务每月检查:

# 每月 1 号凌晨 2 点检查更新
0 2 1 * * /root/gitea-upgrade.sh >> /var/log/gitea-upgrade.log 2>&1

Q:版本跨度太大能直接升级吗?

可以,Gitea 的升级兼容性做得很好。不过如果你是从很老的版本(比如 1.15 以下)跳到最新版,建议先看看版本发布说明(Release Notes),确认有没有破坏性变更。


写在最后

Gitea 的维护其实很简单,总结下来就是三件事:

  1. 定期备份(每周自动一次)
  2. 按月升级(用脚本一键搞定)
  3. 日常巡检(看看日志和磁盘)

做完这三件事,你的 Gitea 就能稳定运行好几年。仓库里的代码是你最宝贵的资产,花 5 分钟做一下备份,比出问题再想对策靠谱得多。

下一篇文章会讲 Gitea Actions 自动化 CI/CD,可以期待一下!