#!/usr/bin/env bash set -euo pipefail # --- Kolory do logowania --- GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' # No Color log() { echo -e "${GREEN}[INFO]${NC} $1"; } err() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; } # --- Sprawdzenie uprawnień roota --- if [[ $EUID -ne 0 ]]; then err "Ten skrypt wymaga uprawnień roota. Uruchom z sudo." fi # --- 1. Wykrycie menedżera pakietów (apt / dnf) --- if command -v apt-get &>/dev/null; then PKG_MGR="apt-get" PKG_UPDATE="apt-get update -y" PKG_INSTALL="apt-get install -y" elif command -v dnf &>/dev/null; then PKG_MGR="dnf" PKG_UPDATE="dnf check-update || true" PKG_INSTALL="dnf install -y" else err "Nie znaleziono obsługiwanego menedżera pakietów (apt/dnf)." fi log "Wykryto menedżer pakietów: $PKG_MGR" $PKG_UPDATE # --- 2. Instalacja python3, curl, unzip --- log "Instalacja python3, curl, unzip..." $PKG_INSTALL python3 python3-pip curl unzip $PKG_INSTALL python3-venv || true # --- 3. Instalacja Dockera (jeśli nie zainstalowany) --- if command -v docker &>/dev/null; then log "Docker już zainstalowany — pomijam." else log "Instalacja Dockera..." curl -fsSL https://get.docker.com | bash systemctl enable --now docker log "Docker zainstalowany i uruchomiony." fi # --- 4. Utworzenie użytkownika 'karl' --- if id "karl" &>/dev/null; then log "Użytkownik 'karl' już istnieje — pomijam." else log "Tworzenie użytkownika 'karl'..." useradd -m -s /bin/bash karl fi # --- 5. Dodanie 'karl' do grupy 'docker' --- log "Dodawanie użytkownika 'karl' do grupy 'docker'..." usermod -aG docker karl # --- 6. Pobranie i rozpakowanie archiwum --- APP_URL="${1:?Podaj URL archiwum ZIP jako pierwszy argument}" APP_DIR="/home/karl/app" # --- Backup i czyszczenie istniejącego katalogu --- if [[ -d "$APP_DIR" ]] && [[ -n "$(ls -A "$APP_DIR" 2>/dev/null)" ]]; then log "Katalog $APP_DIR istnieje i nie jest pusty — tworzenie backupu..." CONFIG_DIR="$APP_DIR/config" if [[ -d "$CONFIG_DIR" ]]; then BACKUP_DIR="/home/karl/backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_PATH="$BACKUP_DIR/config_backup_$TIMESTAMP" mkdir -p "$BACKUP_DIR" cp -r "$CONFIG_DIR" "$BACKUP_PATH" chown -R karl:karl "$BACKUP_DIR" log "Backup utworzony: $BACKUP_PATH" else log "Katalog config nie istnieje — pomijam backup." fi log "Usuwanie katalogu $APP_DIR..." rm -rf "$APP_DIR" log "Katalog $APP_DIR usunięty." fi # --- Instalacja / aktualizacja --- log "Pobieranie archiwum z: $APP_URL" mkdir -p "$APP_DIR" TMPZIP=$(mktemp /tmp/karl-app-XXXXXX.zip) curl -fSL -o "$TMPZIP" "$APP_URL" unzip -o "$TMPZIP" -d "$APP_DIR" rm -f "$TMPZIP" chown -R karl:karl "$APP_DIR" log "Aplikacja rozpakowana do $APP_DIR" # --- 7. Sprawdzenie / instalacja uv --- if command -v uv &>/dev/null; then log "uv już zainstalowane." else log "Instalacja uv..." pip3 install uv fi # --- 8. Synchronizacja zależności (uv sync) --- log "Uruchamianie 'uv sync' w katalogu aplikacji..." cd "$APP_DIR" sudo -u karl uv sync # --- 9. Kopiowanie pliku usługi systemd --- SERVICE_SRC="$(dirname "$(realpath "$0")")/karl.service" SERVICE_DST="/etc/systemd/system/karl.service" if [[ ! -f "$SERVICE_SRC" ]]; then err "Nie znaleziono pliku $SERVICE_SRC" fi log "Kopiowanie $SERVICE_SRC -> $SERVICE_DST" cp "$SERVICE_SRC" "$SERVICE_DST" chmod 644 "$SERVICE_DST" # --- 10. Przeładowanie systemctl i uruchomienie usługi --- log "Przeładowanie systemd i włączanie usługi karl..." systemctl daemon-reload systemctl enable karl.service systemctl start karl.service log "Instalacja zakończona pomyślnie! ✅"