前言

在日常开发中,我们经常需要一个私有的Git仓库服务来托管代码。虽然GitHub和Gitee都非常好用,但有时候出于数据隐私、网络速度或者完全掌控的需要,自建一个Git服务是很有必要的。

考虑到你可能面临服务器到期更换服务商的情况,数据的便携性和迁移的便利性成为了核心需求。同时,你也希望平台能完美支持中文

综合这些需求,Gitea 是一个绝佳的选择。它是一个开源的、轻量级的Git服务,使用Go语言编写,运行速度快,资源占用低,且完美支持Docker部署。最重要的是,它的数据结构非常简单,迁移起来只需要打包几个目录即可。

本文将手把手教你如何使用Docker部署Gitea,并演示如何进行数据的备份与迁移。

环境准备

在开始之前,请确保你的服务器已经安装了Docker和Docker Compose。

针对中国大陆用户的特别提示
由于网络原因,直接从Docker Hub拉取镜像可能会很慢甚至失败。建议配置国内的Docker镜像加速器。

编辑 /etc/docker/daemon.json (如果不存在则创建),添加如下配置(使用国内常见的加速源):

1
2
3
4
5
6
7
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]
}

注:镜像源地址可能会随时间失效,建议搜索最新的可用加速源。
配置完成后重启Docker:sudo systemctl restart docker

部署步骤

1. 创建项目目录

首先,我们在服务器上创建一个目录来存放Gitea的配置和数据。

1
2
mkdir -p /home/docker/gitea
cd /home/docker/gitea

2. 编写 docker-compose.yml

为了保证数据的便携性,我们直接将容器内的数据映射到当前目录下的 data 文件夹中。这样,当你需要迁移时,只需要把整个 /home/docker/gitea 目录打包带走即可。

创建并编辑 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3"

services:
server:
image: docker.1ms.run/gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
# 设置时区为上海
- TZ=Asia/Shanghai
restart: always
volumes:
# 核心:将数据持久化到当前目录下的data文件夹
- ./data:/data
# 保持与宿主机时间同步
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
ports:
# Web访问端口,选择一个小众的端口,避免与其他服务冲突 10000-20000 范围
- "13333:3000"
# SSH端口,宿主机的12222映射到容器的22
# 注意:不要占用宿主机本身的22端口,否则你连不上服务器了
- "12222:22"

为什么映射 “12222:22”?

很多新手会问:为什么不直接用 22:22

  • 宿主机冲突:你的 Linux 服务器本身就需要通过 SSH(默认端口 22)来进行远程管理。如果容器也占用宿主机的 22 端口,会导致端口冲突,甚至让你无法远程连接服务器。
  • 容器隔离:Gitea 容器内部需要通过 22 端口提供 Git over SSH 的服务。
  • 解决方案:我们将宿主机的闲置端口(如 12222)转发到容器的 22 端口。这样,你管理服务器用 ssh root@ip -p 22,拉取代码用 git clone ssh://git@ip:12222/...,互不干扰。

3. 启动服务

docker-compose.yml 所在目录下执行:

1
docker-compose up -d

等待片刻,使用 docker-compose logs -f 查看日志,看到 “Listen on :3000” 字样说明启动成功。

初始化配置

开启防火墙端口

为了能够从外部访问Gitea服务,我们需要开启防火墙端口。

  1. 假设你的服务器IP为 192.168.1.100,则需要开启 1333312222 端口。
  2. 具体操作取决于你使用的防火墙软件。以下是一个示例(使用 ufw):
1
2
3
4
# 开启13333端口
ufw allow 13333/tcp
# 开启12222端口
ufw allow 12222/tcp
  • Web 服务端口: 填写 13333 (对应docker-compose中映射的端口)。
  • SSH 服务端口: 填写 12222 (对应docker-compose中映射的端口)。
  • 基础URL: http://你的域名或IP:13333/
  1. 打开浏览器,访问 http://你的服务器IP:13333
  2. 你会看到安装向导页面。Gitea会自动识别浏览器语言,如果显示英文,可以在右上角手动切换为简体中文
  3. 数据库设置
    • 为了最极致的迁移便利性,建议选择 SQLite3
    • SQLite3 是一个文件型数据库,数据直接存储在我们在 docker-compose.yml 中映射的 data 目录下。这意味着你不需要额外部署MySQL容器,备份时也少了一个步骤。对于中小团队或个人使用,性能完全足够。
  4. 一般设置
    • 服务器域名: 填写你的域名或服务器IP。
    • SSH 服务端口: 填写 12222 (对应docker-compose中映射的端口)。
    • 基础URL: http://你的域名或IP:13333/ (注意端口要和Web端口一致)。
  5. 可选设置
    • 建议在“管理员帐号设置”中创建一个管理员账户。如果不创建,注册的第一个用户将自动获得管理员权限。

点击“立即安装”,稍等片刻即可进入首页。

SSH 使用小贴士

由于使用了非标准 SSH 端口(12222),以后 clone 代码时地址会变成这样:
git clone ssh://git@your-ip:12222/username/repo.git

如果你不想每次都输入端口,可以在本地电脑配置 ~/.ssh/config

1
2
3
4
Host my-gitea
HostName your-ip
Port 12222
User git

这样就可以直接写:git clone my-gitea:username/repo.git,非常方便。

数据迁移与备份

这是你最关心的部分。由于我们在 docker-compose.yml 中使用了 ./data:/data 映射,并且选择了 SQLite3 数据库,Gitea 的所有数据(包括代码仓库、用户数据、数据库文件、配置文件)都完整地保存在了宿主机的 /home/docker/gitea/data 目录下。

备份(打包)

当你的服务器到期,或者需要迁移到新服务商时,只需执行以下步骤:

  1. 停止服务(为了保证数据一致性,建议先停止容器):

    1
    2
    cd /home/docker/gitea
    docker-compose down
  2. 打包目录

    1
    2
    3
    cd /home/docker
    # 将整个gitea目录打包为 gitea-backup.tar.gz
    tar -czvf gitea-backup.tar.gz gitea/
  3. 下载备份文件:使用SCP、SFTP等工具将 gitea-backup.tar.gz 下载到本地或直接传输到新服务器。

恢复(迁移)

在新服务器上:

  1. 确保环境就绪:安装好 Docker 和 Docker Compose。
  2. 上传并解压
    gitea-backup.tar.gz 上传到 /home/docker 目录(或者你喜欢的任何位置)。
    1
    2
    cd /home/docker
    tar -xzvf gitea-backup.tar.gz
  3. 启动服务
    1
    2
    cd /home/docker/gitea
    docker-compose up -d

就是这么简单!你的所有仓库、用户、甚至登录状态都完全恢复了。

总结

通过 Docker + Gitea + SQLite 的组合,我们实现了一个:

  1. 部署极快:几行配置搞定。
  2. 中文支持:原生完美支持。
  3. 迁移无忧:数据完全独立,打包即走。

这套方案非常适合个人开发者或中小团队构建私有的代码托管平台,再也不用担心服务器到期数据难移的问题了。