Artikel Verzeechnes
Stoppt mat der manueller Installatioun vun Adminer! Ee Skript kann déi ganz Sécherheetskonfiguratioun handhaben.
Virun e puer Deeg huet e Frënd vu mir, deen och am Systemmanagement schafft, sech bei mir beklot, datt hien de gréissten Deel vum Dag brauch fir Adminer op sengem Server z'installéieren. Et ass net sou, datt Adminer selwer schwéier z'installéieren ass; et ass just eng PHP-Datei, Dir kënnt se einfach eroplueden an et funktionéiert. Mee de Problem ass, datt Dir net einfach eng PHP-Datei eropluede kënnt an domat fäerdeg sidd.
Dir musst Subdomainen konfiguréieren, Plugins lueden, Nginx-Authentifikatioun opsetzen a Fail2Ban konfiguréieren, fir Brute-Force-Attacken ze verhënneren. All Schrëtt ass net komplizéiert, awer zesummen bilden se e Koup fragmentéiert Befeeler a Konfiguratiounsdateien.
Nach méi nervend ass, datt Sécherheetsbezunnen Konfiguratiounen ewéi Authentifikatioun a Firewalls besonnesch ufälleg fir Feeler sinn. E klenge Feeler kann d'Datebankverwaltungsinterface dem ëffentlechen Internet aussetzen, sou datt se fir jiddereen zougänglech ass.
Ech hunn deemools gelacht, well ech datselwecht schonn emol gemaach hat. Méi spéit konnt ech et net méi ausstoen, dofir hunn ech e Skript fir den Deployment mat engem Klick geschriwwen, fir all dës Schrëtt ze automatiséieren.

Firwat net benotzenphpMyAdmin
Dir kéints froen, firwat net phpMyAdmin benotzen, wat méi Mainstream ass?
Tatsächlech huet phpMyAdmin méi Benotzer an eng méi grouss Communautéit. Mee ech mengen, datt Adminer a verschiddene Beräicher besser Aarbecht mécht.
Éischtens, et ass liicht; Adminer ass just eng eenzeg PHP-Datei, während phpMyAdmin eng ganz Rëtsch Dateien ass. Zweetens, et ass sécher; d'Designphilosophie vun Adminer ass "standardméisseg net vertrauenswierdeg", dat heescht, Dir musst d'Verbindungsinformatioun explizit konfiguréieren, fir d'Datebank ze bedreiwen.
En aneren Aspekt ass d'Performance; Adminer ass däitlech méi séier wéi phpMyAdmin beim Ëmgang mat groussen Datebanken.
Natierlech ass näischt dovun déi wichtegst Saachen. Dat Wichtegst ass, datt ech dëse Skript net méi manuell déi Sécherheetsbedéngungen konfiguréiere muss.
Wat genau huet de Skript gemaach?
D'Iddi hannert dësem Skript ass eigentlech zimmlech einfach: all d'Schrëtt ze automatiséieren, déi Dir normalerweis manuell maacht.
Fir interaktiv Input stellt de Skript Iech e puer Froen: HestiaCP Benotzernumm, Domainnumm, Authentifikatiouns Benotzernumm a Passwuert. Dir musst nëmmen dës aginn, an de Skript këmmert sech ëm de Rescht.
De Skript erstellt automatesch de Web-Root-Verzeichnis, kontrolléiert ob apache2-utils (benotzt fir Passwuertdateien ze generéieren) an d'PHP-Ëmfeld installéiert sinn, a këmmert sech ëm d'Erstelle vun Verzeichnisser an d'Installatioun vun Ofhängegkeeten.
Beim Eroflueden vun Adminer probéiert de Skript als éischt déi lescht Versioun vum offiziellen Repository erofzelueden. Wann den offiziellen Repository net verfügbar ass, wiesselt en automatesch op de stabile GitHub Releases Repository. Ech mengen, dat ass zimmlech wichteg, well den offiziellen Repository heiansdo onstabil ka sinn; ech hunn schonn e puermol Verbindungs-Timeouts gesinn.
Wat d'Plugin-Downloads ugeet, luet de Skript dräi Kär-Plugins erof: plugin.php ass de Plugin-Ladeprogramm, fc-sqlite-connection-without-credentials.php gëtt benotzt fir passwuertlos Verbindungen ze verwalten, a login-password-less.php ënnerstëtzt Passwuert-Hash-Login.
Wat d'Generatioun vum Passwuert-Hash an index.php ugeet, gëtt et e klengen Detail: de Skript benotzt getenv() fir d'Passwuert ofzeruffen, anstatt direkt $_ENV ze benotzen. Dëst vermeit e php.ini Konfiguratiounsproblem, deen dozou féiert, datt d'Hashberechnung eidel ass. Ech selwer sinn op dëse Fall gestouss a war laang domat beschäftegt, erauszefannen, datt den 'E' Scope net an php.ini aktivéiert war.
Fir d'Konfiguratioun vun der Nginx-Authentifikatioun benotzt de Skript den nativen Include-Mechanismus vun HestiaCP anstatt direkt d'Haaptkonfiguratiounsdatei vun Nginx z'änneren. De Virdeel vun dësem Usaz ass, datt d'Authentifikatioun net feelschléit, och wann Dir d'Domainkonfiguratioun nei opbaut.
An der Fail2Ban Konfiguratioun erstellt de Skript eng Filterregel fir 401-Feeler ze iwwerwaachen. Wann eng IP-Adress sech 3 Mol bannent 10 Minutten net aloggt, gëtt se fir 1 Stonn blockéiert.
Wat d'Reparatur vun de Permissiounen an d'Neiluede vum Service ugeet, setzt de Skript automatesch déi richteg Dateipermissiounen a luet PHP-FPM, Nginx a Fail2Ban nei.
Ech mengen d'Sécherheet eescht.
Éierlech gesot, d'Sécherheet vun den Datebankverwaltungstools ass dat, wat mech am meeschte wichteg mécht.
Denkt emol drun, den Admin kann all d'Datebanken op Ärem Server direkt manipuléieren. Wann se dem ëffentlechen Internet zougänglech sinn an een se scannt, wieren d'Konsequenze onvirstellbar.
Dëse Skript huet dräifache Schutz.
Déi éischt Schicht ass Nginx säin HTTP Basic Auth. Wann Dir op Adminer zougräift, weist Äre Browser eng Dialogbox op, wou Dir Äre Benotzernumm a Passwuert aginn musst. Eréischt nodeems Dir déi richteg Informatioune aginn hutt, kënnt Dir d'Admin-Loginsäit gesinn.
Déi zweet Schicht ass den eegene Passwuert-Hash-Login vum Admin. Ech hunn Passwuert-Hashing an index.php konfiguréiert, sou datt och wann een d'Nginx-Authentifikatioun ëmgeet, hien de Login-Passwuert vum Admin net kennt.
Déi drëtt Schicht ass de Brute-Force-Schutz vu Fail2Ban. Wann een probéiert Äert Passwuert mat Brute-Force ze hacken, blockéiert Fail2Ban automatesch seng IP-Adress.
Mat dësen dräi Schutzschichten zesumme kënnt Dir den Administrator am Fong roueg um ëffentlechen Internet setzen.
Een-Klick-Operatioun, et ass wierklech ee Klick.
Den Asazprozess ass extrem einfach.
#!/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 "=================================================="Wéi een de Skript ausféiert: Gitt dem Skript Ausféierungsberechtigungen:
sudo chmod +x /usr/local/bin/deploy-adminer.sh
Féiert de Skript mat sudo aus:
sudo /usr/local/bin/deploy-adminer.sh
Gitt d'Konfiguratiounsinformatioune wéi gefrot an:
- Gitt Äre Benotzernumm fir HestiaCP an (z.B. admin).
- Gitt déi virbereet komplett Ënnerdomain an (z.B. adminer.example.com).
- Gitt Äert Sécherheetspasswuert an (z.B. MySuperPassword123)
De Skript wäert automatesch de ganze Konfiguratiounsprozess ofschléissen, ouni eppes auszeloossen.
De ganze Prozess dauert ongeféier eng oder zwou Minutten. De Skript handhabt alles automatesch, an Dir braucht keng Kommandoen manuell auszeféieren.
Nodeems Dir fäerdeg sidd, kënnt Dir op den Admin iwwer https://yourdomain/index.php zougräifen
E puer Froen, iwwer déi Dir Iech Suerge maache kënnt
E puer Frënn froe sech vläicht, ob dëse Skript verschidde PHP Versiounen ënnerstëtzt?
Jo, et gëtt ënnerstëtzt. De Skript erkennt automatesch all PHP-FPM Servicer, déi um System lafen, a luet se een nom aneren nei. Et funktionéiert also ouni Problemer, egal ob Dir PHP 7.4 oder PHP 8.2 benotzt.
E puer Frënn froe sech vläicht: Wat wann ech mäi Passwuert änneren wëll?
Et ass ganz einfach; einfach de Skript nach eng Kéier ausféieren. De Skript regeneréiert den Passwuert-Hash, konfiguréiert d'Nginx-Authentifikatioun nei a konfiguréiert de Fail2Ban nei. Déi al Konfiguratioun gëtt iwwerschriwwen.
Wat wann ech et deinstalléiere wëll?
Dir kënnt einfach den Web-Root-Verzeichnis, d'Passwuertdatei an d'Fail2Ban-Konfiguratioun manuell läschen. De Skript léisst keng aner Spueren um System.
Schreift um Enn
Ech war ëmmer der Meenung, datt Operatioun an Ënnerhalt net sou komplizéiert sollte sinn.
Vill manuell Aufgaben kënnen tatsächlech mat Hëllef vu Skripter automatiséiert ginn. Dëst erlaabt Iech Är Zäit fir méi wichteg Saachen ze verbréngen, wéi d'Optimiséierung vun der Serverleistung, d'Iwwerwaachung vum Applikatiounsstatus an d'Recherche vun neien Technologien.
Dëst erënnert mech un eng historesch Geschicht. An den 1880er Joren huet sech d'Elektrizitéit an den USA verbreet. Vill Fabrécksbesëtzer hunn vill Sue fir de Kaf vu Generatoren an Elektromotoren ausginn an se an hire Fabriken installéiert. No der Installatioun hunn awer vill festgestallt, datt d'Produktiounseffizienz net wesentlech verbessert gouf. Dëst war well se nëmmen Dampmaschinne mat Elektromotoren ersat haten, awer den allgemengen Opbau, d'Prozesser an d'Gestiounsmethoden vun der Fabréck sinn onverännert bliwwen.
Déi, déi wierklech vum Elektrizitéitsboom profitéiert hunn, waren déi Éischt, déi verstanen hunn, wat Elektrizitéit wierklech bedeit huet. Si hunn d'Produktiounslinnen nei gestaltet, Atelieren ëmstrukturéiert an d'Aarbechtsweis nei organiséiert.
Datselwecht gëllt fir d'Automatiséierung vum Betrib an der Ënnerhaltung. Vill Leit wëssen, datt Skripter kënne benotzt ginn, awer si léiwer ëmmer nach de manuelle Betrib, genee wéi déi Fabrécksbesëtzer fréier, déi vun Elektromotore kannt hunn, awer ëmmer nach d'Denkweis vun Dampmaschinne benotzt hunn, fir se ze benotzen. Skripter sinn net geduecht fir Äert Uerteel ze ersetzen, mä fir repetitiv, mechanesch an fehlerufälleg Aufgaben ze automatiséieren, sou datt Dir Är Energie op dat konzentréiere kënnt, wat wierklech Nodenken erfuerdert.
Sou ass dëse Skript entstanen. En huet e Problem fir mech geléist, an ech hoffen, en kann dir och hëllefen.
Wann Dir HestiaCP an Adminer benotzt, kënnt Dir dëse Skript emol ausprobéieren. Et kéint Iech vill Zäit spueren.
Well Dir bis elo gelies hutt, wann Dir et hëllefräich fonnt hutt, gitt w.e.g. e Like a deelt et. Wann Dir als éischt Updates wëllt kréien, kënnt Dir mir och verfollegen!
Merci datt Dir mäin Artikel gelies hutt. Bis déi nächst Kéier.
Hoffentlech ass den Artikel "HestiaCP One-Click Automated Deployment Adminer Script (Including Nginx Authentication + Fail2Ban Dual Protection)", deen um Blog vum Chen Weiliang ( https://www.chenweiliang.com/ ) gedeelt gouf, hëllefräich fir Iech.
Deelt gären de Link vun dësem Artikel: https://www.chenweiliang.com/cwl-34395.html
