Compose soubor měl v sobě build: context: .., takže si image stavěl z lokálních zdrojáků — bez naklonovaného repozitáře byl k ničemu. Proti LXC cestě, kde se stahuje hotová binárka a nic se nekompiluje, to byla nesrovnalost.
Teď stačí jeden soubor:
curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
docker compose up -d
Co je uvnitř
Nové .gitea/workflows/image.yml — staví na domácím runneru (homelab), drží se zvyklostí ostatních workflow: žádné akce z marketplace, ruční checkout přes git init, všechno obyčejný shell.
nad PR: postaví amd64, spustí a ověří /, /static, /board, /export a --version; nikam nic neposílá
na tagu: multiarch linux/amd64,linux/arm64 s --push, značky 1.2.0 a latest
Automatický token Actions na balíčky nestačí, Gitea sama v dokumentaci odkazuje na osobní token:
The GITEA_TOKEN … should be able to publish to the associated package repository (i.e. to upload OCI images)… This is not implemented in Gitea Actions now. A workaround for Gitea Actions is to use a Personal Access Token (PAT).
Secret PACKAGE_TOKEN už je vložený. Jméno nesmí začínat na GITEA_, ten prefix si Gitea vyhrazuje.
Jméno image
dice-counter podle repozitáře, ne kostky. Zbytek projektu pořád mluví o kostkách — binárky, systemd služba, cesty, svazek. Sjednocení je na samostatném issue, protože se dotkne vydaných binárek i běžících instalací.
Ověřeno
Všechny příkazy z workflow jsem pustil lokálně proti skutečnému deploy/Dockerfile:
stavba amd64 s --load, kontejner naběhl, všechny čtyři kontroly prošly (/, /static/style.css, /board obsahuje očekávanou adresu, /export)
--version hlásí vypálenou verzi, ne neznámá
multiarch stavba ověřena skrz manifest: výstup do OCI archivu obsahuje linux/amd64 i linux/arm64
Cestou se ukázala chyba, kterou by CI jinak našlo až za běhu: měl jsem -p 18000:8000 a zároveň DICE_PORT=18000, takže appka uvnitř poslouchala na 18000, ale mapování mířilo na prázdný port 8000. Všechny kontroly tiše selhávaly. Opraveno na stejný port z obou stran.
Neověřeno: samotný docker login a --push do registru — na to je potřeba token, který mám jen v CI. To se pozná při prvním tagu.
Po prvním publikování je potřeba vyzkoušet anonymní stažení (docker logout a docker pull) — dokumentace Gitey nikde výslovně netvrdí, že jsou balíčky veřejných repozitářů čitelné bez přihlášení. Kdyby ne, řeší se to viditelností balíčku v jeho nastavení.
Compose soubor měl v sobě `build: context: ..`, takže si image stavěl z lokálních zdrojáků — bez naklonovaného repozitáře byl k ničemu. Proti LXC cestě, kde se stahuje hotová binárka a nic se nekompiluje, to byla nesrovnalost.
Teď stačí jeden soubor:
```bash
curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
docker compose up -d
```
## Co je uvnitř
**Nové `.gitea/workflows/image.yml`** — staví na domácím runneru (`homelab`), drží se zvyklostí ostatních workflow: žádné akce z marketplace, ruční checkout přes `git init`, všechno obyčejný shell.
- **nad PR**: postaví amd64, spustí a ověří `/`, `/static`, `/board`, `/export` a `--version`; nikam nic neposílá
- **na tagu**: multiarch `linux/amd64,linux/arm64` s `--push`, značky `1.2.0` a `latest`
**`deploy/compose.yaml` → `deploy/docker-compose.yaml`** (přes `git mv`), `build:` pryč, míří na `gitea.spacilovi.eu/david-spacil/dice-counter:latest`.
## Token
Automatický token Actions na balíčky nestačí, Gitea sama v dokumentaci odkazuje na osobní token:
> The `GITEA_TOKEN` … should be able to publish to the associated package repository (i.e. to upload OCI images)… **This is not implemented in Gitea Actions now.** A workaround for Gitea Actions is to use a Personal Access Token (PAT).
Secret `PACKAGE_TOKEN` už je vložený. Jméno nesmí začínat na `GITEA_`, ten prefix si Gitea vyhrazuje.
## Jméno image
`dice-counter` podle repozitáře, ne `kostky`. Zbytek projektu pořád mluví o kostkách — binárky, systemd služba, cesty, svazek. Sjednocení je na samostatném issue, protože se dotkne vydaných binárek i běžících instalací.
---
## Ověřeno
Všechny příkazy z workflow jsem pustil lokálně proti skutečnému `deploy/Dockerfile`:
- `docker buildx create --driver docker-container` → builder umí `linux/amd64, linux/arm64`
- stavba amd64 s `--load`, kontejner naběhl, **všechny čtyři kontroly prošly** (`/`, `/static/style.css`, `/board` obsahuje očekávanou adresu, `/export`)
- `--version` hlásí vypálenou verzi, ne `neznámá`
- **multiarch stavba ověřena skrz manifest**: výstup do OCI archivu obsahuje `linux/amd64` i `linux/arm64`
Cestou se ukázala chyba, kterou by CI jinak našlo až za běhu: měl jsem `-p 18000:8000` a zároveň `DICE_PORT=18000`, takže appka uvnitř poslouchala na 18000, ale mapování mířilo na prázdný port 8000. Všechny kontroly tiše selhávaly. Opraveno na stejný port z obou stran.
**Neověřeno:** samotný `docker login` a `--push` do registru — na to je potřeba token, který mám jen v CI. To se pozná při prvním tagu.
Po prvním publikování je potřeba vyzkoušet **anonymní stažení** (`docker logout` a `docker pull`) — dokumentace Gitey nikde výslovně netvrdí, že jsou balíčky veřejných repozitářů čitelné bez přihlášení. Kdyby ne, řeší se to viditelností balíčku v jeho nastavení.
Compose soubor měl v sobě build: context: .., takže si image stavěl z
lokálních zdrojáků a bez naklonovaného repozitáře byl k ničemu. Proti LXC
cestě, kde se stahuje hotová binárka, to byla nesrovnalost.
Nové workflow staví image na domácím runneru a při vydání ho pošle do
registru Gitey, pro amd64 i arm64. Compose se tím smrskl na jeden soubor,
který si člověk stáhne a rovnou spustí.
Automatický token Actions na balíčky nestačí — Gitea to zatím neumí a sama
v dokumentaci odkazuje na osobní token. Je v secrets pod PACKAGE_TOKEN;
jméno nesmí začínat na GITEA_, ten prefix si Gitea vyhrazuje.
Nad pull requesty se image staví a zkouší, ale nepublikuje. Dockerfile do
teď v CI žádné pokrytí neměl a rozbil by se až při releasu.
Image se jmenuje podle repozitáře, dice-counter. Zbytek projektu pořád mluví
o kostkách; sjednocení je na samostatné issue, protože se dotkne vydaných
binárek i běžících instalací.
První běh na runneru odhalil dvě věci.
Rouru do `head` shodil pipefail: head zavřel rouru po dvaceti řádcích, docker
dostal EPIPE a krok skončil na 255, přestože se builder založil v pořádku.
Horší je, že binfmt se sice nainstaloval (installing: arm64 OK), ale buildkit
pak arm64 mezi platformami nenabídl. Emulace musí být registrovaná s příznakem
F, aby si na ni buildkit ve svém kontejneru sáhl bez interpretu v souborovém
systému; jinak vidí jen nativní platformy. Doma to tak mám z qemu-user-static
a proto tam multiarch stavba prošla.
Builder se teď staví načisto — ten z minulého běhu by si pamatoval platformy
z doby před registrací — a hned po něm se ověří, že arm64 v seznamu opravdu
je. Bez toho by stavba spadla až na konci s hláškou, ze které se nic nepozná.
Domácí runner běží v LXC. binfmt_misc je vlastnost jádra hostitele a do toho
se kvůli počitadlu kostek vrtat nebude — je produkční. tonistiigi/binfmt sice
hlásil úspěch, ale na hostiteli po něm nezůstala žádná registrace, takže
buildkit arm64 mezi platformami nikdy neuvidí.
Stejná dělba jako u binárek: doma se hlídá, na GitHubu se vydává. Zdejší
workflow staví nativní amd64 obyčejným `docker build` a zkouší ho spustit nad
každým pull requestem; žádný buildx, žádná emulace, nic, co by na runneru
mohlo chybět. Publikaci multiarch image převzalo .github/workflows/image.yml,
kde jsou běhouni plnohodnotné virtuály a emulace funguje bez zásahu.
Publikovat jde nově jen z tagu. Ruční spuštění nad větví by udělalo `:latest`
ukazující na rozdělanou práci.
Značka image ve zkoušce, testovací kontejner a builder buildx se jmenovaly
kostky. Všechno to vzniká a mizí uvnitř jednoho běhu CI, nikam se to
nepropisuje a nic to nestojí — jen jsem to zkopíroval ze zvyku.
Jména v docker-compose.yaml (služba, container_name, svazek kostky-data)
zůstávají; ta se dotýkají uložených dat a patří k tomu úklidu ve #16.
Služba, container_name, svazek a uživatel uvnitř image se jmenovaly kostky.
Teď je nejlevnější chvíle to srovnat: compose se dá použít teprve od tohohle
PR, takže svazek kostky-data zatím nikde neexistuje a není co migrovat. Po
vydání by to už chtělo přesun dat.
Uživateli zůstává uid 1000, takže vlastnictví souborů v /data nezávisí na
jménu a bind mounty se nerozbijí.
LXC strana (kostky.service, /opt/kostky, /var/lib/kostky) zůstává na #16 —
tam přejmenování znamená migraci běžícím instalacím.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Compose soubor měl v sobě
build: context: .., takže si image stavěl z lokálních zdrojáků — bez naklonovaného repozitáře byl k ničemu. Proti LXC cestě, kde se stahuje hotová binárka a nic se nekompiluje, to byla nesrovnalost.Teď stačí jeden soubor:
Co je uvnitř
Nové
.gitea/workflows/image.yml— staví na domácím runneru (homelab), drží se zvyklostí ostatních workflow: žádné akce z marketplace, ruční checkout přesgit init, všechno obyčejný shell./,/static,/board,/exporta--version; nikam nic neposílálinux/amd64,linux/arm64s--push, značky1.2.0alatestdeploy/compose.yaml→deploy/docker-compose.yaml(přesgit mv),build:pryč, míří nagitea.spacilovi.eu/david-spacil/dice-counter:latest.Token
Automatický token Actions na balíčky nestačí, Gitea sama v dokumentaci odkazuje na osobní token:
Secret
PACKAGE_TOKENuž je vložený. Jméno nesmí začínat naGITEA_, ten prefix si Gitea vyhrazuje.Jméno image
dice-counterpodle repozitáře, nekostky. Zbytek projektu pořád mluví o kostkách — binárky, systemd služba, cesty, svazek. Sjednocení je na samostatném issue, protože se dotkne vydaných binárek i běžících instalací.Ověřeno
Všechny příkazy z workflow jsem pustil lokálně proti skutečnému
deploy/Dockerfile:docker buildx create --driver docker-container→ builder umílinux/amd64, linux/arm64--load, kontejner naběhl, všechny čtyři kontroly prošly (/,/static/style.css,/boardobsahuje očekávanou adresu,/export)--versionhlásí vypálenou verzi, neneznámálinux/amd64ilinux/arm64Cestou se ukázala chyba, kterou by CI jinak našlo až za běhu: měl jsem
-p 18000:8000a zároveňDICE_PORT=18000, takže appka uvnitř poslouchala na 18000, ale mapování mířilo na prázdný port 8000. Všechny kontroly tiše selhávaly. Opraveno na stejný port z obou stran.Neověřeno: samotný
docker logina--pushdo registru — na to je potřeba token, který mám jen v CI. To se pozná při prvním tagu.Po prvním publikování je potřeba vyzkoušet anonymní stažení (
docker logoutadocker pull) — dokumentace Gitey nikde výslovně netvrdí, že jsou balíčky veřejných repozitářů čitelné bez přihlášení. Kdyby ne, řeší se to viditelností balíčku v jeho nastavení.