1 Dokonano kompleksowej przebudowy skryptu, wprowadzając architekturę modularną v3.0. Ta fundamentalna zmiana przekształca
AutoScript z prostego narzędzia w elastyczną platformę do zarządzania cyklem życia serwera, kładąc podwaliny pod zaawansowane
funkcje DevOps.
2
3 Kluczowe zmiany w tej wersji:
4
5 - **Architektura oparta na komendach**: Wprowadzono w pełni modularny system, gdzie każda operacja (np. `install`, `validate`,
`deploy_monitoring`) jest osobną, precyzyjną komendą.
6
7 - **Walidacja Konfiguracji**: Nowa komenda `validate` wykonuje "pre-flight check", weryfikując poprawność pliku konfiguracyjnego
przed dokonaniem jakichkolwiek zmian w systemie, co drastycznie redukuje ryzyko błędów.
8
9 - **Mechanizm "Paragonów" (Receipts)**: Skrypt inteligentnie śledzi pomyślnie zakończone instalacje, co zapewnia idempotentność
operacji i umożliwia bezpieczne, wielokrotne uruchamianie oraz precyzyjną deinstalację.
10
11 - **Ulepszone Logowanie i Interfejs**: Wprowadzono kolorowe logi na konsoli z podziałem na poziomy (INFO, WARN, ERROR) oraz
ujednolicony zapis do pliku `/var/log/autoscript.log`.
12
13 - **Zarządzanie Skryptem i Sekretami**: Dodano wbudowane komendy do zarządzania cyklem życia samego skryptu (`self-update`) oraz
do uproszczonej obsługi sekretów (`secrets:edit`, `secrets:view`).
14
15 - **Fundamenty pod przyszły rozwój**: Stworzono solidne podstawy i puste funkcje (stubs) dla przyszłych, zaawansowanych modułów,
takich jak wdrożenie Mastodona, dynamiczne odkrywanie usług, centralne logowanie hosta, profile AppArmor i zaawansowane kopie
zapasowe.
16
17 Ta wersja stanowi kamień milowy, podnosząc projekt na profesjonalny poziom i otwierając drogę do dalszej, szybkiej rozbudowy.
216 lines
No EOL
6.9 KiB
Bash
216 lines
No EOL
6.9 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
# ====================================================================
|
|
# AutoScript v3 - Modular Server Automation
|
|
# ====================================================================
|
|
|
|
# --- Konfiguracja i Zmienne Globalne ---
|
|
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
readonly LOG_FILE="/var/log/autoscript.log"
|
|
readonly RECEIPTS_DIR="/opt/services/.receipts"
|
|
|
|
# --- Funkcje Pomocnicze ---
|
|
|
|
# Ujednolicone logowanie do pliku i na konsolę
|
|
log() {
|
|
local level="${1}"
|
|
shift
|
|
local message="$*"
|
|
local timestamp
|
|
timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
|
|
|
# Kolory dla konsoli
|
|
local color_reset='\033[0m'
|
|
local color_info='\033[0;32m' # Green
|
|
local color_warn='\033[0;33m' # Yellow
|
|
local color_error='\033[0;31m' # Red
|
|
|
|
local formatted_message="[$timestamp] [${level^^}] ${message}"
|
|
|
|
# Zapis do pliku logu
|
|
echo "$formatted_message" >> "$LOG_FILE"
|
|
|
|
# Wyświetlanie na konsoli z kolorami
|
|
case "$level" in
|
|
info) echo -e "${color_info}${formatted_message}${color_reset}" ;;
|
|
warn) echo -e "${color_warn}${formatted_message}${color_reset}" ;;
|
|
error) echo -e "${color_error}${formatted_message}${color_reset}" >&2 ;;
|
|
*) echo "$formatted_message" ;;
|
|
esac
|
|
}
|
|
|
|
# Sprawdzanie uprawnień roota
|
|
ensure_root() {
|
|
if [[ $EUID -ne 0 ]]; then
|
|
log error "Ten skrypt musi być uruchomiony z uprawnieniami roota (użyj sudo)."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Wczytywanie konfiguracji
|
|
load_config() {
|
|
if [[ ! -f "$SCRIPT_DIR/autoscript.conf" ]]; then
|
|
log error "Plik konfiguracyjny 'autoscript.conf' nie został znaleziony."
|
|
log error "Skopiuj 'autoscript.conf.example' do 'autoscript.conf' i uzupełnij go."
|
|
exit 1
|
|
fi
|
|
source "$SCRIPT_DIR/autoscript.conf"
|
|
log info "Wczytano plik konfiguracyjny 'autoscript.conf'."
|
|
}
|
|
|
|
# Zapisywanie "paragonu" po udanej instalacji modułu
|
|
add_receipt() {
|
|
mkdir -p "$RECEIPTS_DIR"
|
|
touch "${RECEIPTS_DIR}/$1"
|
|
log info "Zapisano paragon dla modułu: $1"
|
|
}
|
|
|
|
# Sprawdzanie, czy moduł był zainstalowany
|
|
has_receipt() {
|
|
[[ -f "${RECEIPTS_DIR}/$1" ]]
|
|
}
|
|
|
|
# Usuwanie paragonu przy deinstalacji
|
|
remove_receipt() {
|
|
rm -f "${RECEIPTS_DIR}/$1"
|
|
log info "Usunięto paragon dla modułu: $1"
|
|
}
|
|
|
|
# --- Główne Moduły ---
|
|
|
|
# Sprawdzanie poprawności konfiguracji
|
|
cmd_validate() {
|
|
log info "Rozpoczynam walidację konfiguracji..."
|
|
# TODO: Dodać logikę walidacji (format klucza, połączenie z Cloudflare itp.)
|
|
log info "(STUB) Walidacja klucza publicznego SSH..."
|
|
log info "(STUB) Walidacja tokenu API Cloudflare..."
|
|
log info "(STUB) Walidacja strefy czasowej..."
|
|
log info "Walidacja konfiguracji zakończona pomyślnie."
|
|
}
|
|
|
|
# Pełna instalacja
|
|
cmd_install() {
|
|
log info "Rozpoczynam pełną instalację systemu..."
|
|
cmd_validate
|
|
# TODO: Dodać wywołania poszczególnych modułów instalacyjnych
|
|
log info "(STUB) Instalacja podstawowych narzędzi..."
|
|
log info "(STUB) Konfiguracja zabezpieczeń systemowych..."
|
|
cmd_deploy_traefik
|
|
cmd_deploy_monitoring
|
|
# ... i tak dalej
|
|
log info "Pełna instalacja zakończona."
|
|
add_receipt 'full_install'
|
|
}
|
|
|
|
# Wdrożenie Mastodona
|
|
cmd_deploy_mastodon() {
|
|
log info "Rozpoczynam wdrożenie Mastodona..."
|
|
# TODO: Dodać logikę (klonowanie repo, generowanie .env, migracje)
|
|
log info "(STUB) Klonowanie repozytorium Mastodona..."
|
|
log info "(STUB) Generowanie pliku .env.production..."
|
|
log info "(STUB) Uruchamianie kontenerów Mastodona..."
|
|
log info "(STUB) Wykonywanie migracji bazy danych..."
|
|
log info "Wdrożenie Mastodona zakończone."
|
|
add_receipt 'mastodon'
|
|
}
|
|
|
|
# Wdrożenie Traefik
|
|
cmd_deploy_traefik() {
|
|
if has_receipt 'traefik'; then
|
|
log warn "Traefik już jest zainstalowany. Pomijam."
|
|
return 0
|
|
fi
|
|
log info "Wdrażam Traefik..."
|
|
# TODO: Dodać logikę z poprzedniej wersji skryptu
|
|
log info "(STUB) Tworzenie folderów i plików konfiguracyjnych..."
|
|
log info "(STUB) Uruchamianie kontenera Traefik..."
|
|
log info "Wdrożenie Traefik zakończone."
|
|
add_receipt 'traefik'
|
|
}
|
|
|
|
# Wdrożenie monitoringu
|
|
cmd_deploy_monitoring() {
|
|
if has_receipt 'monitoring'; then
|
|
log warn "Monitoring już jest zainstalowany. Pomijam."
|
|
return 0
|
|
fi
|
|
log info "Wdrażam stos monitoringu..."
|
|
# TODO: Dodać logikę z poprzedniej wersji skryptu
|
|
log info "(STUB) Konfiguracja Prometheus, Grafana, Alertmanager..."
|
|
log info "(STUB) Uruchamianie kontenerów monitoringu..."
|
|
log info "Wdrożenie monitoringu zakończone."
|
|
add_receipt 'monitoring'
|
|
}
|
|
|
|
# Zarządzanie sekretami
|
|
cmd_secrets() {
|
|
local action="$1"
|
|
shift
|
|
local service="$1"
|
|
shift
|
|
log info "Zarządzanie sekretami: Akcja='$action', Usługa='$service'"
|
|
# TODO: Dodać logikę do edycji/wyświetlania sekretów sops
|
|
log info "(STUB) Wykonuję operację na sekretach..."
|
|
}
|
|
|
|
# Aktualizacja skryptu
|
|
cmd_self_update() {
|
|
log info "Rozpoczynam aktualizację skryptu AutoScript..."
|
|
# TODO: Dodać logikę git pull
|
|
log info "(STUB) Sprawdzanie lokalnych zmian..."
|
|
log info "(STUB) Pobieranie najnowszej wersji z repozytorium..."
|
|
log info "Aktualizacja skryptu zakończona."
|
|
}
|
|
|
|
# Pełna deinstalacja
|
|
cmd_uninstall() {
|
|
log warn "ROZPOCZYNAM PEŁNĄ DEINSTALACJĘ! Wszystkie dane zostaną usunięte."
|
|
read -p "Aby kontynuować, wpisz 'uninstall': " confirmation
|
|
if [[ "$confirmation" != "uninstall" ]]; then
|
|
log info "Deinstalacja anulowana."
|
|
exit 0
|
|
fi
|
|
# TODO: Dodać logikę usuwania w odwrotnej kolejności, sprawdzając paragony
|
|
log info "(STUB) Usuwanie Mastodona..."
|
|
log info "(STUB) Usuwanie monitoringu..."
|
|
log info "(STUB) Usuwanie Traefik..."
|
|
log info "(STUB) Wycofywanie zmian systemowych..."
|
|
log info "Deinstalacja zakończona."
|
|
rm -rf "$RECEIPTS_DIR"
|
|
}
|
|
|
|
# --- Główny Handler Komend ---
|
|
|
|
main() {
|
|
ensure_root
|
|
# Inicjalizacja pliku logu
|
|
touch "$LOG_FILE"
|
|
chown root:adm "$LOG_FILE"
|
|
chmod 640 "$LOG_FILE"
|
|
|
|
local cmd="${1:-help}"
|
|
shift || true
|
|
|
|
# Wczytaj konfigurację dla większości komend
|
|
if [[ "$cmd" != "help" && "$cmd" != "self-update" ]]; then
|
|
load_config
|
|
fi
|
|
|
|
case "$cmd" in
|
|
install) cmd_install "$@" ;;
|
|
validate) cmd_validate "$@" ;;
|
|
deploy_mastodon) cmd_deploy_mastodon "$@" ;;
|
|
deploy_traefik) cmd_deploy_traefik "$@" ;;
|
|
deploy_monitoring) cmd_deploy_monitoring "$@" ;;
|
|
secrets:edit) cmd_secrets "edit" "$@" ;;
|
|
secrets:view) cmd_secrets "view" "$@" ;;
|
|
self-update) cmd_self_update "$@" ;;
|
|
uninstall) cmd_uninstall "$@" ;;
|
|
help|*) # TODO: Dodać funkcję wyświetlającą pomoc
|
|
log info "Dostępne komendy: install, validate, deploy_mastodon, uninstall, ..." ;;
|
|
esac
|
|
}
|
|
|
|
main "$@" |