9 Commits
Author SHA1 Message Date
david-spacil c0272f4f70 Merge pull request 'Zaříznout stará jména kostky' (#20) from agents/claude/zariznout-stara-jmena into main
testy / pytest (3.11) (push) Successful in 1s
testy / pytest (3.12) (push) Successful in 1s
testy / pytest (3.13) (push) Successful in 1s
testy / pytest (3.14) (push) Successful in 1s
binárka / linux (push) Successful in 10s
Reviewed-on: #20
2026-08-23 23:14:58 +02:00
gitea-actions a6c94e239b Zaříznout stará jména kostky
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 18s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
Druhý krok po #16, rovnou celý. Dvojkolejnost dávala smysl pro projekt
s neznámými uživateli; tady běží jedna instance a ta je přemigrovaná.

Pryč je:

  - deploy/pve-kostky.sh (přesměrování na nový skript)
  - stěhování ze starého jména v instalátoru včetně bloku STARY_*
  - záložní jméno přílohy kostky-* v instalátoru
  - věšení příloh pod dvěma jmény v obou workflow
  - záloha na ~/.local/share/kostky/dice.db ve storage.py
  - odstavce o přechodu v README

Jediné, co ve zdrojácích zůstalo, je docstring "Pravidla hry v kostky"
v core.py — to je česky pojmenovaná hra, ne identifikátor.

POZOR na pořadí: instalátor teď hledá jen dice-counter-*, a poslední
vydání (v1.2.1) má na releasu pouze kostky-*. Do otagování v1.2.2 tedy
`update` ani čerstvá instalace nemají co stáhnout. Merge a tag patří
k sobě.

Ověřeno v debianím kontejneru: čistá instalace, druhé spuštění za sebou,
a vydání bez nových jmen spadne se srozumitelnou hláškou místo toho, aby
sáhlo po starém. Binárka postavená lokálně zakládá databázi v
…/dice-counter/ a starou vedle sebe ignoruje. 118 testů.

Closes #19
2026-08-23 23:09:15 +02:00
david-spacil 8e6e4a8fe9 Merge pull request 'Sjednotit pojmenování: kostky → dice-counter' (#18) from agents/claude/prejmenovani 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
Reviewed-on: #18
2026-08-23 22:49:47 +02:00
david-spacil 4e526e8841 Merge branch 'main' into agents/claude/prejmenovani
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 7s
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
2026-08-23 22:44:44 +02:00
david-spacil 01dc7a0504 Merge pull request 'Připnout image k repozitáři přes OCI label' (#17) from agents/claude/oci-labely 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: #17
2026-08-23 22:44:30 +02:00
gitea-actions 182d0a3fdc Upřesnit komentář: nezmizí tři řádky, ale celý blok
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 7s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
2026-08-23 22:33:40 +02:00
gitea-actions 6443a93955 Nenechat zkoušku binárky viset na zbytku z minulého běhu
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 14s
testy / pytest (3.11) (pull_request) Successful in 2s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
Krok padl na `test -f /tmp/zkouska/dice-counter/dice.db`. Runner si /tmp
mezi běhy drží, takže tam po dřívějších stavbách zůstalo
/tmp/zkouska/kostky/dice.db — a binárka po něm nově sáhne, dokud nová
databáze neexistuje. Zkouška tedy hledala soubor, který se schválně
nezaložil.

Chová se to správně, jen se to nedá zkoušet na adresáři, do kterého si
sype každý běh. Nově dostane každý svůj vlastní přes mktemp a po sobě ho
uklidí.

Reprodukováno lokálně: se zbytkem po staru krok padne, s vlastním
adresářem projde.
2026-08-23 22:32:39 +02:00
gitea-actions 7449c01b14 Sjednotit pojmenování: kostky → dice-counter
binárka / linux (pull_request) Failing after 10s
image / image (pull_request) Successful in 7s
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
Projekt se jmenuje dice-counter, ale skoro všude vystupoval jako kostky.
Tohle je první ze dvou kroků podle #16: nová jména se zavádějí vedle
starých, aby běžící instalace nic nerozbilo.

Nově:

    binárka a spec       dice-counter.spec, dist/dice-counter
    přílohy releasu      dice-counter-linux-x86_64 a spol.
    služba v LXC         dice-counter.service
    cesty v LXC          /opt/dice-counter, /var/lib/dice-counter
    uživatel             dice-counter
    hostname LXC         dice-counter
    instalátor           deploy/pve-dice-counter.sh
    datový adresář       ~/.local/share/dice-counter a obdoby
    co appka hlásí       "dice-counter <verze>" v banneru i v patičce

Stará jména zatím fungují dál:

  - Přílohy se na release věší pod oběma jmény.
  - Instalátor umí stáhnout i kostky-*, takže starší vydání jdou
    nainstalovat pořád.
  - deploy/pve-kostky.sh zůstává jako přesměrování — příkaz `update`
    v už založených kontejnerech chodí pro instalátor právě tam.
  - Kontejnery z dřívějška se při aktualizaci přestěhují samy: služba
    se přejmenuje a databáze se přesune do /var/lib/dice-counter, takže
    o historii her nikdo nepřijde.
  - Binárka sáhne po ~/.local/share/kostky/dice.db, dokud nová databáze
    neexistuje.

Při zkoušení přechodu vyplavala chyba, která tu byla už předtím: příkaz
`update` si nový instalátor uloží do $HOME_DIR/install.sh a odtud ho
pustí, takže `install -m 755 "$0" "$HOME_DIR/install.sh"` kopírovalo
soubor sám na sebe. install to odmítne, se `set -e` spadl celý update.
Ošetřeno testem `-ef`.

Ověřeno v debianím kontejneru: přechod ze staré instalace (včetně běhu
instalátoru z adresáře, který se během něj maže), čistá instalace, běh
proti releasu, kde je jen stará příloha, a druhé spuštění za sebou.

Refs #16
2026-08-23 22:29:58 +02:00
gitea-actions 5feb3cdd23 Připnout image k repozitáři přes OCI label
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 7s
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
Balíček se po publikaci objevil jen pod uživatelem, záložka Packages
u repozitáře zůstala prázdná. Gitea páruje kontejnerový balíček s repozitářem
podle labelu org.opencontainers.image.source a image dosud neměl labely
vůbec žádné.

Kromě source ještě title, description, url a version — ta se plní z build
argumentu, takže sedí s tím, co hlásí --version.
2026-08-23 22:07:14 +02:00
13 changed files with 94 additions and 74 deletions

No files matched your search

+13 -8
View File
@@ -66,10 +66,15 @@ jobs:
- name: Zkouška - name: Zkouška
run: | run: |
XDG_DATA_HOME=/tmp/zkouska DICE_PORT=8321 DICE_HOST=127.0.0.1 \ # Vlastní adresář pro každý běh. Runner si /tmp mezi běhy drží
./dist/kostky > /tmp/server.log 2>&1 & # a binárka umí sáhnout po databázi ve starém umístění, takže
# zbytek po dřívější zkoušce by tuhle poslal vedle.
XDG=$(mktemp -d)
XDG_DATA_HOME="$XDG" DICE_PORT=8321 DICE_HOST=127.0.0.1 \
./dist/dice-counter > /tmp/server.log 2>&1 &
server=$! server=$!
trap 'kill $server 2>/dev/null || true' EXIT trap 'kill $server 2>/dev/null || true; rm -rf "$XDG"' EXIT
for _ in $(seq 30); do for _ in $(seq 30); do
curl -sf -o /dev/null http://127.0.0.1:8321/ && break curl -sf -o /dev/null http://127.0.0.1:8321/ && break
@@ -79,15 +84,15 @@ jobs:
curl -sf -o /dev/null http://127.0.0.1:8321/ curl -sf -o /dev/null http://127.0.0.1:8321/
curl -sf -o /dev/null http://127.0.0.1:8321/static/style.css curl -sf -o /dev/null http://127.0.0.1:8321/static/style.css
curl -sf -o /dev/null http://127.0.0.1:8321/board curl -sf -o /dev/null http://127.0.0.1:8321/board
test -f /tmp/zkouska/kostky/dice.db test -f "$XDG/dice-counter/dice.db"
./dist/kostky --version ./dist/dice-counter --version
cat /tmp/server.log cat /tmp/server.log
- name: Na release - name: Na release
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
env: env:
TOKEN: ${{ secrets.GITHUB_TOKEN }} TOKEN: ${{ secrets.GITHUB_TOKEN }}
ASSET: kostky-linux-x86_64 ASSET: dice-counter-linux-x86_64
run: | run: |
api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
auth="Authorization: token ${TOKEN}" auth="Authorization: token ${TOKEN}"
@@ -104,8 +109,8 @@ jobs:
fi fi
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby # Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
# šel ověřit rovnou: sha256sum -c kostky-linux-x86_64.sha256 # šel ověřit rovnou: sha256sum -c dice-counter-linux-x86_64.sha256
cp dist/kostky "$ASSET" cp dist/dice-counter "$ASSET"
sha256sum "$ASSET" | tee "$ASSET.sha256" sha256sum "$ASSET" | tee "$ASSET.sha256"
for file in "$ASSET" "$ASSET.sha256"; do for file in "$ASSET" "$ASSET.sha256"; do
+9 -9
View File
@@ -31,17 +31,17 @@ jobs:
matrix: matrix:
include: include:
- os: windows-latest - os: windows-latest
asset: kostky-windows-x86_64.exe asset: dice-counter-windows-x86_64.exe
built: dist/kostky.exe built: dist/dice-counter.exe
- os: macos-15-intel # Intel; macos-13 GitHub zrušil - os: macos-15-intel # Intel; macos-13 GitHub zrušil
asset: kostky-macos-x86_64 asset: dice-counter-macos-x86_64
built: dist/kostky built: dist/dice-counter
- os: macos-latest # Apple Silicon - os: macos-latest # Apple Silicon
asset: kostky-macos-arm64 asset: dice-counter-macos-arm64
built: dist/kostky built: dist/dice-counter
- os: ubuntu-24.04-arm # pro Raspberry Pi a spol. - os: ubuntu-24.04-arm # pro Raspberry Pi a spol.
asset: kostky-linux-arm64 asset: dice-counter-linux-arm64
built: dist/kostky built: dist/dice-counter
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
defaults: defaults:
@@ -124,7 +124,7 @@ jobs:
fi fi
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby # Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
# šel ověřit rovnou: shasum -a 256 -c kostky-macos-arm64.sha256 # šel ověřit rovnou: shasum -a 256 -c dice-counter-macos-arm64.sha256
cp "${{ matrix.built }}" "$ASSET" cp "${{ matrix.built }}" "$ASSET"
soucet "$ASSET" | tee "$ASSET.sha256" soucet "$ASSET" | tee "$ASSET.sha256"
+20 -20
View File
@@ -13,19 +13,19 @@ Stáhni binárku pro svůj systém z
| Systém | Soubor | | Systém | Soubor |
|---|---| |---|---|
| Linux (x86-64) | `kostky-linux-x86_64` | | Linux (x86-64) | `dice-counter-linux-x86_64` |
| Linux (ARM64) | `kostky-linux-arm64` | | Linux (ARM64) | `dice-counter-linux-arm64` |
| macOS (Apple Silicon) | `kostky-macos-arm64` | | macOS (Apple Silicon) | `dice-counter-macos-arm64` |
| macOS (Intel) | `kostky-macos-x86_64` | | macOS (Intel) | `dice-counter-macos-x86_64` |
| Windows (x86-64) | `kostky-windows-x86_64.exe` | | Windows (x86-64) | `dice-counter-windows-x86_64.exe` |
Nic se neinstaluje — Python, Flask i šablony jsou uvnitř. Nic se neinstaluje — Python, Flask i šablony jsou uvnitř.
Na Linuxu a macOS: Na Linuxu a macOS:
```bash ```bash
chmod +x kostky-* chmod +x dice-counter-*
./kostky-linux-x86_64 ./dice-counter-linux-x86_64
``` ```
Na Windows stačí na `.exe` poklepat. Na Windows stačí na `.exe` poklepat.
@@ -38,7 +38,7 @@ Binárky nejsou podepsané — podpisové certifikáty stojí tisíce ročně a
počitadlo kostek by to byl nesmysl. Systémy si toho všimnou: počitadlo kostek by to byl nesmysl. Systémy si toho všimnou:
- **macOS** stažený soubor označí za karanténní a odmítne ho spustit. Buď - **macOS** stažený soubor označí za karanténní a odmítne ho spustit. Buď
značku sundej (`xattr -dr com.apple.quarantine kostky-macos-arm64`), nebo značku sundej (`xattr -dr com.apple.quarantine dice-counter-macos-arm64`), nebo
soubor stáhni rovnou z terminálu přes `curl -LO` — tudy se karanténa soubor stáhni rovnou z terminálu přes `curl -LO` — tudy se karanténa
nenastavuje. nenastavuje.
- **Windows** ukáže modré okno SmartScreenu. *Další informace* → - **Windows** ukáže modré okno SmartScreenu. *Další informace* →
@@ -60,7 +60,7 @@ Závislosti si skript nese v hlavičce (PEP 723) a `uv` je obstará sám.
Server vypíše všechny adresy, na kterých je dostupný: Server vypíše všechny adresy, na kterých je dostupný:
``` ```
Kostky v1.1.0 dice-counter v1.2.2
Počitadlo je dostupné na: Počitadlo je dostupné na:
→ http://10.186.234.182:8000 místní síť → http://10.186.234.182:8000 místní síť
@@ -68,7 +68,7 @@ Počitadlo je dostupné na:
http://172.17.0.1:8000 virtuální síť http://172.17.0.1:8000 virtuální síť
``` ```
Kterou verzi máš, řekne i `kostky --version`; visí taky v patičce každé Kterou verzi máš, řekne i `dice-counter --version`; visí taky v patičce každé
stránky. Když něco nefunguje, je to první věc, na kterou se zeptám. stránky. Když něco nefunguje, je to první věc, na kterou se zeptám.
Na notebooku otevři `/board`, naskenuj QR kód telefonem a hraj. Tabule Na notebooku otevři `/board`, naskenuj QR kód telefonem a hraj. Tabule
@@ -88,9 +88,9 @@ server vypíše při startu.
| Spuštěno | Databáze | | Spuštěno | Databáze |
|---|---| |---|---|
| binárkou na Linuxu | `~/.local/share/kostky/dice.db` | | binárkou na Linuxu | `~/.local/share/dice-counter/dice.db` |
| binárkou na macOS | `~/Library/Application Support/kostky/dice.db` | | binárkou na macOS | `~/Library/Application Support/dice-counter/dice.db` |
| binárkou na Windows | `%LOCALAPPDATA%\kostky\dice.db` | | binárkou na Windows | `%LOCALAPPDATA%\dice-counter\dice.db` |
| ze zdrojáků | `dice.db` v pracovním adresáři | | ze zdrojáků | `dice.db` v pracovním adresáři |
Binárka se při každém spuštění rozbaluje do dočasného adresáře a pouští se Binárka se při každém spuštění rozbaluje do dočasného adresáře a pouští se
@@ -129,7 +129,7 @@ nastaví ho, stáhne poslední vydanou binárku, ověří kontrolní součet a z
službu: službu:
```bash ```bash
bash -c "$(curl -fsSL https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/pve-kostky.sh)" bash -c "$(curl -fsSL https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/pve-dice-counter.sh)"
``` ```
Na konci vypíše adresu, na které počitadlo poslouchá. Výchozí nastavení je Na konci vypíše adresu, na které počitadlo poslouchá. Výchozí nastavení je
@@ -143,7 +143,7 @@ MEMORY=1024 STORAGE=local-zfs PORT=8080 bash -c "$(curl -fsSL ...)"
| Proměnná | Výchozí | | Proměnná | Výchozí |
|---|---| |---|---|
| `CTID` | první volné číslo | | `CTID` | první volné číslo |
| `CT_HOSTNAME` | `kostky` | | `CT_HOSTNAME` | `dice-counter` |
| `CORES`, `MEMORY`, `DISK` | `1`, `512`, `4` | | `CORES`, `MEMORY`, `DISK` | `1`, `512`, `4` |
| `STORAGE` | první aktivní úložiště pro kontejnery | | `STORAGE` | první aktivní úložiště pro kontejnery |
| `TEMPLATE_STORAGE`, `BRIDGE` | `local`, `vmbr0` | | `TEMPLATE_STORAGE`, `BRIDGE` | `local`, `vmbr0` |
@@ -185,7 +185,7 @@ přes rouru z curlu na disku hostitele žádný druhý soubor není. O Proxmoxu
neví, takže se dá použít i v kontejneru, který sis založil sám: neví, takže se dá použít i v kontejneru, který sis založil sám:
```bash ```bash
bash pve-kostky.sh instalator > install.sh bash pve-dice-counter.sh instalator > install.sh
``` ```
Je idempotentní; druhé spuštění jen vymění binárku za nejnovější. Je idempotentní; druhé spuštění jen vymění binárku za nejnovější.
@@ -223,7 +223,7 @@ Kdo bridge potřebuje, musí nastavit `DICE_HOST` na adresu hostitele v LAN.
| | LXC | Docker | | | LXC | Docker |
|---|---|---| |---|---|---|
| Odkud | vydaná binárka z releasu | image z registru | | Odkud | vydaná binárka z releasu | image z registru |
| Databáze | `/var/lib/kostky/dice.db` | svazek `kostky-data` | | Databáze | `/var/lib/dice-counter/dice.db` | svazek `dice-counter-data` |
| Aktualizace | `update` uvnitř kontejneru | `docker compose 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 |
@@ -262,7 +262,7 @@ při remíze na prvním místě se hraje dál.
| `dice.py` | totéž v terminálu, bez ukládání | | `dice.py` | totéž v terminálu, bez ukládání |
| `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`, `dice-counter.spec` | stavba binárky |
| `.gitea/workflows/` | testy, linuxová binárka a zkouška image 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 |
@@ -321,7 +321,7 @@ srovnat.
``` ```
Verzi si `build.sh` vezme z `git describe`, nebo se dá vnutit přes Verzi si `build.sh` vezme z `git describe`, nebo se dá vnutit přes
`VERSION=v1.2.3 ./build.sh`. Zapíše ji do `verze.txt`, `kostky.spec` ji `VERSION=v1.2.3 ./build.sh`. Zapíše ji do `verze.txt`, `dice-counter.spec` ji
přibalí a binárka ji pak umí ohlásit i na cizím počítači, kde žádný git není. přibalí a binárka ji pak umí ohlásit i na cizím počítači, kde žádný git není.
Verzi Pythonu, proti kterému se staví, přebíjí `PYTHON_VERSION`. Verzi Pythonu, proti kterému se staví, přebíjí `PYTHON_VERSION`.
@@ -366,7 +366,7 @@ ji kamkoli pověsí. Vedle každé visí i `.sha256`, takže se stažený soubor
ověřit: ověřit:
```bash ```bash
sha256sum -c kostky-linux-x86_64.sha256 # na macOS: shasum -a 256 -c sha256sum -c dice-counter-linux-x86_64.sha256 # na macOS: shasum -a 256 -c
``` ```
Nad pull requesty se Linux staví taky, jen se nikam nevěší. Totéž platí pro Nad pull requesty se Linux staví taky, jen se nikam nevěší. Totéž platí pro
+1 -1
View File
@@ -38,7 +38,7 @@ fi
uv pip install --quiet --python "$python" -r requirements-build.txt uv pip install --quiet --python "$python" -r requirements-build.txt
"$pyinstaller" --clean --noconfirm \ "$pyinstaller" --clean --noconfirm \
--distpath dist --workpath "$BUILD/work" kostky.spec --distpath dist --workpath "$BUILD/work" dice-counter.spec
echo echo
ls -lh dist/ ls -lh dist/
+9
View File
@@ -13,6 +13,15 @@ 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á
# Podle image.source si Gitea připne balíček k repozitáři. Bez toho labelu
# image sice existuje, ale visí jen pod uživatelem a záložka Packages
# u repozitáře zůstane prázdná.
LABEL org.opencontainers.image.source="https://gitea.spacilovi.eu/david-spacil/dice-counter" \
org.opencontainers.image.url="https://gitea.spacilovi.eu/david-spacil/dice-counter" \
org.opencontainers.image.title="dice-counter" \
org.opencontainers.image.description="Počitadlo kostek: telefon zapisuje skóre, notebook ukazuje zápisník" \
org.opencontainers.image.version="$VERSION"
RUN useradd --system --uid 1000 --home-dir /app --shell /usr/sbin/nologin dice-counter RUN useradd --system --uid 1000 --home-dir /app --shell /usr/sbin/nologin dice-counter
WORKDIR /app WORKDIR /app
@@ -3,14 +3,14 @@
# #
# Pouští se v terminálu uzlu Proxmoxu jako root, jedním příkazem: # Pouští se v terminálu uzlu Proxmoxu jako root, jedním příkazem:
# #
# bash -c "$(curl -fsSL https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/pve-kostky.sh)" # bash -c "$(curl -fsSL https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/pve-dice-counter.sh)"
# #
# Aktualizace stávajícího kontejneru na novější vydání: # Aktualizace stávajícího kontejneru na novější vydání:
# #
# CTID=123 MODE=update bash -c "$(curl -fsSL .../pve-kostky.sh)" # CTID=123 MODE=update bash -c "$(curl -fsSL .../pve-dice-counter.sh)"
# #
# Ze staženého souboru jde i obojí postaru: `bash pve-kostky.sh` a # Ze staženého souboru jde i obojí postaru: `bash pve-dice-counter.sh` a
# `bash pve-kostky.sh update 123`. # `bash pve-dice-counter.sh update 123`.
# #
# Podoba je odkoukaná od community-scripts.org, ale nic z jejich frameworku # Podoba je odkoukaná od community-scripts.org, ale nic z jejich frameworku
# se tu nestahuje — jejich build.func si instalační skript hledá natvrdo ve # se tu nestahuje — jejich build.func si instalační skript hledá natvrdo ve
@@ -20,13 +20,13 @@
# nezabezpečuje; do internetu ji nepouštěj. # nezabezpečuje; do internetu ji nepouštěj.
set -euo pipefail set -euo pipefail
APP="Kostky" APP="dice-counter"
GITEA="${GITEA:-https://gitea.spacilovi.eu}" GITEA="${GITEA:-https://gitea.spacilovi.eu}"
REPO="${REPO:-david-spacil/dice-counter}" REPO="${REPO:-david-spacil/dice-counter}"
# Výchozí hodnoty. Všechny se dají přebít proměnnou prostředí, třeba: # Výchozí hodnoty. Všechny se dají přebít proměnnou prostředí, třeba:
# MEMORY=1024 STORAGE=local-zfs bash -c "$(curl -fsSL ...)" # MEMORY=1024 STORAGE=local-zfs bash -c "$(curl -fsSL ...)"
CT_HOSTNAME="${CT_HOSTNAME:-kostky}" CT_HOSTNAME="${CT_HOSTNAME:-dice-counter}"
CORES="${CORES:-1}" CORES="${CORES:-1}"
MEMORY="${MEMORY:-512}" MEMORY="${MEMORY:-512}"
DISK="${DISK:-4}" DISK="${DISK:-4}"
@@ -64,7 +64,7 @@ header() {
# 'INSTALL' jsou podstatné: nic z toho se tady nesmí rozvinout, všechny # 'INSTALL' jsou podstatné: nic z toho se tady nesmí rozvinout, všechny
# proměnné patří až tomu, co poběží v kontejneru. # proměnné patří až tomu, co poběží v kontejneru.
# #
# Vypsat se dá i samostatně: `bash pve-kostky.sh instalator > install.sh`, # Vypsat se dá i samostatně: `bash pve-dice-counter.sh instalator > install.sh`,
# což se hodí, když chceš appku dostat do kontejneru, který sis založil sám. # což se hodí, když chceš appku dostat do kontejneru, který sis založil sám.
installer() { installer() {
cat <<'INSTALL' cat <<'INSTALL'
@@ -79,17 +79,18 @@ REPO="${REPO:-david-spacil/dice-counter}"
PORT="${PORT:-8000}" PORT="${PORT:-8000}"
VERSION="${VERSION:-}" VERSION="${VERSION:-}"
USER_NAME=kostky USER_NAME=dice-counter
HOME_DIR=/opt/kostky HOME_DIR=/opt/dice-counter
DATA_DIR=/var/lib/kostky DATA_DIR=/var/lib/dice-counter
SERVICE=dice-counter
msg() { echo -e "\e[1;34m →\e[0m $*"; } msg() { echo -e "\e[1;34m →\e[0m $*"; }
ok() { echo -e "\e[1;32m ✓\e[0m $*"; } ok() { echo -e "\e[1;32m ✓\e[0m $*"; }
die() { echo -e "\e[1;31m ✗\e[0m $*" >&2; exit 1; } die() { echo -e "\e[1;31m ✗\e[0m $*" >&2; exit 1; }
case "$(dpkg --print-architecture)" in case "$(dpkg --print-architecture)" in
amd64) ASSET=kostky-linux-x86_64 ;; amd64) ASSET=dice-counter-linux-x86_64 ;;
arm64) ASSET=kostky-linux-arm64 ;; arm64) ASSET=dice-counter-linux-arm64 ;;
*) die "Pro architekturu $(dpkg --print-architecture) binárka není." ;; *) die "Pro architekturu $(dpkg --print-architecture) binárka není." ;;
esac esac
@@ -129,16 +130,16 @@ id -u "$USER_NAME" >/dev/null 2>&1 \
install -d -o root -g root -m 755 "$HOME_DIR" install -d -o root -g root -m 755 "$HOME_DIR"
# Zastavit se dá jen to, co běží — při první instalaci služba ještě není. # Zastavit se dá jen to, co běží — při první instalaci služba ještě není.
if systemctl is-active --quiet kostky; then if systemctl is-active --quiet "$SERVICE"; then
systemctl stop kostky systemctl stop "$SERVICE"
fi fi
install -o root -g root -m 755 "$TMP/$ASSET" "$HOME_DIR/kostky" install -o root -g root -m 755 "$TMP/$ASSET" "$HOME_DIR/dice-counter"
echo "$VERSION" > "$HOME_DIR/verze" echo "$VERSION" > "$HOME_DIR/verze"
ok "Binárka je na místě" ok "Binárka je na místě"
msg "Zapisuji službu" msg "Zapisuji službu"
cat > /etc/systemd/system/kostky.service <<EOF cat > "/etc/systemd/system/$SERVICE.service" <<EOF
[Unit] [Unit]
Description=Počitadlo kostek Description=Počitadlo kostek
Documentation=$GITEA/$REPO Documentation=$GITEA/$REPO
@@ -150,13 +151,13 @@ Type=simple
User=$USER_NAME User=$USER_NAME
Environment=DICE_DB=$DATA_DIR/dice.db Environment=DICE_DB=$DATA_DIR/dice.db
Environment=DICE_PORT=$PORT Environment=DICE_PORT=$PORT
ExecStart=$HOME_DIR/kostky ExecStart=$HOME_DIR/dice-counter
Restart=on-failure Restart=on-failure
RestartSec=5 RestartSec=5
# Databáze je jediné, co appka potřebuje mít zapisovatelné. StateDirectory ji # Databáze je jediné, co appka potřebuje mít zapisovatelné. StateDirectory ji
# založí a předá správnému uživateli, takže se tu nemusí nic chownovat. # založí a předá správnému uživateli, takže se tu nemusí nic chownovat.
StateDirectory=kostky StateDirectory=dice-counter
ReadWritePaths=$DATA_DIR ReadWritePaths=$DATA_DIR
NoNewPrivileges=true NoNewPrivileges=true
@@ -171,7 +172,7 @@ WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl enable --quiet --now kostky systemctl enable --quiet --now "$SERVICE"
ok "Služba běží" ok "Služba běží"
# --- konzole v rozhraní Proxmoxu -------------------------------------------- # --- konzole v rozhraní Proxmoxu --------------------------------------------
@@ -197,7 +198,12 @@ fi
# Instalátor si necháme, ať je z čeho aktualizovat. Když se skript pouští # Instalátor si necháme, ať je z čeho aktualizovat. Když se skript pouští
# rourou, soubor neexistuje a zůstane ten z minula. # rourou, soubor neexistuje a zůstane ten z minula.
if [ -f "$0" ]; then #
# `-ef` je tu nutnost, ne opatrnost: příkaz `update` si nový instalátor uloží
# rovnou sem a odsud ho pustí, takže `$0` a cíl jsou tentýž soubor. `install`
# na to řekne "are the same file", skončí chybou a se `set -e` by celý update
# spadl dřív, než by stihl cokoli udělat.
if [ -f "$0" ] && ! [ "$0" -ef "$HOME_DIR/install.sh" ]; then
install -m 755 "$0" "$HOME_DIR/install.sh" install -m 755 "$0" "$HOME_DIR/install.sh"
fi fi
@@ -209,7 +215,7 @@ set -euo pipefail
# Nejdřív zkusíme obnovit i samotný instalátor, kdyby se mezitím zlepšil. # 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ý. # Bez sítě nebo při změněné adrese se použije ten uložený.
NOVY=\$(mktemp) NOVY=\$(mktemp)
if curl -fsSL "$GITEA/$REPO/raw/branch/main/deploy/pve-kostky.sh" -o "\$NOVY" 2>/dev/null \\ if curl -fsSL "$GITEA/$REPO/raw/branch/main/deploy/pve-dice-counter.sh" -o "\$NOVY" 2>/dev/null \\
&& bash "\$NOVY" instalator > "\$NOVY.in" 2>/dev/null \\ && bash "\$NOVY" instalator > "\$NOVY.in" 2>/dev/null \\
&& bash -n "\$NOVY.in" 2>/dev/null; then && bash -n "\$NOVY.in" 2>/dev/null; then
install -m 755 "\$NOVY.in" "$HOME_DIR/install.sh" install -m 755 "\$NOVY.in" "$HOME_DIR/install.sh"
@@ -227,7 +233,7 @@ for _ in $(seq 30); do
sleep 1 sleep 1
done done
curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" \ curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" \
|| die "Služba nastartovala, ale neodpovídá. Mrkni na journalctl -u kostky." || die "Služba nastartovala, ale neodpovídá. Mrkni na journalctl -u $SERVICE."
# Verzi bereme ze souboru, ne z binárky. Starší vydání --version neumí # Verzi bereme ze souboru, ne z binárky. Starší vydání --version neumí
# a místo výpisu by nastartovala server, který by tenhle skript zavěsil. # a místo výpisu by nastartovala server, který by tenhle skript zavěsil.
@@ -243,11 +249,11 @@ install_into() {
installer > "$tmp" installer > "$tmp"
msg "Posílám instalátor do kontejneru $ctid" msg "Posílám instalátor do kontejneru $ctid"
pct push "$ctid" "$tmp" /root/kostky-install.sh --perms 0755 pct push "$ctid" "$tmp" /root/dice-counter-install.sh --perms 0755
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" AUTOLOGIN="$AUTOLOGIN" bash /root/kostky-install.sh VERSION="$VERSION" AUTOLOGIN="$AUTOLOGIN" bash /root/dice-counter-install.sh
} }
address_of() { address_of() {
@@ -265,9 +271,9 @@ hotovo() {
echo -e " Zápisník na notebook: \e[1;32mhttp://${ip}:${PORT}/board\e[0m" echo -e " Zápisník na notebook: \e[1;32mhttp://${ip}:${PORT}/board\e[0m"
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/dice-counter/dice.db (uvnitř kontejneru)"
echo -e " Aktualizace: v konzoli kontejneru napiš update" 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 dice-counter -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"
echo echo
@@ -276,7 +282,7 @@ hotovo() {
# --- co se má vlastně dělat -------------------------------------------------- # --- co se má vlastně dělat --------------------------------------------------
# #
# Rourou z curlu se argumenty předávají mizerně, tak jde všechno i proměnnou: # Rourou z curlu se argumenty předávají mizerně, tak jde všechno i proměnnou:
# MODE=update CTID=123. Ze souboru funguje i `bash pve-kostky.sh update 123`. # MODE=update CTID=123. Ze souboru funguje i `bash pve-dice-counter.sh update 123`.
MODE="${MODE:-${1:-create}}" MODE="${MODE:-${1:-create}}"
[ "$MODE" = "update" ] && CTID="${CTID:-${2:-}}" [ "$MODE" = "update" ] && CTID="${CTID:-${2:-}}"
+1 -1
View File
@@ -28,7 +28,7 @@ exe = EXE(
analysis.scripts, analysis.scripts,
analysis.binaries, analysis.binaries,
analysis.datas, analysis.datas,
name="kostky", name="dice-counter",
console=True, console=True,
# Ořezání symbolů šetří pár megabajtů, ale jen na Linuxu. Na macOS by # Ořezání symbolů šetří pár megabajtů, ale jen na Linuxu. Na macOS by
# rozbilo podpis, který si PyInstaller sám přidává a bez kterého se # rozbilo podpis, který si PyInstaller sám přidává a bez kterého se
+1 -1
View File
@@ -134,7 +134,7 @@ if __name__ == "__main__":
console.utf8() console.utf8()
if {"--version", "-V"} & set(sys.argv[1:]): if {"--version", "-V"} & set(sys.argv[1:]):
print(f"kostky {version.current()}") print(f"dice-counter {version.current()}")
sys.exit(0) sys.exit(0)
main() main()
+1 -1
View File
@@ -39,7 +39,7 @@ def default_db() -> Path:
if chosen: if chosen:
return Path(chosen) return Path(chosen)
if getattr(sys, "frozen", False): if getattr(sys, "frozen", False):
return data_home() / "kostky" / "dice.db" return data_home() / "dice-counter" / "dice.db"
return Path("dice.db") return Path("dice.db")
+1 -1
View File
@@ -8,6 +8,6 @@
</head> </head>
<body> <body>
{% block body %}{% endblock %} {% block body %}{% endblock %}
<footer class="verze">kostky {{ verze }}</footer> <footer class="verze">dice-counter {{ verze }}</footer>
</body> </body>
</html> </html>
+1 -1
View File
@@ -152,7 +152,7 @@ def test_umisteni_databaze_z_binarky(monkeypatch, tmp_path):
monkeypatch.setattr(storage.sys, "platform", "linux") monkeypatch.setattr(storage.sys, "platform", "linux")
monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path)) monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path))
assert storage.default_db() == tmp_path / "kostky" / "dice.db" assert storage.default_db() == tmp_path / "dice-counter" / "dice.db"
def test_data_home_podle_systemu(monkeypatch, tmp_path): def test_data_home_podle_systemu(monkeypatch, tmp_path):
+1 -1
View File
@@ -17,7 +17,7 @@ UNKNOWN = "neznámá"
def bundled() -> str: def bundled() -> str:
"""Verze vypálená do binárky při stavbě. """Verze vypálená do binárky při stavbě.
`build.sh` ji zapíše do souboru, `kostky.spec` ji přibalí. V binárce `build.sh` ji zapíše do souboru, `dice-counter.spec` ji přibalí. V binárce
leží vedle šablon v dočasném adresáři, na který ukazuje `sys._MEIPASS`. leží vedle šablon v dočasném adresáři, na který ukazuje `sys._MEIPASS`.
""" """
root = Path(getattr(sys, "_MEIPASS", Path(__file__).parent)) root = Path(getattr(sys, "_MEIPASS", Path(__file__).parent))
+3 -3
View File
@@ -350,7 +350,7 @@ def export():
return send_file(io.BytesIO(data), mimetype="application/vnd.sqlite3", return send_file(io.BytesIO(data), mimetype="application/vnd.sqlite3",
as_attachment=True, as_attachment=True,
download_name=f"kostky-{date.today().isoformat()}.db") download_name=f"dice-counter-{date.today().isoformat()}.db")
@app.route("/stats") @app.route("/stats")
@@ -364,7 +364,7 @@ def hall():
def announce() -> None: def announce() -> None:
"""Vypíše, kde všude je počitadlo k mání, a čím je zrovna spuštěné.""" """Vypíše, kde všude je počitadlo k mání, a čím je zrovna spuštěné."""
print(f"Kostky {version.current()}\n") print(f"dice-counter {version.current()}\n")
found = net.addresses() found = net.addresses()
@@ -384,7 +384,7 @@ if __name__ == "__main__":
console.utf8() console.utf8()
if {"--version", "-V"} & set(sys.argv[1:]): if {"--version", "-V"} & set(sys.argv[1:]):
print(f"kostky {version.current()}") print(f"dice-counter {version.current()}")
sys.exit(0) sys.exit(0)
announce() announce()