HestiaCP proporciona un desplegament automatitzat amb un sol clic de l'script Adminer (inclosa l'autenticació Nginx + la protecció dual Fail2Ban).

Deixa d'instal·lar manualment l'Adminer! Un sol script pot gestionar tota la configuració de seguretat.

Fa un parell de dies, un amic meu, que també treballa en administració de sistemes, es va queixar que li porta la major part del dia instal·lar l'Adminer al seu servidor. No és que l'Adminer en si sigui difícil d'instal·lar; només és un fitxer PHP, només cal que el llances i funcionarà. Però el problema és que no pots simplement llançar un fitxer PHP i deixar-ho tot.

Cal configurar subdominis, carregar complements, configurar l'autenticació Nginx i configurar Fail2Ban per evitar atacs de força bruta. Cada pas no és complicat, però junts donen lloc a un munt d'ordres i fitxers de configuració fragmentats.

El que és encara més molest és que les configuracions relacionades amb la seguretat, com l'autenticació i els tallafocs, són particularment propenses a errors. Un petit descuit pot exposar la interfície de gestió de bases de dades a Internet públic, fent-la accessible a tothom.

En aquell moment em vaig riure perquè ja havia estat fent el mateix abans. Més tard, ja no ho vaig poder suportar més, així que vaig escriure un script de desplegament amb un sol clic per automatitzar tots aquests passos.

HestiaCP proporciona un desplegament automatitzat amb un sol clic de l'script Adminer (inclosa l'autenticació Nginx + la protecció dual Fail2Ban).

Per què no utilitzarphpMyAdmin

Us preguntareu, per què no utilitzar phpMyAdmin, que és més convencional?

De fet, phpMyAdmin té més usuaris i una comunitat més gran. Però crec que Adminer fa una millor feina en algunes àrees.

En primer lloc, és lleuger; Adminer és només un únic fitxer PHP, mentre que phpMyAdmin és un munt de fitxers. En segon lloc, és segur; la filosofia de disseny d'Adminer és "no fiable per defecte", és a dir, cal configurar explícitament la informació de connexió per fer funcionar la base de dades.

Un altre aspecte és el rendiment; Adminer és significativament més ràpid que phpMyAdmin quan gestiona bases de dades grans.

Per descomptat, cap d'aquestes coses és la més important. El més important és que aquest script significa que ja no he de configurar manualment aquestes coses relacionades amb la seguretat.

Què feia exactament el guió?

La idea darrere d'aquest script és en realitat força simple: automatitzar tots els passos que normalment fas manualment.

Per a l'entrada interactiva, l'script us farà unes quantes preguntes: nom d'usuari d'HestiaCP , nom de domini, nom d'usuari d'autenticació i contrasenya. Només cal que introduïu aquestes dades i l'script s'encarregarà de la resta.

L'script crea automàticament el directori arrel web, comprova si apache2-utils (utilitzat per generar fitxers de contrasenya) i l'entorn PHP estan instal·lats i gestiona la creació de directoris i la instal·lació de dependències.

Quan es descarrega l'Adminer, l'script primer intenta descarregar la darrera versió del repositori oficial. Si el repositori oficial no està disponible, canvia automàticament al repositori estable de GitHub Releases. Crec que això és força important, ja que el repositori oficial de vegades pot ser inestable; ja m'he trobat amb temps d'espera de connexió abans.

Pel que fa a les descàrregues de complements, l'script descarregarà tres complements principals: plugin.php és el carregador de complements, fc-sqlite-connection-without-credentials.php s'utilitza per gestionar connexions sense contrasenya i login-password-less.php admet l'inici de sessió amb hash de contrasenya.

Pel que fa a la generació del hash de la contrasenya i a index.php, hi ha un petit detall: l'script utilitza getenv() per recuperar la contrasenya en comptes d'utilitzar directament $_ENV. Això evita un problema de configuració de php.ini que fa que el càlcul del hash quedi buit. Jo mateix vaig trobar aquest error i vaig passar molt de temps intentant esbrinar que l'àmbit 'E' no estava habilitat a php.ini.

Per configurar l'autenticació de Nginx, l'script utilitza el mecanisme d'inclusió natiu de HestiaCP en comptes de modificar directament el fitxer de configuració principal de Nginx. L'avantatge d'aquest enfocament és que l'autenticació no fallarà encara que reconstruïu la configuració del domini.

En la configuració de Fail2Ban, l'script crea una regla de filtratge per controlar els errors 401. Si una IP no inicia sessió 3 vegades en 10 minuts, es bloquejarà durant 1 hora.

Pel que fa a la reparació de permisos i la recàrrega del servei, l'script configurarà automàticament els permisos de fitxer correctes i recarregarà PHP-FPM, Nginx i Fail2Ban.

Vaig seriosament amb la seguretat.

Sincerament, la seguretat de les eines de gestió de bases de dades és el que més m'importa.

Pensa-hi, l'administrador pot manipular directament totes les bases de dades del teu servidor. Si està exposat a Internet públicament i algú l'escaneja, les conseqüències serien inimaginables.

Aquest script té triple protecció.

La primera capa és l'autenticació bàsica HTTP de Nginx. Quan accediu a l'administrador, el navegador us mostrarà un quadre de diàleg que us demanarà que introduïu el vostre nom d'usuari i contrasenya. Només després d'introduir la informació correcta podreu veure la pàgina d'inici de sessió de l'administrador.

La segona capa és el hash de contrasenya d'inici de sessió de l'administrador. He configurat el hash de contrasenya a index.php, de manera que, fins i tot si algú ignora l'autenticació Nginx, no sabrà la contrasenya d'inici de sessió de l'administrador.

La tercera capa és la protecció per força bruta de Fail2Ban. Si algú intenta forçar la teva contrasenya, Fail2Ban bloquejarà automàticament la seva adreça IP.

Amb aquestes tres capes de protecció combinades, bàsicament podeu posar l'Administrador a Internet pública amb tranquil·litat.

Operació amb un sol clic, realment és un sol clic.

El procés de desplegament és extremadament senzill.

#!/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 "=================================================="

Com executar l'script: Atorgueu permisos d'execució a l'script:

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

Executeu l'script amb sudo:

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

Introduïu la informació de configuració tal com se us demani:

  • Introduïu el vostre nom d'usuari d'HestiaCP (per exemple, administrador).
  • Introduïu el subdomini complet preparat (per exemple, adminer.example.com).
  • Introduïu la vostra contrasenya de seguretat (per exemple, MySuperPassword123)

L'script completarà automàticament tot el procés de configuració sense ometre res.

Tot el procés triga aproximadament un o dos minuts. L'script ho gestionarà tot automàticament i no cal que executeu cap ordre manualment.

Un cop hàgiu acabat, podeu accedir a l'administrador a través de https://elvostredomini/index.php

Algunes preguntes que us poden preocupar

Alguns amics es poden preguntar, aquest script admet diverses versions de PHP?

Sí, és compatible. L'script detectarà automàticament tots els serveis PHP-FPM que s'executen al sistema i els tornarà a carregar un per un. Per tant, funciona correctament tant si utilitzeu PHP 7.4 com PHP 8.2.

Alguns amics es poden preguntar, què passa si vull canviar la meva contrasenya?

És molt senzill; només cal tornar a executar l'script. L'script regenerarà el hash de la contrasenya, reconfigurarà l'autenticació de Nginx i reconfigurarà Fail2Ban. La configuració antiga se sobreescriurà.

Què passa si vull desinstal·lar-ho?

Podeu suprimir manualment el directori arrel web, el fitxer de contrasenyes i la configuració de Fail2Ban. L'script no deixarà cap altre rastre al sistema.

Escriu al final

Sempre he pensat que les operacions i el manteniment no haurien de ser tan complicats.

Moltes tasques manuals es poden automatitzar mitjançant scripts. Això permet dedicar el temps a coses més importants, com ara optimitzar el rendiment del servidor, supervisar l'estat de les aplicacions i investigar noves tecnologies.

Això em recorda una història històrica. A la dècada de 1880, l'electricitat va començar a estendre's pels Estats Units. Molts propietaris de fàbriques van gastar molts diners per comprar generadors i motors elèctrics i instal·lar-los a les seves fàbriques. Tanmateix, després de la instal·lació, molts van descobrir que l'eficiència de la producció no havia millorat significativament. Això es devia al fet que només havien substituït les màquines de vapor per motors elèctrics, però la disposició general, els processos i els mètodes de gestió de la fàbrica es mantenien sense canvis.

Aquells que realment es van beneficiar del boom elèctric van ser els primers a entendre què significava realment l'electricitat. Van redissenyar les línies de producció, van reestructurar els tallers i van reorganitzar la manera com operaven els treballadors.

El mateix s'aplica a l'automatització de les operacions i el manteniment. Molta gent sap que es poden utilitzar scripts, però encara prefereixen el funcionament manual, igual que aquells propietaris de fàbriques del passat que coneixien els motors elèctrics però que encara utilitzaven la mentalitat de les màquines de vapor per utilitzar-los. Els scripts no estan pensats per substituir el vostre judici, sinó per automatitzar tasques repetitives, mecàniques i propenses a errors, permetent-vos concentrar la vostra energia en allò que realment requereix reflexió.

Així és com va sorgir aquest guió. Va resoldre un punt feble per a mi i espero que també us pugui ajudar.

Si feu servir HestiaCP i Adminer, potser voldreu provar aquest script. Us podria estalviar molt de temps.

Ja que has llegit fins aquí, si t'ha semblat útil, fes-hi un "m'agrada" i comparteix-ho. Si vols rebre actualitzacions primer, també em pots seguir!

Gràcies per llegir el meu article. Fins la propera.

发表 评论

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

Tornar a dalt