Gitea Migration MySQL vers PostgreSql

De EjnTricks

Cet article présente la migration d'une instance Gitea depuis MySql vers Postgresql.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


System-Install-icon.png Initialisation base PostgreSql

Afin de migrer les données depuis une instance MySql, l'outil de dump des données est utilisé. Celui-ci va extraire les données mais également la déclaration des tables. Il n'est donc pas nécessaire de faire une installation à blanc avec la configuration PostgreSql.

Il est juste nécessaire d'initialiser le compte et la base dans PostgreSql, comme indiqué dans l'article configuration PostgreSql.

User-icon.png Création du role PostgreSQL

postgres=# CREATE USER "gitea" WITH PASSWORD 'GITEA_PASSWORD';
CREATE ROLE

GITEA_PASSWORD est remplacé par le mot de passe souhaité.

Icon-database-init.png Création de la base

postgres=# CREATE DATABASE gitea WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE

Attention, il est nécessaire de spécifier le modèle template0 si il est souhaité de spécifier la local en_US.UTF-8. Pour cette installation, si le template n'est pas spécifié, une erreur est retournée.

postgres=# CREATE DATABASE gitea WITH OWNER gitea ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
ERROR:  new collation (en_US.UTF-8) is incompatible with the collation of the template database (fr_FR.UTF-8)
HINT:  Use the same collation as in the template database, or use template0 as template.


Il faut ensuite installée une version vierge de Sonarquabe avec la même version que celle à migrer. Dans le cadre de cette article, c'est une version 7.8. L'instance est mise en place dans le répertoire /var/opt/sonarqube/7.8.p, et elle est configurée pour une base PostgreSql.

Le fichier de configuration de la version sous MySql se trouve à l'emplacement /var/opt/sonarqube/7.8/conf/sonar.properties, et à l'emplacement /var/opt/sonarqube/7.8.p/conf/sonar.properties pour l'instance sous PostgreSql.

Attention, une fois l'instance installée, il est recommandée de purger les données ElasticSearch.

#sudo rm -rf /var/opt/sonarqube/7.8.p/data/es6


Zip-icon.png Backup complet

Gitea dispose d'un outil permettant d'effectuer une sauvegarde complète de l'instance, incluant la base de données et les fichiers. Celui-ci est utilisé pour générer cette sauvegarde et en extraire le fichier avec les données extraites de la base. Pour mémoire, l'instance est installée, sous /var/opt/gitea et démarrée avec le compte gitea.

Folder-icon.png Initialisation

Un répertoire de travail est créé spécifiquement.

#sudo mkdir /tmp/giteamig
#sudo chmod 777 /tmp/giteamig

Run-icon.png Exécution

Puis la commande de backup est exécutée.

#sudo runuser -u gitea -- /var/opt/gitea/gitea dump -d postgres -c /var/opt/gitea/custom/conf/app.ini -f /tmp/giteamig/gitea-migration.zip

Unzip-icon.png Extraction sauvegarde

Une fois la sauvegarde terminée, il faut décompresser le fichier pour avoir accès au fichier gitea-db.sql contenant toutes les requêtes de création et injection de données.

#sudo unzip /tmp/giteamig/gitea-migration.zip -d /tmp/giteamig/


Icon-database-process.png Chargement des données

Une fois le fichier gitea-db.sql disponible, il faut le charger dans la base PostgreSql.

#sudo psql --username gitea -h localhost --set ON_ERROR_STOP=on gitea < /tmp/gitea-db.sql


Bug-icon.png Bug de données

Dans le cadre de cette article, le chargement des données provoquaient une erreur. En effet la colonne keep_activity_private, de la table user, autorisait les valeurs nulles au niveau de MySql, et la définition dans PostgreSql demande à ce que les données ne le soient pas. Il a fallu mettre à jour les données source pour forcer une valeur.

mysql> UPDATE user SET keep_activity_private = 0 WHERE keep_activity_private IS NULL;

Icon-Configuration-Settings.png Configuration Gitea

Une fois les données chargées dans PostgreSql, il faut modifier la configuration de Gitea pour mentionner la nouvelle chaîne de connexion.

Il faut arrêter le servic.

#sudo systemctl stop gitea

Puis il faut modifier la configuration dans le fichier /var/opt/gitea/custom/conf/app.ini.

[database]
#DB_TYPE  = mysql
DB_TYPE  = postgres
#HOST     = 127.0.0.1:3306
HOST     = 127.0.0.1:5432
NAME     = gitea
USER     = gitea
PASSWD   = GITEA_PASSWORD
SCHEMA   =
SSL_MODE = disable
CHARSET  = utf8

A noter que dans cette configuration, la variable SCHEMA est laissée à vide pour utiliser le schéma par défaut public.

Et enfin redémarrer le service.

#sudo systemctl start gitea


Viewer icon.png Voir aussi

Documentation officielle: https://docs.gitea.io/en-us/command-line/#dump

https://discourse.gitea.io/t/migrate-gitea-db-from-mariadb-to-postgresql/2072/3