HestiaCP menyediakan penggunaan skrip Adminer secara automatik satu klik (termasuk pengesahan Nginx + perlindungan dwi Fail2Ban).

Berhenti memasang Adminer secara manual! Satu skrip boleh mengendalikan keseluruhan konfigurasi keselamatan.

Beberapa hari yang lalu, seorang rakan saya, yang juga bekerja dalam pentadbiran sistem, mengadu kepada saya bahawa dia mengambil masa hampir sehari untuk memasang Adminer pada pelayannya. Bukannya Adminer itu sendiri sukar untuk dipasang; ia hanyalah fail PHP, anda boleh membukanya dan ia akan berfungsi. Tetapi masalahnya, anda tidak boleh membuka fail PHP begitu sahaja.

Anda perlu mengkonfigurasi subdomain, memuatkan plugin, menyediakan pengesahan Nginx dan mengkonfigurasi Fail2Ban untuk mencegah serangan brute-force. Setiap langkah tidak rumit, tetapi jika digabungkan, ia akan menghasilkan sekumpulan arahan dan fail konfigurasi yang berpecah-belah.

Apa yang lebih menjengkelkan ialah konfigurasi berkaitan keselamatan seperti pengesahan dan tembok api amat terdedah kepada ralat. Sedikit kesilapan boleh mendedahkan antara muka pengurusan pangkalan data kepada internet awam, menjadikannya boleh diakses oleh sesiapa sahaja.

Saya ketawa ketika itu kerana saya juga pernah melakukan perkara yang sama sebelum ini. Kemudian, saya tidak tahan lagi, jadi saya menulis skrip penggunaan satu klik untuk mengautomasikan semua langkah ini.

HestiaCP menyediakan penggunaan skrip Adminer secara automatik satu klik (termasuk pengesahan Nginx + perlindungan dwi Fail2Ban).

Mengapa tidak digunakanphpMyAdmin

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

Sesungguhnya, phpMyAdmin mempunyai lebih ramai pengguna dan komuniti yang lebih besar. Tetapi saya fikir Adminer melakukan tugas yang lebih baik dalam beberapa bidang.

Pertama, ia ringan; Adminer hanyalah satu fail PHP, manakala phpMyAdmin adalah sekumpulan besar fail. Kedua, ia selamat; Falsafah reka bentuk Adminer adalah "tidak dipercayai secara lalai," bermakna anda perlu mengkonfigurasi maklumat sambungan secara eksplisit untuk mengendalikan pangkalan data.

Satu lagi aspek ialah prestasi; Adminer jauh lebih pantas daripada phpMyAdmin apabila mengendalikan pangkalan data yang besar.

Sudah tentu, semua ini bukanlah perkara yang paling penting. Perkara yang paling penting ialah skrip ini bermakna saya tidak lagi perlu mengkonfigurasi perkara berkaitan keselamatan tersebut secara manual.

Apa sebenarnya yang dilakukan oleh skrip itu?

Idea di sebalik skrip ini sebenarnya agak mudah: untuk mengautomasikan semua langkah yang biasanya anda lakukan secara manual.

Untuk input interaktif, skrip akan menanyakan beberapa soalan kepada anda: nama pengguna HestiaCP , nama domain, nama pengguna pengesahan dan kata laluan. Anda hanya perlu memasukkannya dan skrip akan mengendalikan selebihnya.

Skrip secara automatik mencipta direktori root web, menyemak sama ada apache2-utils (digunakan untuk menjana fail kata laluan) dan persekitaran PHP dipasang, dan mengendalikan penciptaan direktori dan pemasangan kebergantungan.

Semasa memuat turun Adminer, skrip akan cuba memuat turun versi terkini daripada repositori rasmi terlebih dahulu. Jika repositori rasmi tidak tersedia, ia akan bertukar secara automatik ke repositori GitHub Releases yang stabil. Saya fikir ini agak penting, kerana repositori rasmi kadangkala tidak stabil; saya pernah mengalami sambungan terhenti sebelum ini.

Berkenaan muat turun plugin, skrip akan memuat turun tiga plugin teras: plugin.php ialah pemuat plugin, fc-sqlite-connection-without-credentials.php digunakan untuk mengendalikan sambungan tanpa kata laluan dan login-password-less.php menyokong log masuk hash kata laluan.

Berkenaan penjanaan hash kata laluan dan index.php, terdapat butiran kecil: skrip menggunakan getenv() untuk mendapatkan kata laluan dan bukannya menggunakan $_ENV secara langsung. Ini mengelakkan masalah konfigurasi php.ini yang menyebabkan pengiraan hash kosong. Saya sendiri menghadapi masalah ini dan menghabiskan masa yang lama untuk mengetahui bahawa skop 'E' tidak diaktifkan dalam php.ini.

Untuk mengkonfigurasi pengesahan Nginx, skrip menggunakan mekanisme penyertaan asli HestiaCP dan bukannya mengubah suai fail konfigurasi utama Nginx secara langsung. Kelebihan pendekatan ini ialah pengesahan tidak akan gagal walaupun anda membina semula konfigurasi domain.

Dalam konfigurasi Fail2Ban, skrip mencipta peraturan penapisan untuk memantau ralat 401. Jika IP gagal log masuk 3 kali dalam masa 10 minit, ia akan disekat selama 1 jam.

Berkenaan pembaikan kebenaran dan pemuatan semula perkhidmatan, skrip akan menetapkan kebenaran fail yang betul secara automatik dan memuat semula PHP-FPM, Nginx dan Fail2Ban.

Saya serius tentang keselamatan.

Sejujurnya, keselamatan alatan pengurusan pangkalan data adalah perkara yang paling saya pentingkan.

Fikirkanlah, Admin boleh memanipulasi secara langsung semua pangkalan data di pelayan anda. Jika ia terdedah kepada internet awam dan seseorang mengimbasnya, akibatnya tidak dapat dibayangkan.

Skrip ini mempunyai perlindungan tiga kali ganda.

Lapisan pertama ialah Pengesahan Asas HTTP Nginx. Apabila anda mengakses Adminer, pelayar anda akan memaparkan kotak dialog yang meminta anda memasukkan nama pengguna dan kata laluan anda. Hanya selepas memasukkan maklumat yang betul, anda boleh melihat halaman log masuk Adminer.

Lapisan kedua ialah log masuk hash kata laluan Pentadbir sendiri. Saya telah mengkonfigurasi hashing kata laluan dalam index.php, jadi walaupun seseorang memintas pengesahan Nginx, mereka tidak akan mengetahui kata laluan log masuk Pentadbir.

Lapisan ketiga ialah perlindungan brute-force Fail2Ban. Jika seseorang cuba memaksa kata laluan anda, Fail2Ban akan menyekat alamat IP mereka secara automatik.

Dengan gabungan tiga lapisan perlindungan ini, anda pada asasnya boleh meletakkan Pentadbir di internet awam dengan tenang.

Operasi satu klik, ia sebenarnya satu klik sahaja.

Proses pelaksanaannya sangat mudah.

#!/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 kebenaran pelaksanaan skrip:

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

Jalankan skrip menggunakan sudo:

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

Masukkan maklumat konfigurasi seperti yang diminta:

  • Masukkan nama pengguna HestiaCP anda (cth., admin).
  • Masukkan subdomain penuh yang telah disediakan (cth., adminer.example.com).
  • Masukkan kata laluan keselamatan anda (cth., MySuperPassword123)

Skrip akan melengkapkan keseluruhan proses konfigurasi secara automatik tanpa meninggalkan apa-apa.

Keseluruhan proses mengambil masa kira-kira satu atau dua minit. Skrip akan mengendalikan semuanya secara automatik dan anda tidak perlu melaksanakan sebarang arahan secara manual.

Selepas anda selesai, anda boleh mengakses Adminer melalui https://domainanda/index.php

Beberapa soalan yang mungkin anda bimbangkan

Sesetengah rakan mungkin bertanya, adakah skrip ini menyokong pelbagai versi PHP?

Ya, ia disokong. Skrip akan mengesan semua perkhidmatan PHP-FPM yang berjalan pada sistem secara automatik dan memuatkan semula satu persatu. Jadi ia berfungsi dengan baik sama ada anda menggunakan PHP 7.4 atau PHP 8.2.

Sesetengah rakan mungkin bertanya, bagaimana jika saya ingin menukar kata laluan saya?

Ia sangat mudah; jalankan semula skrip. Skrip akan menjana semula hash kata laluan, mengkonfigurasi semula pengesahan Nginx dan mengkonfigurasi semula Fail2Ban. Konfigurasi lama akan ditulis ganti.

Bagaimana jika saya mahu menyahpasangnya?

Anda boleh memadam direktori root web, fail kata laluan dan konfigurasi Fail2Ban secara manual. Skrip tidak akan meninggalkan sebarang kesan lain pada sistem.

Tulis di akhir

Saya selalu merasakan bahawa operasi dan penyelenggaraan tidak sepatutnya begitu rumit.

Banyak tugasan manual sebenarnya boleh diautomasikan menggunakan skrip. Ini membolehkan anda meluangkan masa anda untuk perkara yang lebih penting, seperti mengoptimumkan prestasi pelayan, memantau status aplikasi dan menyelidik teknologi baharu.

Ini mengingatkan saya kepada kisah sejarah. Pada tahun 1880-an, elektrik mula tersebar di Amerika Syarikat. Ramai pemilik kilang membelanjakan banyak wang untuk membeli penjana dan motor elektrik dan memasangnya di kilang mereka. Walau bagaimanapun, selepas pemasangan, ramai yang mendapati bahawa kecekapan pengeluaran tidak bertambah baik dengan ketara. Ini kerana mereka hanya menggantikan enjin stim dengan motor elektrik, tetapi susun atur keseluruhan, proses dan kaedah pengurusan kilang kekal tidak berubah.

Mereka yang benar-benar mendapat manfaat daripada ledakan elektrik adalah yang pertama memahami apa sebenarnya erti elektrik. Mereka mereka bentuk semula barisan pengeluaran, menstruktur semula bengkel dan menyusun semula cara pekerja beroperasi.

Perkara yang sama berlaku untuk automasi operasi dan penyelenggaraan. Ramai orang tahu bahawa skrip boleh digunakan, tetapi mereka masih lebih suka operasi manual, sama seperti pemilik kilang pada masa lalu yang mengetahui tentang motor elektrik tetapi masih menggunakan pemikiran enjin stim untuk menggunakannya. Skrip bukan bertujuan untuk menggantikan pertimbangan anda, tetapi untuk mengautomasikan tugas yang berulang, mekanikal dan mudah ralat, membolehkan anda menumpukan tenaga anda pada perkara yang benar-benar memerlukan pemikiran.

Beginilah skrip ini terhasil. Ia menyelesaikan masalah saya, dan saya harap ia dapat membantu anda juga.

Jika anda menggunakan HestiaCP dan Adminer, anda mungkin ingin mencuba skrip ini. Ia mungkin dapat menjimatkan banyak masa anda.

Memandangkan anda telah membaca setakat ini, jika anda mendapati ia membantu, sila suka dan kongsikannya. Jika anda ingin menerima kemas kini terlebih dahulu, anda juga boleh mengikuti saya!

Terima kasih kerana membaca artikel saya. Jumpa lagi di lain masa.

发表 评论

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

Tatal ke