需求背景

最近在开发公司的项目时,因为不想使用公司的 SVN 服务进行版本管理,涉密的代码又无法放到 Github 等公开平台进行托管,正好手上有一台小主机,就想着在上面部署一个私有的 Git 服务,折腾了好一会,最终得到如下方案。

Gitea 安装

Gitea 是一个轻量级的 DevOps 平台软件,采用 Go 作为后端语言,非常轻量。安装也非常简单,直接使用 Docker 即可。

docker-compose.yaml

version: "3"

services:
  server:
    image: gitea/gitea:1.24
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"

或者直接使用命令启动:

docker run -itd -p 3000:3000 -p 2222:22 -e USER_UID=1000 -e USER_GID=1000 -v /app/gitea:/data --name gitea gitea/gitea:1.24

启动之后正常安装,设置管理员信息即可。

SSH 认证问题

我在内网搭建 gitea 时,即使配置了 ssh 公钥,但因为 gitea 容器的 ssh 端口被映射到了 2222 端口,所以在配置远程仓库时,无法直接使用默认端口,在 scp 地址中又无法直接指定端口为 2222,所以在尝试 push 时会一直提示输入密码。

为了解决这个问题,在网上找到的解决方案如下:

  1. 设置本地仓库的 origin:git remote add origin git@192.168.100.1:2222/yv1ing/xxx.git
  2. 设置本地仓库的 origin-url:git remote set-url origin ssh://git@192.168.100.1:2222/yv1ing/xxx.git

配置完成之后就可以正常 push 了。

数据备份

由于使用 Docker 运行 gitea,因此只需要把 gitea 的数据目录映射到宿主机,然后定期归档压缩后,备份到其它地方即可。

附备份脚本如下:

#!/bin/bash

DATE=$(date +"%Y%m%d")
BACKUP_FILE="gitea-$DATE.tar.gz"

tar -czf /tmp/$BACKUP_FILE -C /app gitea
rclone copy /tmp/$BACKUP_FILE yvling:/普通归档/gitea/
rm -f /tmp/$BACKUP_FILE

rclone cleanup yvling:/普通归档/gitea/