HestiaCP menyediakan penyebaran otomatis skrip Adminer dengan sekali klik (termasuk otentikasi Nginx + perlindungan ganda Fail2Ban).

Hentikan instalasi Adminer secara manual! Satu skrip dapat menangani seluruh konfigurasi keamanan.

Beberapa hari yang lalu, seorang teman saya, yang juga bekerja di bidang administrasi sistem, mengeluh kepada saya bahwa ia menghabiskan sebagian besar waktunya seharian untuk menginstal Adminer di servernya. Bukannya Adminer itu sendiri sulit diinstal; itu hanya file PHP, Anda tinggal memasukkannya dan akan berfungsi. Tetapi masalahnya adalah, Anda tidak bisa hanya memasukkan file PHP dan selesai begitu saja.

Anda perlu mengkonfigurasi subdomain, memuat plugin, menyiapkan otentikasi Nginx, dan mengkonfigurasi Fail2Ban untuk mencegah serangan brute-force. Setiap langkah tidak rumit, tetapi secara keseluruhan membentuk sekumpulan perintah dan file konfigurasi yang terfragmentasi.

Yang lebih menjengkelkan lagi adalah konfigurasi terkait keamanan seperti otentikasi dan firewall sangat rentan terhadap kesalahan. Kelalaian kecil dapat mengekspos antarmuka manajemen basis data ke internet publik, sehingga dapat diakses oleh siapa pun.

Saat itu saya tertawa karena saya pernah melakukan hal yang sama sebelumnya. Belakangan, saya tidak tahan lagi, jadi saya menulis skrip penyebaran sekali klik untuk mengotomatiskan semua langkah ini.

HestiaCP menyediakan penyebaran otomatis skrip Adminer dengan sekali klik (termasuk otentikasi Nginx + perlindungan ganda Fail2Ban).

Mengapa tidak menggunakanphpMyAdmin

Anda mungkin bertanya, mengapa tidak menggunakan phpMyAdmin, yang lebih umum digunakan?

Memang benar, phpMyAdmin memiliki lebih banyak pengguna dan komunitas yang lebih besar. Tetapi menurut saya Adminer melakukan pekerjaan yang lebih baik di beberapa area.

Pertama, Adminer ringan; hanya berupa satu file PHP, sedangkan phpMyAdmin terdiri dari banyak file. Kedua, Adminer aman; filosofi desain Adminer adalah "tidak tepercaya secara default," yang berarti Anda perlu mengkonfigurasi informasi koneksi secara eksplisit untuk mengoperasikan basis data.

Aspek lainnya adalah performa; Adminer secara signifikan lebih cepat daripada phpMyAdmin saat menangani basis data besar.

Tentu saja, tidak satu pun dari hal-hal ini yang paling penting. Yang paling penting adalah skrip ini berarti saya tidak perlu lagi mengkonfigurasi hal-hal terkait keamanan secara manual.

Apa sebenarnya fungsi skrip tersebut?

Ide di balik skrip ini sebenarnya cukup sederhana: untuk mengotomatiskan semua langkah yang biasanya Anda lakukan secara manual.

Untuk input interaktif, skrip akan menanyakan beberapa pertanyaan kepada Anda: nama pengguna HestiaCP , nama domain, nama pengguna autentikasi, dan kata sandi. Anda hanya perlu memasukkan informasi ini, dan skrip akan menangani sisanya.

Skrip ini secara otomatis membuat direktori root web, memeriksa apakah apache2-utils (yang digunakan untuk menghasilkan file kata sandi) dan lingkungan PHP sudah terinstal, serta menangani pembuatan direktori dan instalasi dependensi.

Saat mengunduh Adminer, skrip pertama-tama mencoba mengunduh versi terbaru dari repositori resmi. Jika repositori resmi tidak tersedia, skrip secara otomatis beralih ke repositori GitHub Releases yang stabil. Saya rasa ini cukup penting, karena repositori resmi terkadang tidak stabil; saya pernah mengalami masalah waktu habis koneksi sebelumnya.

Terkait pengunduhan plugin, skrip akan mengunduh tiga plugin inti: plugin.php adalah pemuat plugin, fc-sqlite-connection-without-credentials.php digunakan untuk menangani koneksi tanpa kata sandi, dan login-password-less.php mendukung login dengan hash kata sandi.

Mengenai pembuatan hash kata sandi dan index.php, ada detail kecil: skrip menggunakan getenv() untuk mengambil kata sandi alih-alih langsung menggunakan $_ENV. Ini menghindari masalah konfigurasi php.ini yang menyebabkan perhitungan hash menjadi kosong. Saya sendiri pernah mengalami masalah ini dan menghabiskan waktu lama untuk mencari tahu bahwa cakupan 'E' tidak diaktifkan di php.ini.

Untuk mengkonfigurasi otentikasi Nginx, skrip ini menggunakan mekanisme include bawaan HestiaCP alih-alih memodifikasi langsung file konfigurasi utama Nginx. Keuntungan dari pendekatan ini adalah otentikasi tidak akan gagal meskipun Anda membangun ulang konfigurasi domain.

Dalam konfigurasi Fail2Ban, skrip membuat aturan penyaringan untuk memantau kesalahan 401. Jika sebuah IP gagal masuk sebanyak 3 kali dalam 10 menit, IP tersebut akan diblokir selama 1 jam.

Terkait perbaikan izin dan pemuatan ulang layanan, skrip akan secara otomatis mengatur izin file yang benar dan memuat ulang PHP-FPM, Nginx, dan Fail2Ban.

Saya serius soal keselamatan.

Sejujurnya, keamanan alat manajemen basis data adalah hal yang paling saya pedulikan.

Bayangkan, admin dapat langsung memanipulasi semua basis data di server Anda. Jika basis data tersebut terekspos ke internet publik dan seseorang memindainya, konsekuensinya akan tak terbayangkan.

Skrip ini memiliki perlindungan tiga lapis.

Lapisan pertama adalah Otentikasi Dasar HTTP Nginx. Saat Anda mengakses Adminer, browser Anda akan menampilkan kotak dialog yang meminta Anda untuk memasukkan nama pengguna dan kata sandi Anda. Hanya setelah memasukkan informasi yang benar, Anda dapat melihat halaman login Adminer.

Lapisan kedua adalah login hash kata sandi Admin sendiri. Saya mengkonfigurasi hashing kata sandi di index.php, jadi meskipun seseorang melewati otentikasi Nginx, mereka tidak akan mengetahui kata sandi login Admin.

Lapisan ketiga adalah perlindungan brute-force dari Fail2Ban. Jika seseorang mencoba melakukan serangan brute-force terhadap kata sandi Anda, Fail2Ban akan secara otomatis memblokir alamat IP mereka.

Dengan kombinasi ketiga lapisan perlindungan ini, Anda pada dasarnya dapat menempatkan Administrator di internet publik dengan tenang.

Pengoperasian sekali klik, benar-benar hanya sekali klik.

Proses penyebarannya sangat sederhana.

#!/bin/bash
# ==============================================================================
# Adminer + 插件 + Nginx Auth + Fail2Ban 一键自动化部署脚本 (HestiaCP 完美版)
# ==============================================================================

set -e

# 必须以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo "❌ 错误:请使用 root 或 sudo 运行此脚本!"
exit 1
fi

# ------------------------------------------------------------------------------
# 1. 交互式输入配置参数
# ------------------------------------------------------------------------------
read -p "请输入 HestiaCP 用户名 [默认: admin]: " HESTIA_USER
HESTIA_USER=${HESTIA_USER:-admin}

read -p "请输入 Adminer 部署域名 [例如: adminer.example.com]: " DOMAIN
if [ -z "$DOMAIN" ]; then
echo "❌ 错误:域名不能为空!"
exit 1
fi

read -p "请输入 Nginx 网页认证用户名 [默认: adminuser]: " AUTH_USER
AUTH_USER=${AUTH_USER:-adminuser}

read -sp "请输入防护密码 (用于 Nginx 认证与 Adminer 登录): " AUTH_PASS
echo ""
if [ -z "$AUTH_PASS" ]; then
echo "❌ 错误:密码不能为空!"
exit 1
fi

# 核心路径变量定义
WEBROOT="/home/$HESTIA_USER/web/$DOMAIN/public_html"
ADMINER_FILE="$WEBROOT/adminer.php"
PLUGIN_DIR="$WEBROOT/plugins"
HTPASSWD_FILE="/etc/nginx/.htpasswd-$DOMAIN"

echo -e "\n🚀 开始部署 Adminer 到域名: $DOMAIN ..."

# ------------------------------------------------------------------------------
# 2. 创建目录与安装基础依赖
# ------------------------------------------------------------------------------
if [ ! -d "$WEBROOT" ]; then
echo "📁 创建 Web 根目录: $WEBROOT"
mkdir -p "$WEBROOT"
fi
mkdir -p "$PLUGIN_DIR"

echo "🔍 检查基础依赖环境..."
if ! command -v htpasswd >/dev/null 2>&1; then
echo "📦 安装 apache2-utils 工具包..."
apt-get update -qq && apt-get install -y -qq apache2-utils
fi

if ! command -v php >/dev/null 2>&1; then
echo "❌ 错误:未检测到系统的 PHP 环境!"
exit 1
fi

# ------------------------------------------------------------------------------
# 3. 安全下载 Adminer 核心程序
# ------------------------------------------------------------------------------
echo "📥 正在下载最新版 Adminer..."
curl -sL -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-o "$ADMINER_FILE" "https://www.adminer.org/latest.php"

# 校验下载有效性
if ! grep -q "<?php" "$ADMINER_FILE"; then
echo "⚠️ 官方源连接异常,正在切换至 GitHub Releases 稳定源..."
curl -sL -o "$ADMINER_FILE" \
"https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1.php"
fi

# ------------------------------------------------------------------------------
# 4. 下载官方核心插件与加载器
# ------------------------------------------------------------------------------
echo "🧩 正在下载插件组件..."
curl -sL -o "$PLUGIN_DIR/plugin.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/plugin.php

curl -sL -o "$PLUGIN_DIR/fc-sqlite-connection-without-credentials.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/fc-sqlite-connection-without-credentials.php

curl -sL -o "$PLUGIN_DIR/login-password-less.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/login-password-less.php

# ------------------------------------------------------------------------------
# 5. 安全生成密码 Hash 并构建入口文件 index.php
# ------------------------------------------------------------------------------
echo "⚙️ 生成密码 Hash 与 index.php 配置..."
# 使用 getenv() 替代 $_ENV,防止 php.ini 未开启 E 作用域导致 Hash 计算为空
HASHED_PASSWORD=$(AUTH_PASS="$AUTH_PASS" php -r 'echo password_hash(getenv("AUTH_PASS"), PASSWORD_DEFAULT);')

cat > "$WEBROOT/index.php" <<EOF
<?php
function adminer_object() {
include_once "./plugins/plugin.php";
include_once "./plugins/fc-sqlite-connection-without-credentials.php";
include_once "./plugins/login-password-less.php";

return new AdminerPlugin([
new AdminerFCSqliteConnectionWithoutCredentials(),
new AdminerLoginPasswordLess('$HASHED_PASSWORD'),
]);
}
include "./adminer.php";
EOF

# ------------------------------------------------------------------------------
# 6. 配置 Nginx 基础认证 (完全依赖 HestiaCP 原生 Include 机制)
# ------------------------------------------------------------------------------
echo "🔒 配置 Nginx HTTP Basic Auth..."
htpasswd -b -c "$HTPASSWD_FILE" "$AUTH_USER" "$AUTH_PASS"
chmod 644 "$HTPASSWD_FILE"

HESTIA_CONF_DIR="/home/$HESTIA_USER/conf/web/$DOMAIN"
if [ -d "$HESTIA_CONF_DIR" ]; then
# HestiaCP 原生包含文件名格式:nginx.conf_* 与 nginx.ssl.conf_*
# 这样无需 sed 修改主配置文件,重建域名配置时也不会失效
cat > "$HESTIA_CONF_DIR/nginx.conf_adminer" <<EOF
auth_basic "Restricted Adminer Access";
auth_basic_user_file $HTPASSWD_FILE;
EOF

cat > "$HESTIA_CONF_DIR/nginx.ssl.conf_adminer" <<EOF
auth_basic "Restricted Adminer Access";
auth_basic_user_file $HTPASSWD_FILE;
EOF
fi

# ------------------------------------------------------------------------------
# 7. 配置 Fail2Ban 防护规则
# ------------------------------------------------------------------------------
echo "🛡️ 配置 Fail2Ban 规则..."
cat > /etc/fail2ban/filter.d/nginx-adminer.conf <<'EOF'
[Definition]
failregex = ^<HOST> - .* "GET /.* HTTP/.*" 401
ignoreregex =
EOF

cat > /etc/fail2ban/jail.d/nginx-adminer.conf <<EOF
[nginx-adminer]
enabled = true
filter = nginx-adminer
port = http,https
logpath = /var/log/nginx/domains/$DOMAIN.log
maxretry = 3
findtime = 600
bantime = 3600
EOF

# ------------------------------------------------------------------------------
# 8. 修复权限、刷新缓存与重载服务
# ------------------------------------------------------------------------------
echo "🧹 修复权限并重载服务..."
chown -R $HESTIA_USER:$HESTIA_USER "$WEBROOT"
find "$WEBROOT" -type d -exec chmod 755 {} +
find "$WEBROOT" -type f -exec chmod 644 {} +

# 平滑重载 PHP-FPM(兼容多版本 PHP 环境)
for service in $(systemctl list-units --type=service --state=running --no-legend | awk '{print $1}' | grep -E 'php.*fpm'); do
systemctl reload "$service" || true
done

# 重载 Web 与防护服务
nginx -t && systemctl reload nginx
if systemctl is-active --quiet fail2ban; then
systemctl restart fail2ban
fi

echo -e "\n=================================================="
echo -e "✅ Adminer 一键部署成功!"
echo -e "--------------------------------------------------"
echo -e "🌐 访问地址 : https://$DOMAIN/index.php"
echo -e "👤 Nginx 认证账号 : $AUTH_USER"
echo -e "🔑 Nginx 认证密码 : [你输入的防护密码]"
echo -e "--------------------------------------------------"
echo -e "💡 Adminer 登录说明:"
echo -e " 数据库用户名填写:root(或你的数据库账号)"
echo -e " 数据库密码填写:[你输入的防护密码]"
echo -e "=================================================="

Cara menjalankan skrip: Berikan izin eksekusi pada skrip:

sudo chmod +x /usr/local/bin/deploy-adminer.sh 

Jalankan skrip menggunakan sudo:

sudo /usr/local/bin/deploy-adminer.sh 

Masukkan informasi konfigurasi seperti yang diminta:

  • Masukkan nama pengguna HestiaCP Anda (misalnya, admin).
  • Masukkan subdomain lengkap yang telah disiapkan (misalnya, adminer.example.com).
  • Masukkan kata sandi keamanan Anda (misalnya, MySuperPassword123)

Skrip ini akan secara otomatis menyelesaikan seluruh proses konfigurasi tanpa melewatkan apa pun.

Seluruh proses memakan waktu sekitar satu atau dua menit. Skrip akan menangani semuanya secara otomatis, dan Anda tidak perlu menjalankan perintah apa pun secara manual.

Setelah selesai, Anda dapat mengakses Adminer melalui https://yourdomain/index.php

Beberapa pertanyaan yang mungkin membuat Anda khawatir

Beberapa teman mungkin bertanya, apakah skrip ini mendukung berbagai versi PHP?

Ya, fitur ini didukung. Skrip akan secara otomatis mendeteksi semua layanan PHP-FPM yang berjalan di sistem dan memuat ulang layanan tersebut satu per satu. Jadi, fitur ini berfungsi dengan baik baik Anda menggunakan PHP 7.4 maupun PHP 8.2.

Beberapa teman mungkin bertanya, bagaimana jika saya ingin mengubah kata sandi saya?

Sangat sederhana; cukup jalankan ulang skripnya. Skrip akan menghasilkan ulang hash kata sandi, mengkonfigurasi ulang otentikasi Nginx, dan mengkonfigurasi ulang Fail2Ban. Konfigurasi lama akan ditimpa.

Bagaimana jika saya ingin menghapus instalasinya?

Anda dapat menghapus direktori root web, file kata sandi, dan konfigurasi Fail2Ban secara manual. Skrip tersebut tidak akan meninggalkan jejak lain pada sistem.

Tulis di akhir

Saya selalu merasa bahwa operasi dan pemeliharaan seharusnya tidak terlalu rumit.

Banyak tugas manual sebenarnya dapat diotomatisasi menggunakan skrip. Hal ini memungkinkan Anda untuk menghabiskan waktu Anda pada hal-hal yang lebih penting, seperti mengoptimalkan kinerja server, memantau status aplikasi, dan meneliti teknologi baru.

Ini mengingatkan saya pada sebuah kisah sejarah. Pada tahun 1880-an, listrik mulai menyebar di Amerika Serikat. Banyak pemilik pabrik menghabiskan banyak uang untuk membeli generator dan motor listrik dan memasangnya di pabrik mereka. Namun, setelah pemasangan, banyak yang mendapati bahwa efisiensi produksi tidak meningkat secara signifikan. Hal ini karena mereka hanya mengganti mesin uap dengan motor listrik, tetapi tata letak keseluruhan, proses, dan metode manajemen pabrik tetap tidak berubah.

Mereka yang benar-benar diuntungkan dari ledakan listrik adalah orang-orang pertama yang memahami arti sebenarnya dari listrik. Mereka mendesain ulang jalur produksi, merestrukturisasi bengkel, dan mengatur ulang cara kerja para pekerja.

Hal yang sama berlaku untuk otomatisasi operasi dan pemeliharaan. Banyak orang tahu bahwa skrip dapat digunakan, tetapi mereka tetap lebih menyukai pengoperasian manual, seperti halnya pemilik pabrik di masa lalu yang mengetahui tentang motor listrik tetapi masih menggunakan pola pikir mesin uap untuk menggunakannya. Skrip tidak dimaksudkan untuk menggantikan penilaian Anda, tetapi untuk mengotomatiskan tugas-tugas yang berulang, mekanis, dan rawan kesalahan, sehingga Anda dapat memfokuskan energi Anda pada hal-hal yang benar-benar membutuhkan pemikiran.

Beginilah skrip ini tercipta. Skrip ini memecahkan masalah yang saya alami, dan saya harap ini juga dapat membantu Anda.

Jika Anda menggunakan HestiaCP dan Adminer, Anda mungkin ingin mencoba skrip ini. Ini bisa menghemat banyak waktu Anda.

Karena Anda sudah membaca sampai sejauh ini, jika Anda merasa bermanfaat, silakan sukai dan bagikan. Jika Anda ingin menerima pembaruan lebih dulu, Anda juga bisa mengikuti saya!

Terima kasih telah membaca artikel saya. Sampai jumpa lagi.

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Gulir ke Atas