In diesem Artikel zeige ich euch, wie ihr eure Repositories und Daten von eurem alten Gitea-Verzeichnis in ein neues Verzeichnis verschiebt.

Falls ihr Gitea noch nicht nutzt, schaut euch folgenden Artikel an: Gitea installieren und einrichten

Warum der Aufwand?

Grundsätzlich hat Gitea bei mir wunderbar funktioniert und tut es immernoch. Ich hatte allerdings immer wieder Probleme mit den Automatischen Updates.

Im Grunde ist Update sehr einfach:

  • Service stoppen
  • Neue Version herunterladen
  • Recht für Ausführung hinzufügen
  • Service starten

Die Befehle auf der Kommandozeile sahen entsprechend ähnlich aus:

cd PATH_TO_GITEA
systemctl stop gitea
mv gitea gitea.bak
wget -O gitea GITEA_DOWNLOAD_URL
chmod +x gitea
systemctl start gitea

Allerdings gab es immer wieder seltsame Probleme. Das Aktuellste habe ich für die Entwickler zur Info eingestellt: InitIssuesIndexer: create index, mkdir /usr/local/bin/data: permission denied

Es kam regelmäßig vor, dass der Service nicht wieder gestartet werden konnte, obwohl der Aufruf in der Kommandozeile problemlos funktionierte.

Ein Neustart des Geräts (Raspberry) hat den Fehler korrigiert. Ich hätte jedes Mal das System neu starten können und das ist auch in wenigen Sekunden erledigt. Allerdings ist ein Neustart nur eine Symptombekämpfung anstatt eine Lösung des Problems.

Meine Umgebung

Es gibt ein bekanntes Sprichwort: Nichts hält länger als ein Provisorium. So auch bei mir. Als ich Gitea ausprobiert habe, habe ich unter /home/pi/gitea das Programm und die Verzeichnisse abgelegt. Alle Daten waren im Benutzerverzeichnis.
Da ich keinen separaten Benutzer angelegt habe und auch der Service als pi-Benutzer ausgeführt wurde, hatte ich keinerlei Probleme.

Zielumgebung

Die Zielumgebung ist in der Installationsanleitung gut dokumentiert. Dort wird, wie auch im Ticket beschrieben, der Filesystem Hierarchy Standard (FHS) verwendet. Dieser Standard gibt einen bestimmten Aufbau der Verzeichnisse vor.
Die Benutzerdaten (hier Repositories) sollten daher unter /var/lib anstatt im Benutzerverzeichnis abgelegt werden.

Im Groben sind daher folgende Schritte notwendig:

  • Verschieben der Anwendung nach /usr/local/bin/
  • Verschieben der Konfigurationsdatei nach /etc/gitea/
  • Gitea-Dateien nach /var/lib/gitea/ verschieben
  • Anpassen des systemd-Services

Migration der Daten

Nachfolgend zeige ich, wie ich die bestehenden Daten migriert habe. Bei euch heißen die Dateien und Ordner ggfs. anders. Bitte achtet darauf, die richtigen Namen und Pfade zu verwenden!

Service stoppen

Um zu beginnen, müssen wir den Service beenden:

systemctl stop gitea

Zielstrukturen anlegen und Dateien verschieben

Nun legen wir die Strukturen an:

mkdir /var/lib/gitea
mkdir /etc/gitea

Nun kopieren wir die Ordner und Daten in die jeweiligen Verzeichnisse:

cp -r /home/pi/gitea/gitea-repositories/ /var/lib/gitea/
cp -r /home/pi/gitea/gitea-lfs/ /var/lib/gitea/
cp -r /home/pi/gitea/data/ /var/lib/gitea/
cp /home/pi/gitea/custom/conf/app.ini /etc/gitea/app.ini
cp /home/pi/gitea/gitea /usr/local/bin/gitea

Persönlich kopiere ich lieber die Daten und lösche sie anschließend, wenn alles fehlerfrei funktioniert. Denn im Fehlerfalle könnt ihr die neu erstellten Dateien einfach löschen und ggf. nochmal neu Anfangen oder das System auf den alten Stand zurücksetzen ohne Datenverlust.

Konfiguration und Service anpassen

Die Konfiguration öffnen wir mit Hilfe des Editors:

nano /etc/gitea/app.ini

Ich habe in der Konfigurationsdatei nur den Pfad zum LFS (Large File Storage) von Git hinterlegt. Je nachdem, welche Datenbank ihr verwendet, müsst ihr den Pfad zu eurer SQLite-Datei ändern.

LFS_CONTENT_PATH = /var/lib/gitea/gitea-lfs

Um Gitea automatisch bei Systemstart auszuführen nutze ich systemd.
Hier findet ihr die Dokumentation, um den Dienst einzurichten. Die Servicedatei öffnen wir ebenfalls mit einem Editor:

nano /etc/systemd/system/gitea.service

Folgende Zeilen sind wichtig, und müssen an die neuen Pfade angepasst werden:

Alte Konfiguration:

WorkingDirectory=/home/pi/gitea/
ExecStart=/home/pi/gitea/gitea web --config /home/pi/gitea/custom/conf/app.ini
Environment=USER=pi HOME=/home/pi GITEA_WORK_DIR=/home/pi/gitea/


Neue Konfiguration:

WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Environment=USER=pi HOME=/home/pi GITEA_WORK_DIR=/var/lib/gitea

Mit systemctl daemon-reload laden wir die Konfiguration neu und können sie beim nächsten Start verwenden.

Service starten

Nachdem wir die Daten nun in die neuen Verzeichnisse verschoben haben, können wir den Dienst wieder starten.

systemctl start gitea

Euer Service sollte nun ohne Probleme laufen und ihr könnt die Webseite und Repositories wieder wie gewohnt benutzen. Mit Hilfe von journalctl könnt ihr euch den aktuellen Status anzeigen lassen:

journalctl -u gitea -n 20

Der Parameter -n limitiert die Ausgabe auf die letzten 20 Zeilen. Eure Ausgabe sollte nun in etwa so aussehen:

Jan 28 19:17:52 gitea01 systemd[1]: Started Gitea (hosted where the data belongs).
Jan 28 19:17:53 gitea01 gitea[13040]: 2020/01/28 19:17:53 ...dules/setting/git.go:87:newGit() [I] Git Version: 2.11.0
Jan 28 19:17:53 gitea01 gitea[13040]: 2020/01/28 19:17:53 routers/init.go:74:GlobalInit() [T] AppPath: /usr/local/bin/gitea
Jan 28 19:17:53 gitea01 gitea[13040]: 2020/01/28 19:17:53 routers/init.go:75:GlobalInit() [T] AppWorkPath: /var/lib/gitea
Jan 28 19:17:53 gitea01 gitea[13040]: 2020/01/28 19:17:53 routers/init.go:76:GlobalInit() [T] Custom path: /var/lib/gitea/custom
Jan 28 19:17:53 gitea01 gitea[13040]: 2020/01/28 19:17:53 routers/init.go:77:GlobalInit() [T] Log path: /var/log/gitea

Aufgetretene Laufzeitfehler

Im Grunde hat das Anlegen und Klonen der Git-Repositories problemlos funktioniert. Bei mir sind zwei Probleme aufgetreten:

  • clone und push via SSH-Schlüssel war nicht mehr möglich
  • Das Pushen von Repositories war generell nicht mehr möglich, aufgrund eines Fehlers im pre-hook

Das SSH-Problem ließ sich sehr einfach beheben: Ich habe in der Weboberfläche von Gitea unter Einstellungen > SSH-/GPG-Schlüssel meinen vorhandenen SSH-Schlüssel gelöscht und neu hochgeladen.
Anschließend konnte ich die Daten klonen. Ein push war leider immernoch nicht möglich.

Das Pushproblem war etwas komplexer: Die Fehlermeldung gab an, dass gitea nicht gefunden werden konnte. GLücklicherweise gab Git an, dass der Fehler in pre-receive aufgetreten ist

Ich habe mir Repository die Hook angesehen:

nano REPOSITORY.git/hooks/pre-receive.d/gitea

"/home/pi/gitea/gitea" hook --config='/home/pi/gitea/custom/conf/app.ini' pre-receive

Gitea legt für jedes Repository Hooks an. Ich gehe davon aus, dass diese zur Aktualisierung der Webseite verwendet werden, um beispielsweise Änderungen anzuzeigen.

Wie man sehen kann, ist hier noch der alte Pfad eingetragen. Eine Aktualisierung auf den neuen Pfad hat auch dieses Problem gelöst und ich konnte die Änderungen wieder pushen. Hierbei ist zu beachten, dass jedes Repository mehrere Hooks hat:

  • pre-receive
  • post-receive
  • update

Die Einfachse möglichkeit für mich war es, den gesamten gitea-repositories Ordner auf meinen Computer zu übertragen und den gesamten Ordner mit Visual Studio Code zu öffnen.

Anschließend habe ich nach allen fehlerhaften Pfaden gesucht und die Pfade zur Anwendung und Konfigurationsdatei händisch angepasst. Anschließend habe ich diesen Ordner zurück auf den Raspberry kopiert und Gitea neu gestartet.

Fazit

Wie ihr sehen könnt ist der Aufwand überschaubar. Ihr müsst vor allem darauf achten, die richtigen Pfade in der Konfiguration und dem Service zu hinterlegen. Der Fehler in den Hooks hat mich persönlich überrascht und war der größte Aufwand. Neue Repositories haben dieses Problem nicht, da diese korrekt angelegt werden.


Bildnachweis: Pixabay.com