业务背景

当前gitea版本比较老,且数据库用的sqllite3,当前sqllite3的db文件增长到了800多M,当前git访问性能越来越低,为提高性能,计划将gitea-v1.17.1升级到当前最新版本v1.22.1,并将数据库从sqllite3迁移到mariadb-v11.4.2。

解决方案

将gitea从v1.17.1升级到当前最新版本v1.22.1;将数据库从sqllite3迁移到mariadb-v11.4.2;采用docker-compose.yaml快速部署。

实现步骤

  1. 用docker-compose.yaml快速部署mariadb。
 cd /data
 mkdir mariadb
 cd mariadb
 vim docker-compose.yaml
version: '3'
services:
  mariadb:
    image: mariadb:11.4.2
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea_root_passwd # root密码
      - MYSQL_USER=gitea    #  数据库用户
      - MYSQL_PASSWORD=gitea_passwd # 数据库密码
      - MYSQL_DATABASE=gitea # 数据库名称
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./conf:/etc/mysql/mariadb.conf.d

启动mariadb

 docker-compose up -d
  1. 安装sqlite3-to-mysql
 pip install sqlite3-to-mysql
  1. 停止gitea服务,备份gitea后,将sqllite3迁移到mariadb
 cd /data
 tar -cvf gitea_bak.tar ./gitea
 sqlite3mysql --sqlite-file ./gitea/gitea.db --mysql-database gitea --mysql-user root --mysql-password "gitea_root_passwd" --mysql-collation utf8mb4_bin

迁移完成,检查mariadb中gitea库。

  1. 修改gitea配置app.ini文件中,并启动gitea
 cd /data/gitea/
 vim ./gitea/conf/app.ini

修改[database]、[log]如下参数,其余保持不变


[database]
DB_TYPE = mysql # 修改为mysql
HOST = 192.168.3.3:3306 # 修改为mariadb地址
NAME = gitea # 修改为mariadb中gitea库名
USER = gitea # 修改为mariadb中gitea用户名
PASSWD = gitea_passwd # 修改为mariadb中gitea用户密码

[log]
# ROUTER = console
logger.router.MODE = console

启动gitea进行验证。

 cd /data/gitea/
 docker-compose up -d
  1. 拉取gitea最新版本,并启动gitea。
 cd /data/gitea    
 vim docker-compose.yaml
version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.22.1 # 修改为最新版本1.22.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ../gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2000:22"

启动gitea和mariadb

 docker-compose up -d
  1. 迁移完成,也可以将两个yaml整合到一个文件中。
version: "3"
networks:
  gitea:
    external: false
services:
  server:
    image: gitea/gitea:1.22.1 # 修改为最新版本1.22.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      # - GITEA__database__DB_TYPE=mysql
      # - GITEA__database__HOST=192.168.3.3:3306 #若db不映射端口,此处改成db:3306
      # - GITEA__database__NAME=gitea
      # - GITEA__database__USER=gitea
      # - GITEA__database__PASSWD=gitea_passwd
    restart: always
    networks:
      - gitea
    volumes:
      - ../gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2000:22"
    depends_on:
      - db
  db:
    image: mariadb:11.4.2
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root_passwd # root密码
      - MYSQL_USER=gitea    #  数据库用户
      - MYSQL_PASSWORD=gitea_passwd # 数据库密码
      - MYSQL_DATABASE=gitea # 数据库名称
    volumes:
      - ../mariadb/data:/var/lib/mysql
      - ../mariadb/conf:/etc/mysql/mariadb.conf.d
    ports:
      - "3306:3306"  #可以不映射端口,保持映射为了在宿主机上可用脚本来备份数据库

参考:

https://docs.gitea.com/zh-cn/installation/install-with-docker

https://pypi.org/project/sqlite3-to-mysql/2.3.0/