8 Commits
Author SHA1 Message Date
david-spacil 96f2fc1028 Merge pull request 'Publikovat image do registru balíčků Gitey' (#15) from enhancement/docker-compose into main
testy / pytest (3.11) (push) Successful in 1s
testy / pytest (3.12) (push) Successful in 0s
testy / pytest (3.13) (push) Successful in 0s
testy / pytest (3.14) (push) Successful in 1s
binárka / linux (push) Successful in 11s
Reviewed-on: #15
2026-08-23 20:46:46 +02:00
gitea-actions 826f243af7 Sjednotit jména i v dockerové cestě
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 16s
testy / pytest (3.11) (pull_request) Successful in 0s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
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.
2026-08-23 20:45:36 +02:00
gitea-actions b1b7d1fad1 Nezavádět další "kostky" tam, kde na to není důvod
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 13s
testy / pytest (3.11) (pull_request) Successful in 0s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
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.
2026-08-23 20:41:03 +02:00
gitea-actions b6066e2be8 Image vydávat z GitHubu, doma ho jen zkoušet
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 26s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
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.
2026-08-23 20:31:24 +02:00
gitea-actions 9283a87a1e Ověřit emulaci dřív, než se do stavby pustíme
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Failing after 2s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
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á.
2026-08-23 20:14:17 +02:00
gitea-actions 0bb2e0efab Publikovat image do registru balíčků Gitey
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Failing after 9s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
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í.
2026-08-23 20:09:20 +02:00
david-spacil 4faddc8b22 Merge pull request 'Příkaz update a konzole bez hesla' (#14) from agents/claude/update-v-kontejneru into main
testy / pytest (3.11) (push) Successful in 0s
testy / pytest (3.12) (push) Successful in 0s
testy / pytest (3.13) (push) Successful in 1s
testy / pytest (3.14) (push) Successful in 1s
Reviewed-on: #14
2026-08-22 23:51:56 +02:00
gitea-actions 01d85594b2 Příkaz update a konzole bez hesla
binárka / linux (pull_request) Successful in 10s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
Dvě věci, které se u community-scripts čekají a chyběly.

V kontejneru je nově /usr/bin/update, takže aktualizace je jedno slovo. Sám
si přitom obnoví i instalátor z main, aby nejel napořád na té verzi skriptu,
se kterou se instalovalo. Cesta z uzlu (MODE=update) zůstává.

A konzole: kontejner schválně nemá root heslo, jenže pak se do konzole ve
webu Proxmoxu nedalo dostat — uživatel žádné přihlašovací údaje nezná a ani
nemá odkud. Autologin přes container-getty@1 to řeší přesně tak, jak to
dělají community-scripts. Nová práva to nikomu nedává, kdo má web Proxmoxu,
má root na uzlu tak jako tak. Vypíná se AUTOLOGIN=0.
2026-08-22 23:19:49 +02:00
6 changed files with 281 additions and 26 deletions

No files matched your search

+85
View File
@@ -0,0 +1,85 @@
# Postaví kontejnerový image a zkusí ho spustit. Nikam ho neposílá.
#
# Dockerfile by se jinak rozbil až ve chvíli, kdy se tagne release — tohle ho
# ohlídá nad každým pull requestem.
#
# Publikuje se jinde: .github/workflows/image.yml. Zdejší runner běží v LXC,
# kde nejde zaregistrovat binfmt, takže arm64 by se tu postavit nedalo.
# Registrace je vlastnost jádra hostitele a to je produkční stroj, do kterého
# se kvůli počitadlu kostek vrtat nebude.
#
# Staví se nativní amd64 obyčejným `docker build`, žádný buildx ani emulace.
name: image
on:
pull_request:
workflow_dispatch:
env:
ZKOUSKA_PORT: "18000"
jobs:
image:
runs-on: homelab
steps:
- name: Zdrojáky
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git init -q .
git remote remove origin 2>/dev/null || true
git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git"
git config http.extraheader "Authorization: token ${TOKEN}"
git fetch -q --depth 1 origin "${GITHUB_REF}"
git config --unset http.extraheader
git checkout -qf FETCH_HEAD
git clean -qfd
- name: Předpoklady
run: |
command -v docker >/dev/null \
|| { echo "Docker na runneru není." >&2; exit 1; }
docker version --format '{{.Server.Version}}'
- name: Stavba
run: |
docker build -f deploy/Dockerfile \
--build-arg VERSION="zkouska-${GITHUB_SHA:0:7}" \
-t dice-counter:zkouska .
- name: Zkouška
run: |
trap 'docker rm -f dice-counter-zkouska >/dev/null 2>&1 || true' EXIT
# Port musí být stejný uvnitř i venku: appka poslouchá na DICE_PORT,
# takže mapovat ho na jiný by znamenalo mířit do prázdna.
# Adresa se vnucuje, ať zkouška nezávisí na síti runneru a dá se
# ověřit, co přesně tabule nabídne.
docker run -d --name dice-counter-zkouska --init \
-p "${ZKOUSKA_PORT}:${ZKOUSKA_PORT}" -e DICE_HOST=127.0.0.1 \
-e DICE_PORT="${ZKOUSKA_PORT}" dice-counter:zkouska
for _ in $(seq 30); do
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/" && break
sleep 1
done
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/" || {
echo "Kontejner se nerozeběhl." >&2
docker logs dice-counter-zkouska >&2
exit 1; }
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/static/style.css"
curl -sf "http://127.0.0.1:${ZKOUSKA_PORT}/board" | grep -q "127.0.0.1:${ZKOUSKA_PORT}"
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/export"
# Verze se musí do image opravdu dostat, ne se hlásit jako neznámá.
docker run --rm dice-counter:zkouska python web.py --version
! docker run --rm dice-counter:zkouska python web.py --version | grep -q "neznámá"
docker logs dice-counter-zkouska
echo "Image jede."
- name: Úklid
if: always()
run: docker rmi dice-counter:zkouska >/dev/null 2>&1 || true
+79
View File
@@ -0,0 +1,79 @@
# Publikuje kontejnerový image do registru balíčků Gitey, pro amd64 i arm64.
#
# Proč zrovna odsud: domácí runner běží v LXC, kde nejde zaregistrovat binfmt
# — je to vlastnost jádra hostitele a ten je produkční. Běhouni GitHubu jsou
# plnohodnotné virtuály, kde emulace funguje bez řečí.
#
# Doma se image přesto staví a zkouší nad každým pull requestem
# (.gitea/workflows/image.yml), jen se nikam neposílá. Stejná dělba jako
# u binárek: doma se hlídá, tady se vydává.
name: image
on:
push:
tags: ["v*"]
workflow_dispatch:
env:
REGISTRY: gitea.spacilovi.eu
IMAGE: david-spacil/dice-counter
PLATFORMS: linux/amd64,linux/arm64
jobs:
publikace:
runs-on: ubuntu-latest
steps:
# Přesná verze, ne plovoucí značka — viz binarky.yml.
- uses: actions/checkout@v7.0.1
- name: QEMU pro arm64
run: |
# Bez hotové akce z marketplace, ať není co udržovat. Běhoun je
# virtuál, takže privilegovaný kontejner smí zapisovat do binfmt
# a registrace platí pro celé jádro.
docker run --privileged --rm tonistiigi/binfmt --install arm64
- name: Builder
run: |
# Výchozí ovladač Dockeru multiplatformní stavbu neumí.
docker buildx create --name dice-counter --driver docker-container --use
docker buildx inspect --bootstrap
# Bez tohohle by stavba spadla až na konci a hláška by nic neřekla.
PLATFORMY=$(docker buildx inspect)
echo "$PLATFORMY" | grep -q "linux/arm64" || {
echo "Buildkit nevidí linux/arm64, emulace se nezaregistrovala." >&2
exit 1; }
- name: Publikace
env:
TOKEN: ${{ secrets.PACKAGE_TOKEN }}
# Uživatel v Gitee, ne na GitHubu. Shodou okolností je to totéž.
VLASTNIK: david-spacil
run: |
# Spouští se to i ručně, a to klidně nad větví. Bez tagu není z čeho
# udělat verzi a `:latest` by ukazoval na rozdělanou práci.
[ "$GITHUB_REF_TYPE" = tag ] || {
echo "Publikovat jde jen z tagu, tohle je ${GITHUB_REF_TYPE} ${GITHUB_REF_NAME}." >&2
exit 1; }
# Automatický token na balíčky nestačí ani u Gitey samotné, natož
# odsud — musí to být osobní token s oprávněním write:package.
[ -n "$TOKEN" ] || { echo "Chybí secret PACKAGE_TOKEN." >&2; exit 1; }
echo "$TOKEN" | docker login "$REGISTRY" -u "$VLASTNIK" --password-stdin
trap 'docker logout "$REGISTRY" >/dev/null 2>&1 || true' EXIT
# Značka bez počátečního "v": v repozitáři je v1.2.0, u image se
# čeká 1.2.0. Verze vypálená do image ale zůstává s "v", ať --version
# hlásí totéž co binárky.
VERZE="${GITHUB_REF_NAME#v}"
docker buildx build --platform "$PLATFORMS" --push \
-f deploy/Dockerfile \
--build-arg VERSION="${GITHUB_REF_NAME}" \
-t "$REGISTRY/$IMAGE:$VERZE" \
-t "$REGISTRY/$IMAGE:latest" .
echo "Publikováno: $REGISTRY/$IMAGE:$VERZE a :latest"
docker buildx imagetools inspect "$REGISTRY/$IMAGE:$VERZE"
+50 -9
View File
@@ -150,14 +150,32 @@ MEMORY=1024 STORAGE=local-zfs PORT=8080 bash -c "$(curl -fsSL ...)"
| `PORT` | `8000` | | `PORT` | `8000` |
| `UNPRIVILEGED`, `OSVERSION` | `1`, `13` | | `UNPRIVILEGED`, `OSVERSION` | `1`, `13` |
| `NESTING` | `1` — systemd v Debianu 13 ho potřebuje | | `NESTING` | `1` — systemd v Debianu 13 ho potřebuje |
| `AUTOLOGIN` | `1` — konzole ve webu Proxmoxu bez hesla |
| `VERSION` | poslední vydání | | `VERSION` | poslední vydání |
Aktualizace na novější vydání je ten samý příkaz s číslem kontejneru: Aktualizace na novější vydání se dá spustit dvěma způsoby. Buď zevnitř
kontejneru, kde na to stačí jedno slovo:
```bash
update
```
Nebo z uzlu Proxmoxu tím samým příkazem s číslem kontejneru:
```bash ```bash
CTID=123 MODE=update bash -c "$(curl -fsSL ...)" CTID=123 MODE=update bash -c "$(curl -fsSL ...)"
``` ```
Obojí vymění binárku za poslední vydání a službu restartuje; databáze zůstává.
Příkaz `update` si přitom obnoví i sám sebe — instalátor bere z větve `main`,
takže jede na nejnovější verzi skriptu, ne na té, se kterou se instalovalo.
Do konzole kontejneru se dostaneš přímo z webu Proxmoxu, **žádné jméno ani
heslo se nezadává** — kontejner root heslo nemá a konzole se přihlašuje sama.
Nová práva to nikomu nedává: kdo se dostane do webu Proxmoxu, má root na uzlu
tak jako tak. Komu se to nezdá, vypne to přes `AUTOLOGIN=0` a do kontejneru
pak leze přes `pct enter <ctid>`.
Podoba je odkoukaná od [community-scripts.org](https://community-scripts.org), Podoba je odkoukaná od [community-scripts.org](https://community-scripts.org),
ale nic z jejich frameworku se nestahuje — jejich `build.func` si instalační ale nic z jejich frameworku se nestahuje — jejich `build.func` si instalační
skript hledá natvrdo ve vlastním repozitáři, takže mimo něj nefunguje. skript hledá natvrdo ve vlastním repozitáři, takže mimo něj nefunguje.
@@ -174,13 +192,28 @@ Je idempotentní; druhé spuštění jen vymění binárku za nejnovější.
### Docker ### Docker
Stačí jeden soubor, repozitář k tomu potřeba není:
```bash ```bash
cd deploy && docker compose up -d curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
docker compose up -d
``` ```
Staví se ze zdrojáků, takže image jde sestavit pro amd64 i arm64 a nezávisí Image se stáhne hotový z registru Gitey, pro amd64 i arm64 — Docker si vybere
na tom, jestli release pro danou architekturu proběhl. Databáze leží svoji variantu sám. Databáze leží v pojmenovaném svazku, appka běží pod
v pojmenovaném svazku, appka běží pod nerootovým uživatelem. nerootovým uživatelem.
Aktualizace na novější vydání:
```bash
docker compose pull && docker compose up -d
```
Kdo si ho radši postaví ze zdrojáků, přebije ten stažený stejnou značkou:
```bash
docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
```
**Pozor na síť.** Compose schválně používá `network_mode: host`. V bridge **Pozor na síť.** Compose schválně používá `network_mode: host`. V bridge
režimu kontejner uvnitř vidí adresu jako `172.17.0.2`, tabule ji poctivě režimu kontejner uvnitř vidí adresu jako `172.17.0.2`, tabule ji poctivě
@@ -189,9 +222,9 @@ Kdo bridge potřebuje, musí nastavit `DICE_HOST` na adresu hostitele v LAN.
| | LXC | Docker | | | LXC | Docker |
|---|---|---| |---|---|---|
| Odkud | vydaná binárka z releasu | zdrojáky | | Odkud | vydaná binárka z releasu | image z registru |
| Databáze | `/var/lib/kostky/dice.db` | svazek `kostky-data` | | Databáze | `/var/lib/kostky/dice.db` | svazek `kostky-data` |
| Aktualizace | `pve-kostky.sh update <ctid>` | `docker compose build --pull` | | Aktualizace | `update` uvnitř kontejneru | `docker compose pull` |
| Adresa a QR | funguje samo | potřeba síť hostitele | | Adresa a QR | funguje samo | potřeba síť hostitele |
## Když se telefon nepřipojí ## Když se telefon nepřipojí
@@ -230,7 +263,7 @@ při remíze na prvním místě se hraje dál.
| `console.py` | aby čeština prošla i windowsovou konzolí | | `console.py` | aby čeština prošla i windowsovou konzolí |
| `version.py` | která verze to je — z gitu, nebo z binárky | | `version.py` | která verze to je — z gitu, nebo z binárky |
| `build.sh`, `kostky.spec` | stavba binárky | | `build.sh`, `kostky.spec` | stavba binárky |
| `.gitea/workflows/` | testy a linuxová binárka doma | | `.gitea/workflows/` | testy, linuxová binárka a zkouška image doma |
| `.github/workflows/` | binárky pro Windows a macOS | | `.github/workflows/` | binárky pro Windows a macOS |
| `deploy/` | nasazení na server: Proxmox LXC a Docker | | `deploy/` | nasazení na server: Proxmox LXC a Docker |
@@ -313,6 +346,7 @@ Otagovaný commit spustí stavbu na obou stranách:
|---|---|---| |---|---|---|
| vlastní runner u Gitey | Linux x86-64 | `.gitea/workflows/binarka.yml` | | vlastní runner u Gitey | Linux x86-64 | `.gitea/workflows/binarka.yml` |
| GitHub Actions | Windows, macOS ×2, Linux ARM64 | `.github/workflows/binarky.yml` | | GitHub Actions | Windows, macOS ×2, Linux ARM64 | `.github/workflows/binarky.yml` |
| GitHub Actions | image amd64 + arm64 | `.github/workflows/image.yml` |
```bash ```bash
git tag v1.0.0 && git push origin v1.0.0 git tag v1.0.0 && git push origin v1.0.0
@@ -335,7 +369,14 @@ ověřit:
sha256sum -c kostky-linux-x86_64.sha256 # na macOS: shasum -a 256 -c sha256sum -c kostky-linux-x86_64.sha256 # na macOS: shasum -a 256 -c
``` ```
Nad pull requesty se Linux staví taky, jen se nikam nevěší. Nad pull requesty se Linux staví taky, jen se nikam nevěší. Totéž platí pro
kontejnerový image — doma se nad každým PR postaví a zkusí nastartovat
(`.gitea/workflows/image.yml`), publikuje se ale až z tagu na GitHubu.
Image se schválně nevydává doma: tamní runner běží v LXC, kde nejde
zaregistrovat emulaci pro arm64 — je to vlastnost jádra hostitele a ten je
produkční stroj. Běhouni GitHubu jsou plnohodnotné virtuály, kde to funguje
bez zásahu do čehokoli.
## Testy ## Testy
+5 -5
View File
@@ -5,7 +5,7 @@
# proběhl. Závislosti jsou zamčené v requirements.txt, takže je sestavení # proběhl. Závislosti jsou zamčené v requirements.txt, takže je sestavení
# opakovatelné. # opakovatelné.
# #
# docker build -f deploy/Dockerfile -t kostky . # docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
# #
# Sestavuje se z kořene repozitáře, ne z deploy/. # Sestavuje se z kořene repozitáře, ne z deploy/.
FROM python:3.11-slim FROM python:3.11-slim
@@ -13,7 +13,7 @@ FROM python:3.11-slim
# Verze se jinak nemá kde vzít — v image není git ani zabalená binárka. # Verze se jinak nemá kde vzít — v image není git ani zabalená binárka.
ARG VERSION=neznámá ARG VERSION=neznámá
RUN useradd --system --uid 1000 --home-dir /app --shell /usr/sbin/nologin kostky RUN useradd --system --uid 1000 --home-dir /app --shell /usr/sbin/nologin dice-counter
WORKDIR /app WORKDIR /app
@@ -29,15 +29,15 @@ RUN echo "$VERSION" > verze.txt
# Adresář pro databázi musí vzniknout už tady a patřit správnému uživateli — # Adresář pro databázi musí vzniknout už tady a patřit správnému uživateli —
# svazek, který Docker založí sám, by jinak patřil rootovi a appka běžící pod # svazek, který Docker založí sám, by jinak patřil rootovi a appka běžící pod
# kostky by do něj nezapsala. # dice-counter by do něj nezapsala.
RUN install -d -o kostky -g kostky /data RUN install -d -o dice-counter -g dice-counter /data
VOLUME ["/data"] VOLUME ["/data"]
ENV DICE_DB=/data/dice.db \ ENV DICE_DB=/data/dice.db \
DICE_PORT=8000 DICE_PORT=8000
EXPOSE 8000 EXPOSE 8000
USER kostky USER dice-counter
# Bez curlu, ten ve slim image není. Stačí, že stránka odpoví — sahá i do # Bez curlu, ten ve slim image není. Stačí, že stránka odpoví — sahá i do
# databáze, takže se tím kontroluje i ta. # databáze, takže se tím kontroluje i ta.
@@ -1,19 +1,20 @@
# Počitadlo kostek v Dockeru. # Počitadlo kostek v Dockeru.
# #
# cd deploy && docker compose up -d # curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
# docker compose up -d
#
# Nic dalšího není potřeba — image se stáhne hotový, pro amd64 i arm64.
# Kdo si ho chce postavit ze zdrojáků, přebije ten stažený stejnou značkou:
#
# docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
# #
# Počítá se s domácí sítí. Appka nemá přihlašování, tohle ji nijak # Počítá se s domácí sítí. Appka nemá přihlašování, tohle ji nijak
# nezabezpečuje a do internetu nepatří. # nezabezpečuje a do internetu nepatří.
services: services:
kostky: dice-counter:
build: image: gitea.spacilovi.eu/david-spacil/dice-counter:latest
context: .. container_name: dice-counter
dockerfile: deploy/Dockerfile
args:
VERSION: ${VERSION:-vlastní sestavení}
image: kostky:latest
container_name: kostky
restart: unless-stopped restart: unless-stopped
# Python jako PID 1 nesklízí osiřelé procesy a hůř reaguje na signály. # Python jako PID 1 nesklízí osiřelé procesy a hůř reaguje na signály.
@@ -38,8 +39,8 @@ services:
DICE_DB: /data/dice.db DICE_DB: /data/dice.db
volumes: volumes:
- kostky-data:/data - dice-counter-data:/data
volumes: volumes:
# Zálohu si stáhneš rovnou z appky přes /export, takže se sem nemusí lézt. # Zálohu si stáhneš rovnou z appky přes /export, takže se sem nemusí lézt.
kostky-data: dice-counter-data:
+50 -1
View File
@@ -37,6 +37,7 @@ PORT="${PORT:-8000}"
UNPRIVILEGED="${UNPRIVILEGED:-1}" UNPRIVILEGED="${UNPRIVILEGED:-1}"
OSVERSION="${OSVERSION:-13}" OSVERSION="${OSVERSION:-13}"
NESTING="${NESTING:-1}" NESTING="${NESTING:-1}"
AUTOLOGIN="${AUTOLOGIN:-1}" # konzole ve webu Proxmoxu bez hesla
VERSION="${VERSION:-}" # prázdné = poslední vydání VERSION="${VERSION:-}" # prázdné = poslední vydání
# --- výpisy ------------------------------------------------------------------ # --- výpisy ------------------------------------------------------------------
@@ -173,6 +174,53 @@ systemctl daemon-reload
systemctl enable --quiet --now kostky systemctl enable --quiet --now kostky
ok "Služba běží" ok "Služba běží"
# --- konzole v rozhraní Proxmoxu --------------------------------------------
if [ "${AUTOLOGIN:-1}" = "1" ]; then
msg "Nastavuji konzoli"
# Kontejner nemá root heslo, takže by se do konzole ve webu Proxmoxu
# nedalo dostat. Autologin to řeší stejně, jako to dělají community-scripts.
# Nová práva to nikomu nedává — kdo má web Proxmoxu, má root na uzlu tak
# jako tak.
mkdir -p /etc/systemd/system/container-getty@1.service.d
cat > /etc/systemd/system/container-getty@1.service.d/override.conf <<'GETTY'
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 $TERM
GETTY
systemctl daemon-reload
systemctl restart container-getty@1.service 2>/dev/null || true
ok "Konzole se přihlásí sama"
fi
# --- příkaz update ----------------------------------------------------------
# Instalátor si necháme, ať je z čeho aktualizovat. Když se skript pouští
# rourou, soubor neexistuje a zůstane ten z minula.
if [ -f "$0" ]; then
install -m 755 "$0" "$HOME_DIR/install.sh"
fi
cat > /usr/bin/update <<UPDATE
#!/usr/bin/env bash
# Aktualizace počitadla na poslední vydání. Stačí napsat: update
set -euo pipefail
# Nejdřív zkusíme obnovit i samotný instalátor, kdyby se mezitím zlepšil.
# Bez sítě nebo při změněné adrese se použije ten uložený.
NOVY=\$(mktemp)
if curl -fsSL "$GITEA/$REPO/raw/branch/main/deploy/pve-kostky.sh" -o "\$NOVY" 2>/dev/null \\
&& bash "\$NOVY" instalator > "\$NOVY.in" 2>/dev/null \\
&& bash -n "\$NOVY.in" 2>/dev/null; then
install -m 755 "\$NOVY.in" "$HOME_DIR/install.sh"
fi
rm -f "\$NOVY" "\$NOVY.in"
exec env PORT="$PORT" GITEA="$GITEA" REPO="$REPO" bash "$HOME_DIR/install.sh"
UPDATE
chmod 755 /usr/bin/update
ok "Aktualizovat půjde příkazem: update"
msg "Čekám, až začne odpovídat" msg "Čekám, až začne odpovídat"
for _ in $(seq 30); do for _ in $(seq 30); do
curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null && break curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null && break
@@ -199,7 +247,7 @@ install_into() {
rm -f "$tmp" rm -f "$tmp"
pct exec "$ctid" -- env PORT="$PORT" GITEA="$GITEA" REPO="$REPO" \ pct exec "$ctid" -- env PORT="$PORT" GITEA="$GITEA" REPO="$REPO" \
VERSION="$VERSION" bash /root/kostky-install.sh VERSION="$VERSION" AUTOLOGIN="$AUTOLOGIN" bash /root/kostky-install.sh
} }
address_of() { address_of() {
@@ -218,6 +266,7 @@ hotovo() {
echo -e " Zadávání z telefonu: \e[1;32mhttp://${ip}:${PORT}/\e[0m" echo -e " Zadávání z telefonu: \e[1;32mhttp://${ip}:${PORT}/\e[0m"
echo echo
echo -e " \e[2mDatabáze: /var/lib/kostky/dice.db (uvnitř kontejneru)" echo -e " \e[2mDatabáze: /var/lib/kostky/dice.db (uvnitř kontejneru)"
echo -e " Aktualizace: v konzoli kontejneru napiš update"
echo -e " Log: pct exec $ctid -- journalctl -u kostky -f" echo -e " Log: pct exec $ctid -- journalctl -u kostky -f"
echo -e " Konzole: pct enter $ctid" echo -e " Konzole: pct enter $ctid"
echo -e " Zrušit: pct stop $ctid && pct destroy $ctid\e[0m" echo -e " Zrušit: pct stop $ctid && pct destroy $ctid\e[0m"