#!/usr/bin/env bash # # fedora-server — provisioner Fedora untuk server container: # podman + podman-compose + Cockpit (cockpit-podman) + pendukung. # # Pakai: # curl -fsSL https://gitea.oxpoe.qzz.io/oxpoe/fedora-server/raw/branch/main/install.sh | sudo bash # # Opsi: # --update jalankan `dnf upgrade` dulu (default: tidak) # --with-docker-shim pasang podman-docker (perintah `docker` -> podman) # --with-tui pasang podman-tui (TUI di terminal) # --no-cockpit tanpa Cockpit (podman saja) # --admin-user NAME buat user (grup wheel) untuk login ke Cockpit # --uninstall lepas paket & service yang dipasang skrip ini # -h, --help bantuan ini # # Idempotent: aman dijalankan berulang. set -euo pipefail BLUE='\033[1;34m'; YEL='\033[1;33m'; RED='\033[1;31m'; GRN='\033[1;32m'; NC='\033[0m' log() { printf "${BLUE}==>${NC} %s\n" "$*"; } ok() { printf "${GRN} +${NC} %s\n" "$*"; } warn() { printf "${YEL} !${NC} %s\n" "$*"; } die() { printf "${RED} x${NC} %s\n" "$*" >&2; exit 1; } UPDATE=0 WITH_DOCKER=0 WITH_TUI=0 WITH_COCKPIT=1 ADMIN_USER="" UNINSTALL=0 while [ $# -gt 0 ]; do case "$1" in --update) UPDATE=1 ;; --with-docker-shim) WITH_DOCKER=1 ;; --with-tui) WITH_TUI=1 ;; --no-cockpit) WITH_COCKPIT=0 ;; --admin-user) shift; ADMIN_USER="${1:?--admin-user butuh nama}";; --uninstall) UNINSTALL=1 ;; -h|--help) sed -n '2,18p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; *) die "opsi tak dikenal: $1" ;; esac shift done [ "${EUID:-$(id -u)}" -eq 0 ] || die "Jalankan sebagai root: ... | sudo bash" command -v dnf >/dev/null 2>&1 || die "Ini bukan sistem berbasis dnf (Fedora/RHEL)." CORE=(podman podman-compose buildah skopeo git jq) COCKPIT=(cockpit cockpit-podman cockpit-storaged cockpit-networkmanager) SELTOOLS=(policycoreutils-python-utils) # ---------------------------------------------------------------- uninstall if [ "$UNINSTALL" = 1 ]; then log "Melepas service" systemctl disable --now cockpit.socket 2>/dev/null || true systemctl disable --now podman.socket 2>/dev/null || true systemctl disable podman-restart.service 2>/dev/null || true log "Menghapus paket yang dipasang skrip ini" dnf remove -y "${COCKPIT[@]}" podman-tui podman-docker buildah skopeo "${SELTOOLS[@]}" 2>/dev/null || true warn "podman & data container TIDAK dihapus otomatis." warn "Kalau mau benar-benar bersih: dnf remove -y podman && rm -rf /var/lib/containers" ok "Selesai." exit 0 fi # ---------------------------------------------------------------- update if [ "$UPDATE" = 1 ]; then log "Update paket (dnf upgrade)" dnf upgrade -y --refresh fi # ---------------------------------------------------------------- install log "Memasang inti: podman + podman-compose + buildah/skopeo" dnf install -y "${CORE[@]}" log "Memasang alat SELinux (troubleshooting :z/:Z)" dnf install -y "${SELTOOLS[@]}" || warn "policycoreutils-python-utils gagal (lanjut)" if [ "$WITH_COCKPIT" = 1 ]; then log "Memasang Cockpit (podman, storage, network)" dnf install -y "${COCKPIT[@]}" || { warn "modul Cockpit sebagian gagal, coba versi minimal"; dnf install -y cockpit cockpit-podman; } fi if [ "$WITH_DOCKER" = 1 ]; then log "Memasang shim podman-docker (perintah 'docker' -> podman)" dnf install -y podman-docker fi if [ "$WITH_TUI" = 1 ]; then log "Memasang podman-tui" dnf install -y podman-tui fi # ---------------------------------------------------------------- services log "Mengaktifkan service" systemctl enable --now podman.socket systemctl enable podman-restart.service # container ber-restart policy naik saat boot if [ "$WITH_COCKPIT" = 1 ]; then systemctl enable --now cockpit.socket fi if systemctl is-active --quiet firewalld; then log "Firewall: buka Cockpit" firewall-cmd --permanent --add-service=cockpit >/dev/null firewall-cmd --reload >/dev/null ok "firewalld: service 'cockpit' dibuka" else warn "firewalld tidak aktif — dilewati (perlu dibuka manual bila nanti diaktifkan)" fi # ---------------------------------------------------------------- admin user if [ -n "$ADMIN_USER" ]; then log "Menyiapkan user admin untuk Cockpit: $ADMIN_USER" id "$ADMIN_USER" >/dev/null 2>&1 || useradd -m "$ADMIN_USER" usermod -aG wheel "$ADMIN_USER" warn "Set password untuk $ADMIN_USER (dipakai login Cockpit):" passwd "$ADMIN_USER" || warn "gagal set password — jalankan manual: passwd $ADMIN_USER" fi # ---------------------------------------------------------------- ringkasan IP="$(hostname -I 2>/dev/null | awk '{print $1}')" VER_PODMAN="$(rpm -q --qf '%{VERSION}' podman 2>/dev/null || echo '-')" VER_PCOMPOSE="$(rpm -q --qf '%{VERSION}' podman-compose 2>/dev/null || echo '-')" printf '\n%s\n' "$(printf "${GRN}==>${NC} Selesai. Fedora siap jadi server container.")" printf ' %-18s %s\n' "podman" "$VER_PODMAN" printf ' %-18s %s\n' "podman-compose" "$VER_PCOMPOSE" printf ' %-18s %s\n' "podman.socket" "$(systemctl is-enabled podman.socket 2>/dev/null || echo off)" printf ' %-18s %s\n' "podman-restart" "$(systemctl is-enabled podman-restart.service 2>/dev/null || echo off)" if [ "$WITH_COCKPIT" = 1 ]; then printf ' %-18s %s\n' "Cockpit" "https://${IP:-}:9090" warn "Cockpit butuh login user + PASSWORD. Cloud image sering key-only (belum ada)." warn "Kalau belum ada user berpassword: useradd -m admin && passwd admin (login pakai 'admin')" fi cat <<'EOF' Coba cepat: podman run --rm docker.io/alpine echo "podman jalan" Jalankan stack compose: cd /path/berisi/compose.yaml && podman compose up -d EOF