BlueGit

Help Van de user-unit naar de system-service

This page is not available in your language yet; it is shown in another language.

Van de user-unit naar de system-service

De AUR-package installeert een system-service: User=bluegit, config in /etc/bluegit/config.yml, state in /var/lib/bluegit. De installatie die nu draait is een user-unit, met config /home/timfa/bluegit/config.yml, state /home/timfa/bluegit/state en de datadisk /home/timfa/temp-bluegit.

Die datadisk kan niet op die plek blijven. ProtectHome=true maakt /home ontoegankelijk voor de service, en ReadWritePaths opent daar geen gat in. De gebruiker bluegit kan /home/timfa bovendien niet in. Verhuis de datadisk naar /srv/bluegit. Daar wordt straks de 4 TB-schijf gemount. Het pad in storage_path blijft dan hetzelfde.

Stop de user-unit eerst. SQLite en de poorten mogen niet door twee processen gedeeld worden.

systemctl --user stop bluegit
systemctl --user disable bluegit

Staat de unit onder een andere naam, stop dan de unit waarvan ExecStart bluegit serve --config /home/timfa/bluegit/config.yml is.

Installeer daarna het package. bluegit.install maakt de systeemgebruiker bluegit en de state-map aan en herlaadt systemd. De service start alleen als /etc/bluegit/config.yml en het clientgeheim er al zijn. Bij deze migratie ontbreekt het geheim nog, dus de hook print de vervolgstappen en zet de service niet aan. Een bestaande /etc/bluegit/config.yml blijft staan.

Kopieer de state terwijl de user-unit uit staat. secret.key hoort bij bluegit.db; zonder die sleutel is de database onleesbaar. De SSH-hostkey mee kopiëren houdt known_hosts geldig. Het bestand storage_path wijst nog naar /home/timfa/temp-bluegit; dat pad wordt hieronder vervangen.

install -d -o bluegit -g bluegit -m 750 /var/lib/bluegit
cp -a /home/timfa/bluegit/state/. /var/lib/bluegit/
chown -R bluegit:bluegit /var/lib/bluegit

Zet de config op de system-plek en verander alleen state_path:

install -o root -g bluegit -m 640 /home/timfa/bluegit/config.yml /etc/bluegit/config.yml

In /etc/bluegit/config.yml wordt state_path /var/lib/bluegit. Een storage_path in dat bestand is niet nodig: het bestand /var/lib/bluegit/storage_path wint. Wijst client_secret_file nog naar een bestand onder /home/timfa, kopieer dat dan naar /etc/bluegit/client_secret (mode 0600, eigenaar bluegit) en pas het pad aan.

Verhuis de datadisk terwijl beide services uit staan. rsync -aHAX houdt hardlinks, permissies, xattrs en ACLs. De kopie erft de eigenaar timfa; chown zet ze daarna op bluegit. Hangt de 4 TB-schijf er al, mount die dan eerst op /srv/bluegit, zodat de kopie op die schijf landt.

install -d -o bluegit -g bluegit -m 750 /srv/bluegit
rsync -aHAX /home/timfa/temp-bluegit/ /srv/bluegit/
chown -R bluegit:bluegit /srv/bluegit
printf '%s\n' /srv/bluegit > /var/lib/bluegit/storage_path
chown bluegit:bluegit /var/lib/bluegit/storage_path
chmod 640 /var/lib/bluegit/storage_path

ProtectSystem=strict schrijft alleen naar /var/lib/bluegit. Een drop-in zet /srv/bluegit open. Een pad onder /home hoort hier niet.

install -d /etc/systemd/system/bluegit.service.d
cat > /etc/systemd/system/bluegit.service.d/storage.conf <<'EOF'
[Service]
ReadWritePaths=/srv/bluegit
EOF

De runner Steve start Docker. De socket hoort bij de groep docker. De unit in het package zet daarom SupplementaryGroups=docker; de gebruiker bluegit hoeft zelf niet in die groep. Zonder die regel kan Steve geen job draaien. systemctl cat bluegit hoort de regel te tonen. Ontbreekt hij op een oudere unit, zet hem dan in een drop-in:

cat > /etc/systemd/system/bluegit.service.d/docker.conf <<'EOF'
[Service]
SupplementaryGroups=docker
EOF

Daarna:

systemctl daemon-reload
systemctl enable --now bluegit
systemctl status bluegit

Controleer dat de site de bestaande repositories toont en dat een clone van een repo op /srv/bluegit slaagt. Laat /home/timfa/bluegit en /home/timfa/temp-bluegit staan tot dat klopt. De user-unit blijft uit.

Linger stond aan zodat die user-unit bleef draaien na het uitloggen. De system-service heeft dat niet nodig. Zet linger uit zodra er geen andere user-service van timfa meer moet blijven draaien:

loginctl disable-linger timfa