#!/usr/bin/env bash source <(curl -fsSL https://git.inbox.sk/proxmox/Ubuntu24_LXC/raw/branch/main/misc/build.func) # Vlastný skript pre Ubuntu 24.04 LXC kontajner # Zdroj: https://git.inbox.sk/proxmox/Ubuntu24_LXC APP="Ubuntu" var_tags="${var_tags:-os}" var_cpu="${var_cpu:-4}" var_ram="${var_ram:-4096}" var_disk="${var_disk:-32}" var_os="${var_os:-ubuntu}" var_version="${var_version:-24.04}" var_unprivileged="${var_unprivileged:-1}" # URL pre stiahnutie konfigurácie USERS_JSON_URL="https://git.inbox.sk/proxmox/Ubuntu24_LXC/raw/branch/main/config/users.json" CLAUDE_SETUP_URL="https://git.inbox.sk/proxmox/Ubuntu24_LXC/raw/branch/main/config/claude-setup.md" header_info "$APP" variables color catch_errors # ============================================================================= # update_script() - aktualizácia existujúceho kontajnera # ============================================================================= function update_script() { header_info check_container_storage check_container_resources if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!" exit fi msg_info "Updating ${APP} LXC" $STD apt-get update $STD apt-get -y upgrade msg_ok "Updated ${APP} LXC" msg_ok "Updated successfully!" exit } # ============================================================================= # simple_install() - zjednodušená inštalácia s výberom užívateľov # ============================================================================= simple_install() { pve_check shell_check root_check arch_check NEXTID=$(pvesh get /cluster/nextid) # Timezone if command -v timedatectl >/dev/null 2>&1; then timezone=$(timedatectl show --value --property=Timezone 2>/dev/null || echo "UTC") elif [ -f /etc/timezone ]; then timezone=$(cat /etc/timezone) else timezone="UTC" fi header_info # Stiahni users.json dopredu (len raz) msg_info "Sťahujem zoznam užívateľov" local users_json users_json=$(curl -fsSL "$USERS_JSON_URL") || { msg_error "Nepodarilo sa stiahnuť users.json" exit 1 } msg_ok "Zoznam užívateľov stiahnutý" # Parsovanie užívateľov bez jq local usernames=() local key_counts=() while IFS= read -r uname; do [[ -n "$uname" ]] && usernames+=("$uname") done < <(echo "$users_json" | grep '"username"' | sed 's/.*"username"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') for uname in "${usernames[@]}"; do local kc kc=$(echo "$users_json" | sed -n "/$uname/,/\]/p" | grep 'ssh-' | wc -l) key_counts+=("$kc") done local user_count=${#usernames[@]} # Predvolené hodnoty pre wizard local _ct_name="Ubuntu" local _hn="" local _ip_input="" local _gate="" local _dns="8.8.8.8 1.1.1.1" local _disk="$var_disk" local _ram="$var_ram" local _cpu="$var_cpu" local _selected_users="" local MAX_STEP=9 # Wizard so spätnou navigáciou local STEP=1 while true; do case $STEP in # --- KROK 1: Názov kontajnera --- 1) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "NÁZOV KONTAJNERA" \ --ok-button "Ďalej" --cancel-button "Zrušiť" \ --inputbox "\nZadaj názov kontajnera (zobrazí sa v Proxmoxe):" 10 58 "$_ct_name" \ 3>&1 1>&2 2>&3); then [[ -n "$result" ]] && _ct_name="$result" # Predvyplň hostname z názvu ak ešte nebol zadaný [[ -z "$_hn" ]] && _hn=$(echo "${_ct_name,,}" | tr -d ' ' | sed 's/[^a-z0-9-]/-/g; s/^-*//; s/-*$//') ((STEP++)) else exit_script fi ;; # --- KROK 2: Hostname --- 2) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "HOSTNAME" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nHostname kontajnera (malé písmená, čísla, pomlčky):" 10 58 "$_hn" \ 3>&1 1>&2 2>&3); then if [[ -n "$result" ]]; then _hn=$(echo "${result,,}" | tr -d ' ' | sed 's/[^a-z0-9-]/-/g; s/^-*//; s/-*$//') fi ((STEP++)) else ((STEP--)) fi ;; # --- KROK 3: IP adresa + gateway --- 3) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "IP ADRESA" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nZadaj statickú IP adresu s maskou\n(napr. 192.168.1.100/24)\n\nAlebo nechaj prázdne pre DHCP:" 12 58 "$_ip_input" \ 3>&1 1>&2 2>&3); then _ip_input="$result" if [[ -n "$_ip_input" ]]; then local default_gw default_gw=$(echo "$_ip_input" | cut -d'/' -f1 | sed 's/\.[0-9]*$/.1/') [[ -z "$_gate" ]] && _gate="$default_gw" if gw_result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "GATEWAY" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nZadaj gateway:" 10 58 "$_gate" \ 3>&1 1>&2 2>&3); then _gate="$gw_result" [[ -z "$_gate" ]] && _gate="$default_gw" ((STEP++)) else continue fi else _gate="" ((STEP++)) fi else ((STEP--)) fi ;; # --- KROK 4: DNS --- 4) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "DNS SERVERY" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nZadaj DNS servery (oddelené medzerou):" 10 58 "$_dns" \ 3>&1 1>&2 2>&3); then [[ -n "$result" ]] && _dns="$result" ((STEP++)) else ((STEP--)) fi ;; # --- KROK 5: Disk --- 5) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "DISK" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nVeľkosť disku v GB:" 10 58 "$_disk" \ 3>&1 1>&2 2>&3); then [[ -n "$result" ]] && _disk="$result" ((STEP++)) else ((STEP--)) fi ;; # --- KROK 6: RAM --- 6) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "RAM" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nVeľkosť RAM v MB:" 10 58 "$_ram" \ 3>&1 1>&2 2>&3); then [[ -n "$result" ]] && _ram="$result" ((STEP++)) else ((STEP--)) fi ;; # --- KROK 7: CPU --- 7) if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "CPU" \ --ok-button "Ďalej" --cancel-button "Späť" \ --inputbox "\nPočet CPU jadier:" 10 58 "$_cpu" \ 3>&1 1>&2 2>&3); then [[ -n "$result" ]] && _cpu="$result" ((STEP++)) else ((STEP--)) fi ;; # --- KROK 8: Výber užívateľov --- 8) if [[ "$user_count" -eq 0 ]]; then _selected_users="" ((STEP++)) else local checklist_args=() for i in $(seq 0 $((user_count - 1))); do checklist_args+=("${usernames[$i]}" "${key_counts[$i]} SSH kľúč(ov)" "ON") done if result=$(whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "UŽÍVATELIA" \ --ok-button "Ďalej" --cancel-button "Späť" \ --checklist "\nVyber užívateľov na vytvorenie:\n(SPACE = zaškrtni, ENTER = potvrď)" \ $((user_count + 10)) 58 "$user_count" \ "${checklist_args[@]}" \ 3>&1 1>&2 2>&3); then _selected_users="$result" ((STEP++)) else ((STEP--)) fi fi ;; # --- KROK 9: Potvrdenie --- 9) local _net_display="dhcp" [[ -n "$_ip_input" ]] && _net_display="$_ip_input" local confirm_text="Názov: $_ct_name\n" confirm_text+="Hostname: $_hn\n" confirm_text+="IP: $_net_display\n" [[ -n "$_gate" ]] && confirm_text+="Gateway: $_gate\n" confirm_text+="DNS: $_dns\n" confirm_text+="Disk: ${_disk}GB\n" confirm_text+="RAM: ${_ram}MB\n" confirm_text+="CPU: ${_cpu} jadier\n" [[ -n "$_selected_users" ]] && confirm_text+="Užívatelia: $_selected_users\n" if whiptail --backtitle "Ubuntu LXC Setup [Krok $STEP/$MAX_STEP]" \ --title "POTVRDENIE" \ --ok-button "Inštalovať" --cancel-button "Späť" \ --yesno "$confirm_text\nPokračovať s inštaláciou?" 20 58; then break else ((STEP--)) fi ;; esac done # Nastavenie premenných z wizardu HN="$_hn" APP_DISPLAY_NAME="$_ct_name" if [[ -n "$_ip_input" ]]; then NET="$_ip_input" GATE="$_gate" else NET="dhcp" GATE="" fi # Proxmox pct: viac DNS oddelených medzerou — použijeme len prvý local _first_dns _first_dns=$(echo "$_dns" | awk '{print $1}') NS="-nameserver=${_first_dns}" DISK_SIZE="$_disk" RAM_SIZE="$_ram" CORE_COUNT="$_cpu" SELECTED_USERS="$_selected_users" # Export pre install skript export SELECTED_USERS export USERS_JSON="$users_json" export CLAUDE_SETUP_URL export CUSTOM_DNS="$_dns" # --- Nastavenie premenných pre build_container --- CT_TYPE="$var_unprivileged" CT_ID="$NEXTID" BRG="${var_brg:-vmbr0}" MAC="" VLAN="" MTU="" SD="" IPV6_METHOD="auto" IPV6_ADDR="" IPV6_GATE="" SSH="no" SSH_AUTHORIZED_KEY="" APT_CACHER="" APT_CACHER_IP="" ENABLE_FUSE="no" ENABLE_TUN="no" ENABLE_GPU="no" ENABLE_NESTING="1" ENABLE_KEYCTL="0" ENABLE_MKNOD="0" PROTECT_CT="no" CT_TIMEZONE="$timezone" TAGS="community-script;${var_tags:-}" PW="" VERBOSE="no" METHOD="simple" DIAGNOSTICS="no" } # Spustenie simple_install build_container description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"