Z nejakého dôvodu oficiálna dokumentácia pre obnovenie Gitea z dumpu mi nefungovala. Príkaz pre pôvodný rootful Docker obraz by mohol vyzerať zhruba takto:

/app/gitea/gitea dump --file gitea-dump.zip -c /data/gitea/conf/app.ini --skip-lfs-data --skip-repository

Obnovenie do postgres podľa oficiálnej dokumentácie zlyhalo:

psql -U $USER -d $DATABASE < gitea-db.sql

Problémom bolo mnoho chýbajúcich repozitárov, chýbajúce organizácie a mnohé chyby 500 na stránkach issues, pull requestov a repozitárov.

Toto obnovenie zlyhalo aj pre SQLite, podľa vyššie uvedenej oficiálnej dokumentácie. Toto som urobil len ako potvrdenie:

sqlite3 $DATABASE_PATH < gitea-db.sql

Tu bolo zlyhanie dokonca o niečo horšie, pretože GPG kľúč sa nezobrazoval v rozhraní, hoci commity sa zdali byť podpísané platným podpisom. Pridanie toho istého GPG kľúča nebolo možné, tvrdiac, že kľúč už existuje, ale nikde sa nezobrazoval.

Našiel som jeden jediný komentár na internete o tom, ako to urobiť správne. Vytvorenie dumpu:

docker exec -i gitea-db-1 /bin/bash -c "export PGPASSWORD=gitea && /usr/bin/pg_dump -U gitea gitea"  > dump_DB.sql

A obnovenie:

cat dump_DB.sql | docker exec -i gitea-db-1 psql -Ugitea

Rsync alebo skopírujte ručne všetky priečinky obsahujúce repozitáre a ostatné súbory a reštartujte kontajner. Toto fungovalo!

Problém s rozlíšením DNS #

Toto bolo súčasťou migrácie z rootful Gitea na rootless Gitea server. Rootless obraz používa alpine, čo je pravdepodobne vinník tejto chyby pre Mirrors v administračnom menu System Notices:

Migrate repository from https://github.com/peterbabic/repository-XXX failed: Clone: exit status 128 - fatal: unable to access 'https://github.com/peterbabic/repository-XXX.git/': Could not resolve host: github.com

Môže sa tiež zobraziť ako:

Failed to update mirror repository '/var/lib/gitea/git/repositories/peter.babic/repository-XXX.git': fatal: unable to access 'https://github.com/peterbabic/repository-XXX.git/': Could not resolve host: github.com
error: Could not fetch origin

Vyššie uvedená správa sa líši v závislosti od zdroja synchronizácie — či ide o cron job alebo manuálne stlačenie tlačidla Synchronize v nastaveniach repozitára. Manuálne zrkadlenie akéhokoľvek nového repozitára tiež zlyhá.

Vstúpenie do kontajnera a pokus o ping potvrdzuje problém:

$ ping github.com
ping: bad address 'github.com'

Avšak pingovaním niektorých iných domén bolo možné:

$ ping google.sk
PING google.sk (142.251.39.99): 56 data bytes
ping: permission denied (are you root?)

A pingovanie akejkoľvek dosiahnuteľnej IP adresy z internetu fungovalo, čo podopiera problémy s DNS. Problém možno ďalej potvrdiť obsahom súboru resolv.conf vo vnútri toho kontajnera:

$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

Obsah súboru je na hostiteľskom zariadení zjavne iný, obsahujúc aspoň jednu inú skutočnú adresu DNS servera okrem internej Dockerovej 127.0.0.1.

Konfigurácia Docker JSON #

Problém s DNS sa mi podarilo vyriešiť úpravou ~/.config/docker/daemon.json a vložením nasledovného:

{
  "dns": ["8.8.8.8"],
  "dns-opts": ["ndots:1"]
}

A potom reštartovaním rootless Docker:

systemctl --user restart docker.service

Prístup do kontajnera teraz umožňuje pingovat github.com. Synchronizácia zrkadiel v Gitea teraz funguje. Súbor resolv.conf teraz vyzerá trochu inak, očakával som, že tam nájdem tiež IP adresu 8.8.8.8:

$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:1

Nič sa nedeje, toto nastavenie sa pravdepodobne prejaví v nejakom inom výstupe. Bol som schopný pridať túto konfiguráciu ako ansible task:

- name: Edit container 'resolv.conf' options
  ansble.builtin.blockinfile:
    path: ~/.config/docker/daemon.json
    validate: "python -mjson.tool %s > /dev/null"
    marker: "{mark}"
    marker_begin: "{"
    marker_end: "}"
    create: true
    block: |
      "dns": ["8.8.8.8"],
      "dns-opts": ["ndots:1"]

Zistil som, že vyššie uvedené funguje, ale nemusí byť odolné voči zlyhaniu. Všimnite si časť s validáciou — mala by fungovať na väčšine systémov bez potreby inštalácie ďalších balíčkov. Ak súbor existuje a pred spustením tohto tasku obsahuje platný JSON, dokonca pridá obsah do JSON štruktúry, ale v tomto prípade validácia zlyhá, pretože by chýbala čiarka , pred časťou "dns". Tento problém by sa dal vyriešiť iným taskom, takže to tu nechávam, prípadne niekoho zaujme.

Task definitívne funguje, ak súbor neexistuje alebo obsahuje len závorky na oddelených riadkoch, čo sa tiež môže stať. Task funguje aj vtedy, ak je cieľový súbor daemon.json prázdny, hoci v takom prípade takáto konfigurácia spôsobí, že Docker sa nespustí, pretože prázdny súbor nie je platný JSON. Chyba je nasledovná:

$ journalctl --user -xeu docker
dockerd-rootless.sh[5125]: unable to configure the Docker daemon with file /home/user/.config/docker/daemon.json: EOF

Ale súbor daemon.json by mohol byť prázdny počas spustenia vášho playbookov, dokonca pred spustením Docker služby, takže si myslím, že task je stále užitočný. Poznamenajme, že task tiež zlyhá, keď obsah súboru je len {}, bez nového riadku medzi nimi. Toto je pre Docker platné na spustenie a môže to byť bežné. Príjemnú prácu!

Odkazy #