Nasazení na server: Proxmox LXC a Docker
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 0s
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 0s
Aby se to dalo nechat běžet pořád, ne jen spouštět večer na notebooku. pve-kostky.sh se pouští na uzlu Proxmoxu, založí kontejner a předá řízení lxc-install.sh, který uvnitř stáhne vydanou binárku, ověří kontrolní součet a zapíše službu. Ty dva jsou oddělené schválně: instalátor o Proxmoxu nic neví, takže se dá pustit i v kontejneru, který sis založil sám. Podoba je odkoukaná od community-scripts.org, 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. Docker se staví ze zdrojáků, ne z binárky: image pak jde sestavit pro obě architektury a nezávisí na tom, jestli release proběhl. Zamčené závislosti z minula dělají sestavení opakovatelné. Compose používá síť hostitele, a to je podstatné. V bridge režimu vidí kontejner uvnitř adresu 172.17.0.2, tabule ji poctivě nabídne a udělá na ni QR kód — jenže z telefonu je nedosažitelná. Ověřeno, ne odhadnuto; kdo bridge potřebuje, musí nastavit DICE_HOST. Aplikace sama nepotřebovala změnit nic. DICE_DB, DICE_PORT a DICE_HOST pokrývají obojí a v LXC má kontejner vlastní adresu v LAN, takže hledání adres i QR kód fungují beze změny.
This commit is contained in:
1 parent
923fc03581
commit
eaa9c12ebc
6 files changed
+449
No files matched your search
Executable
+124
@@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env bash
|
||||
# Instalace počitadla uvnitř kontejneru. Pouští se přes pve-kostky.sh, ne ručně.
|
||||
#
|
||||
# Oddělené od skriptu pro Proxmox schválně: tenhle běží uvnitř Debianu a nic
|
||||
# o Proxmoxu neví, takže se dá pustit i v LXC, který sis založil sám, nebo ve
|
||||
# virtuálu. Je idempotentní — po druhém spuštění máš nejnovější binárku.
|
||||
set -euo pipefail
|
||||
|
||||
GITEA="${GITEA:-https://gitea.spacilovi.eu}"
|
||||
REPO="${REPO:-david-spacil/dice-counter}"
|
||||
PORT="${PORT:-8000}"
|
||||
VERSION="${VERSION:-}" # prázdné = poslední release
|
||||
|
||||
USER_NAME=kostky
|
||||
HOME_DIR=/opt/kostky
|
||||
DATA_DIR=/var/lib/kostky
|
||||
|
||||
msg() { echo -e "\e[1;34m →\e[0m $*"; }
|
||||
ok() { echo -e "\e[1;32m ✓\e[0m $*"; }
|
||||
die() { echo -e "\e[1;31m ✗\e[0m $*" >&2; exit 1; }
|
||||
|
||||
# --- co vlastně stahovat -----------------------------------------------------
|
||||
|
||||
case "$(dpkg --print-architecture)" in
|
||||
amd64) ASSET=kostky-linux-x86_64 ;;
|
||||
arm64) ASSET=kostky-linux-arm64 ;;
|
||||
*) die "Pro architekturu $(dpkg --print-architecture) binárka není." ;;
|
||||
esac
|
||||
|
||||
msg "Doinstalovávám, co je potřeba ke stažení"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq curl ca-certificates >/dev/null
|
||||
ok "Základ je hotový"
|
||||
|
||||
if [ -z "$VERSION" ]; then
|
||||
msg "Zjišťuji poslední vydanou verzi"
|
||||
# Jen tag; adresa přílohy se z něj složí, takže tu nepotřebujeme jq.
|
||||
VERSION=$(curl -fsSL "$GITEA/api/v1/repos/$REPO/releases/latest" \
|
||||
| grep -o '"tag_name":[[:space:]]*"[^"]*"' | head -1 | cut -d'"' -f4)
|
||||
[ -n "$VERSION" ] || die "Nepodařilo se zjistit poslední verzi z $GITEA."
|
||||
fi
|
||||
ok "Instaluje se $VERSION ($ASSET)"
|
||||
|
||||
# --- stažení a ověření -------------------------------------------------------
|
||||
|
||||
BASE="$GITEA/$REPO/releases/download/$VERSION"
|
||||
TMP=$(mktemp -d)
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
msg "Stahuji binárku"
|
||||
curl -fsSL -o "$TMP/$ASSET" "$BASE/$ASSET" \
|
||||
|| die "$ASSET pro $VERSION na releasu není. Vydání pro tuhle architekturu možná ještě neproběhlo."
|
||||
curl -fsSL -o "$TMP/$ASSET.sha256" "$BASE/$ASSET.sha256" \
|
||||
|| die "Chybí kontrolní součet — radši nic neinstaluju."
|
||||
|
||||
msg "Ověřuji kontrolní součet"
|
||||
( cd "$TMP" && sha256sum -c "$ASSET.sha256" >/dev/null ) \
|
||||
|| die "Kontrolní součet nesedí. Stažený soubor zahazuju."
|
||||
ok "Součet sedí"
|
||||
|
||||
# --- uživatel, soubory, služba ----------------------------------------------
|
||||
|
||||
id -u "$USER_NAME" >/dev/null 2>&1 \
|
||||
|| useradd --system --home-dir "$HOME_DIR" --shell /usr/sbin/nologin "$USER_NAME"
|
||||
|
||||
install -d -o root -g root -m 755 "$HOME_DIR"
|
||||
|
||||
# Služba se zastaví, jen když už běží — při první instalaci ještě neexistuje.
|
||||
systemctl is-active --quiet kostky && systemctl stop kostky
|
||||
install -o root -g root -m 755 "$TMP/$ASSET" "$HOME_DIR/kostky"
|
||||
echo "$VERSION" > "$HOME_DIR/verze"
|
||||
ok "Binárka je na místě"
|
||||
|
||||
msg "Zapisuji službu"
|
||||
cat > /etc/systemd/system/kostky.service <<EOF
|
||||
[Unit]
|
||||
Description=Počitadlo kostek
|
||||
Documentation=$GITEA/$REPO
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=$USER_NAME
|
||||
Environment=DICE_DB=$DATA_DIR/dice.db
|
||||
Environment=DICE_PORT=$PORT
|
||||
ExecStart=$HOME_DIR/kostky
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
# 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.
|
||||
StateDirectory=kostky
|
||||
ReadWritePaths=$DATA_DIR
|
||||
|
||||
NoNewPrivileges=true
|
||||
ProtectSystem=strict
|
||||
ProtectHome=true
|
||||
# Binárka se při každém startu rozbaluje do /tmp; tady do vlastního, ne do
|
||||
# sdíleného.
|
||||
PrivateTmp=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --quiet --now kostky
|
||||
ok "Služba běží"
|
||||
|
||||
# --- kontrola, že to opravdu jede -------------------------------------------
|
||||
|
||||
msg "Čekám, až začne odpovídat"
|
||||
for _ in $(seq 30); do
|
||||
curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" && break
|
||||
sleep 1
|
||||
done
|
||||
curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" \
|
||||
|| die "Služba nastartovala, ale neodpovídá. Mrkni na journalctl -u kostky."
|
||||
|
||||
# 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.
|
||||
ok "Počitadlo $(cat "$HOME_DIR/verze") odpovídá na portu $PORT"
|
||||
Reference in new issue
Block a user