| 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" |