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 #
- https://github.com/go-gitea/gitea/issues/12614
- https://docs.docker.com/config/containers/container-networking/
- https://github.com/moby/moby/issues/41003
- https://github.com/docker/compose/issues/2847#issuecomment-448230151
- https://stackoverflow.com/a/47289898/1972509
- https://docs.gitea.io/en-us/backup-and-restore/
- https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfile_module.html