$ kode

← alle Dateien · als Text

install.sh

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114#!/bin/sh # kode installieren: curl -fsSL https://kode.boothtml.com/install.sh | sudo sh # # Legt an: /opt/kode (Code + venv), /usr/local/bin/kode, /etc/kode/kode.env # (Vorlage fuer die Schluessel, wird nie ueberschrieben), /var/lib/kode und # den Waechterdienst kode-waechter (loescht Mietkarten nach Leerlauf). # Ein zweiter Aufruf aktualisiert den Code und laesst Schluessel und Daten stehen. # # Schluessel gleich mitgeben: # curl -fsSL https://kode.boothtml.com/install.sh | sudo RUNPOD_API_KEY=... VAST_API_KEY=... sh set -eu QUELLE="${KODE_QUELLE:-https://kode.boothtml.com/kode.tar.gz}" ZIEL="${KODE_ZIEL:-/opt/kode}" melde() { printf '\033[1;36m==>\033[0m %s\n' "$*"; } fehler() { printf '\033[1;31mFehler:\033[0m %s\n' "$*" >&2; exit 1; } [ "$(uname -s)" = "Linux" ] || fehler "kode läuft nur unter Linux." [ "$(id -u)" -eq 0 ] || fehler "Bitte als root ausführen (… | sudo sh)." # --- Pakete fehlt="" command -v python3 >/dev/null 2>&1 || fehlt="$fehlt python3" python3 -c 'import venv, ensurepip' >/dev/null 2>&1 || fehlt="$fehlt venv" command -v tmux >/dev/null 2>&1 || fehlt="$fehlt tmux" command -v curl >/dev/null 2>&1 || fehlt="$fehlt curl" if [ -n "$fehlt" ]; then melde "Installiere Pakete:$fehlt" if command -v apt-get >/dev/null 2>&1; then apt-get update -qq DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3 python3-venv tmux curl >/dev/null elif command -v dnf >/dev/null 2>&1; then dnf install -y -q python3 tmux curl elif command -v pacman >/dev/null 2>&1; then pacman -Sy --noconfirm --needed python tmux curl >/dev/null elif command -v zypper >/dev/null 2>&1; then zypper -q install -y python3 tmux curl else fehler "Paketverwaltung unbekannt - bitte python3 (mit venv), tmux und curl selbst installieren." fi fi python3 - <<'EOF' || fehler "Python 3.11 oder neuer nötig (gefunden: $(python3 -V 2>&1))." import sys sys.exit(0 if sys.version_info >= (3, 11) else 1) EOF # --- Code melde "Lade kode nach $ZIEL" tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT curl -fsSL "$QUELLE" -o "$tmp/kode.tar.gz" mkdir -p "$tmp/neu" tar -xzf "$tmp/kode.tar.gz" -C "$tmp/neu" [ -f "$tmp/neu/kode/__main__.py" ] || fehler "Archiv unvollständig." mkdir -p "$ZIEL" # Alter Code raus, venv bleibt (spart den erneuten Download der Pakete). rm -rf "$ZIEL/kode" cp -R "$tmp/neu/." "$ZIEL/" melde "Python-Umgebung" [ -x "$ZIEL/.venv/bin/python" ] || python3 -m venv "$ZIEL/.venv" "$ZIEL/.venv/bin/pip" install -q --upgrade pip >/dev/null "$ZIEL/.venv/bin/pip" install -q -r "$ZIEL/requirements.txt" # Paket ohne pip install auffindbar machen - "python -m kode" aus jedem Ordner. "$ZIEL/.venv/bin/python" -c 'import site; print(site.getsitepackages()[0])' | { read -r sp; printf '%s\n' "$ZIEL" > "$sp/kode.pth"; } cat > /usr/local/bin/kode <<EOF #!/bin/sh exec $ZIEL/.venv/bin/python -m kode "\$@" EOF chmod 755 /usr/local/bin/kode # --- Schluessel und Daten mkdir -p /etc/kode /var/lib/kode chmod 700 /etc/kode /var/lib/kode if [ ! -f /etc/kode/kode.env ]; then umask 077 cat > /etc/kode/kode.env <<EOF # Schlüssel für die Mietkarten - mindestens einer. # RunPod: https://www.runpod.io/console/user/settings (API Keys) # Vast.ai: https://cloud.vast.ai/manage-keys/ RUNPOD_API_KEY=${RUNPOD_API_KEY:-} VAST_API_KEY=${VAST_API_KEY:-} EOF chmod 600 /etc/kode/kode.env neu_env=1 else neu_env=0 fi # --- Waechter if command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; then melde "Wächterdienst kode-waechter" sed "s#/opt/kode#$ZIEL#g" "$ZIEL/systemd/kode-waechter.service" > /etc/systemd/system/kode-waechter.service systemctl daemon-reload systemctl enable -q kode-waechter systemctl restart kode-waechter else printf '\033[1;33mHinweis:\033[0m kein systemd - der Wächter läuft nicht. Ohne ihn werden\n' printf 'Karten nur beim Beenden von kode gelöscht. Selbst starten: %s/.venv/bin/python -m kode.waechter\n' "$ZIEL" fi echo melde "kode ist installiert." if [ "$neu_env" = 1 ] && ! grep -Eq '^(RUNPOD|VAST)_API_KEY=.+' /etc/kode/kode.env; then echo " 1. Schlüssel eintragen: nano /etc/kode/kode.env" echo " 2. In einen Projektordner wechseln und kode starten." else echo " In einen Projektordner wechseln und kode starten." fi echo " Hilfe im Programm: /hilfe · Karte löschen: kode stopp"