feat: initial release - mobile-first web terminal with tmux, toolbar, and push notifications
This commit is contained in:
Executable
+92
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# kitty-web installer
|
||||
# Mobile-first web terminal with tmux, ttyd, and push notifications
|
||||
set -e
|
||||
|
||||
TTYD_VERSION="1.7.7"
|
||||
SERVICE_USER="${KITTY_USER:-rdp}"
|
||||
TTYD_PORT="${TTYD_PORT:-7681}"
|
||||
NOTIFY_PORT="${NOTIFY_PORT:-7682}"
|
||||
FONT_SIZE="${FONT_SIZE:-18}"
|
||||
|
||||
echo "=== kitty-web installer ==="
|
||||
echo "Service user: $SERVICE_USER"
|
||||
echo "ttyd port: $TTYD_PORT"
|
||||
echo "Notify port: $NOTIFY_PORT"
|
||||
|
||||
# Check root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install dependencies
|
||||
echo "[1/6] Installing dependencies..."
|
||||
apt install -y tmux 2>/dev/null || true
|
||||
|
||||
# Install ttyd
|
||||
if ! command -v ttyd &>/dev/null; then
|
||||
echo "[2/6] Installing ttyd $TTYD_VERSION..."
|
||||
curl -sL "https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.x86_64" -o /usr/local/bin/ttyd
|
||||
chmod +x /usr/local/bin/ttyd
|
||||
else
|
||||
echo "[2/6] ttyd already installed"
|
||||
fi
|
||||
|
||||
# Create user if needed
|
||||
if ! id "$SERVICE_USER" &>/dev/null; then
|
||||
echo "[3/6] Creating user $SERVICE_USER..."
|
||||
useradd -m -s /bin/bash "$SERVICE_USER"
|
||||
else
|
||||
echo "[3/6] User $SERVICE_USER exists"
|
||||
fi
|
||||
|
||||
# Deploy files
|
||||
echo "[4/6] Deploying files..."
|
||||
mkdir -p /opt/kitty-web/static
|
||||
|
||||
# Build custom index (inject toolbar into ttyd's default page)
|
||||
TMPINDEX=$(mktemp)
|
||||
ttyd --port 0 /bin/true &
|
||||
TTYD_PID=$!
|
||||
sleep 1
|
||||
# Can't easily grab default page without a running instance, so we'll
|
||||
# add toolbar.js loading to the page at runtime via the notify server
|
||||
kill $TTYD_PID 2>/dev/null || true
|
||||
|
||||
cp "$(dirname "$0")/toolbar.js" /opt/kitty-web/static/toolbar.js
|
||||
cp "$(dirname "$0")/manifest.json" /opt/kitty-web/static/manifest.json
|
||||
cp "$(dirname "$0")/icon-192.png" /opt/kitty-web/static/icon-192.png 2>/dev/null || true
|
||||
cp "$(dirname "$0")/icon-512.png" /opt/kitty-web/static/icon-512.png 2>/dev/null || true
|
||||
cp "$(dirname "$0")/notify-server.py" /opt/kitty-web/notify-server.py
|
||||
chmod +x /opt/kitty-web/notify-server.py
|
||||
|
||||
# Install kitty-notify command
|
||||
cp "$(dirname "$0")/kitty-notify" /usr/local/bin/kitty-notify
|
||||
chmod +x /usr/local/bin/kitty-notify
|
||||
|
||||
# Install tmux config
|
||||
sudo -u "$SERVICE_USER" cp "$(dirname "$0")/config/tmux.conf" "$(eval echo ~$SERVICE_USER)/.tmux.conf" 2>/dev/null || true
|
||||
|
||||
# Install systemd services
|
||||
echo "[5/6] Installing services..."
|
||||
sed "s/User=rdp/User=$SERVICE_USER/g; s/Group=rdp/Group=$SERVICE_USER/g; s/--port 7681/--port $TTYD_PORT/g; s/fontSize=18/fontSize=$FONT_SIZE/g" \
|
||||
"$(dirname "$0")/systemd/ttyd-kitty.service" > /etc/systemd/system/ttyd-kitty.service
|
||||
|
||||
sed "s/User=rdp/User=$SERVICE_USER/g" \
|
||||
"$(dirname "$0")/systemd/kitty-notify.service" > /etc/systemd/system/kitty-notify.service
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now ttyd-kitty kitty-notify
|
||||
|
||||
echo "[6/6] Verifying..."
|
||||
sleep 2
|
||||
systemctl is-active ttyd-kitty && echo " ttyd: OK (port $TTYD_PORT)"
|
||||
systemctl is-active kitty-notify && echo " notify: OK (port $NOTIFY_PORT)"
|
||||
|
||||
echo ""
|
||||
echo "=== kitty-web is running ==="
|
||||
echo "Direct access: http://$(hostname -I | awk '{print $1}'):$TTYD_PORT"
|
||||
echo ""
|
||||
echo "For reverse proxy setup, see README.md"
|
||||
echo "Send notifications: kitty-notify 'Hello from the terminal!'"
|
||||
Reference in New Issue
Block a user