144 lines
5.6 KiB
Bash
Executable File
144 lines
5.6 KiB
Bash
Executable File
#!/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:-<ip-vps>}: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
|