Directorio de artigos
Deixa de instalar manualmente o Adminer! Un só script pode xestionar toda a configuración de seguridade.
Hai un par de días, un amigo meu, que tamén traballa en administración de sistemas, queixouse de que lle leva a maior parte do día instalar Adminer no seu servidor. Non é que Adminer en si sexa difícil de instalar; é só un ficheiro PHP, podes simplemente lanzalo e funcionará. Pero o problema é que non podes simplemente lanzalo un ficheiro PHP e dar por rematado o día.
Necesitas configurar subdominios, cargar complementos, configurar a autenticación Nginx e configurar Fail2Ban para evitar ataques de forza bruta. Cada paso non é complicado, pero xuntos dan lugar a un conxunto de comandos e ficheiros de configuración fragmentados.
O que é aínda máis molesto é que as configuracións relacionadas coa seguridade, como a autenticación e os cortafuegos, son especialmente propensas a erros. Un pequeno descoido pode expoñer a interface de xestión da base de datos á internet pública, facéndoa accesible para calquera persoa.
Naquel momento rin porque xa estivera facendo o mesmo antes. Despois, non o puiden soportar máis, así que escribín un script de despregamento cun só clic para automatizar todos estes pasos.

Por que non usarphpMyAdmin
Poderías preguntarte, por que non usar phpMyAdmin, que é máis común?
De feito, phpMyAdmin ten máis usuarios e unha comunidade máis grande. Pero creo que Adminer fai un mellor traballo nalgunhas áreas.
En primeiro lugar, é lixeiro; Adminer é só un único ficheiro PHP, mentres que phpMyAdmin é un conxunto de ficheiros. En segundo lugar, é seguro; a filosofía de deseño de Adminer é "non fiable por defecto", o que significa que cómpre configurar explicitamente a información de conexión para operar a base de datos.
Outro aspecto é o rendemento; Adminer é significativamente máis rápido que phpMyAdmin ao manexar bases de datos grandes.
Por suposto, ningunha destas cousas é a máis importante. O máis importante é que este script significa que xa non teño que configurar manualmente esas cousas relacionadas coa seguridade.
Que fixo exactamente o guión?
A idea detrás deste script é en realidade bastante simple: automatizar todos os pasos que normalmente fas manualmente.
Para a entrada interactiva, o script farache unhas cantas preguntas: nome de usuario de HestiaCP , nome de dominio, nome de usuario de autenticación e contrasinal. Só tes que introducir estes datos e o script encargarase do resto.
O script crea automaticamente o directorio raíz web, comproba se apache2-utils (usado para xerar ficheiros de contrasinal) e o entorno PHP están instalados e xestiona a creación de directorios e a instalación de dependencias.
Ao descargar Adminer, o script primeiro tenta descargar a última versión do repositorio oficial. Se o repositorio oficial non está dispoñible, cambia automaticamente ao repositorio estable de GitHub Releases. Creo que isto é bastante importante, xa que o repositorio oficial ás veces pode ser inestable; xa me atopei con tempos de espera de conexión antes.
En canto ás descargas de complementos, o script descargará tres complementos principais: plugin.php é o cargador do complemento, fc-sqlite-connection-without-credentials.php úsase para xestionar conexións sen contrasinal e login-password-less.php admite o inicio de sesión con hash de contrasinal.
En canto á xeración de hash de contrasinal e index.php, hai un pequeno detalle: o script usa getenv() para recuperar o contrasinal en lugar de usar directamente $_ENV. Isto evita un problema de configuración de php.ini que provoca que o cálculo de hash estea baleiro. Eu mesmo atopei este erro e pasei moito tempo descubrindo que o ámbito 'E' non estaba activado en php.ini.
Para configurar a autenticación de Nginx, o script usa o mecanismo de inclusión nativo de HestiaCP en lugar de modificar directamente o ficheiro de configuración principal de Nginx. A vantaxe desta estratexia é que a autenticación non fallará mesmo se reconstrues a configuración do dominio.
Na configuración de Fail2Ban, o script crea unha regra de filtrado para monitorizar os erros 401. Se un enderezo IP non consegue iniciar sesión 3 veces en 10 minutos, bloquearase durante 1 hora.
En canto á reparación de permisos e á recarga de servizos, o script configurará automaticamente os permisos de ficheiro correctos e recargará PHP-FPM, Nginx e Fail2Ban.
Falo en serio coa seguridade.
Sinceramente, a seguridade das ferramentas de xestión de bases de datos é o que máis me importa.
Pensa niso, o administrador pode manipular directamente todas as bases de datos do teu servidor. Se está exposto á internet pública e alguén o escanea, as consecuencias serían inimaxinables.
Este script ten protección tripla.
A primeira capa é a autenticación básica HTTP de Nginx. Cando accedas a Adminer, o teu navegador mostrará unha caixa de diálogo pedíndoche que introduzas o teu nome de usuario e contrasinal. Só despois de introducir a información correcta poderás ver a páxina de inicio de sesión do administrador.
A segunda capa é o hash de contrasinal de inicio de sesión do propio administrador. Configurei o hash de contrasinal en index.php, polo que mesmo se alguén omite a autenticación de Nginx, non saberá o contrasinal de inicio de sesión do administrador.
A terceira capa é a protección por forza bruta de Fail2Ban. Se alguén intenta forzar o teu contrasinal, Fail2Ban bloqueará automaticamente o seu enderezo IP.
Con estas tres capas de protección combinadas, basicamente podes colocar o Administrador na Internet pública con tranquilidade.
Operación cun só clic, realmente é un só clic.
O proceso de despregamento é extremadamente sinxelo.
#!/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 "=================================================="Como executar o script: Conceder permisos de execución ao script:
sudo chmod +x /usr/local/bin/deploy-adminer.sh
Executa o script usando sudo:
sudo /usr/local/bin/deploy-adminer.sh
Introduza a información de configuración segundo se lle solicite:
- Introduza o seu nome de usuario de HestiaCP (por exemplo, admin).
- Introduza o subdominio completo preparado (por exemplo, adminer.example.com).
- Introduza o seu contrasinal de seguridade (por exemplo, MySuperPassword123)
O script completará automaticamente todo o proceso de configuración sen omitir nada.
O proceso completo leva un ou dous minutos. O script xestionará todo automaticamente e non precisa executar ningún comando manualmente.
Despois de rematar, podes acceder a Administrador a través de https://oteudominio/index.php
Algunhas preguntas que che poden preocupar
Algúns amigos poden preguntar, este script admite varias versións de PHP?
Si, é compatible. O script detectará automaticamente todos os servizos PHP-FPM que se executan no sistema e recargaraos un por un. Polo tanto, funciona ben tanto se usas PHP 7.4 como PHP 8.2.
Algúns amigos poderían preguntar, que fago se quero cambiar o meu contrasinal?
É moi sinxelo; só tes que volver executar o script. O script rexenerará o hash do contrasinal, reconfigurará a autenticación de Nginx e reconfigurará Fail2Ban. A configuración antiga sobrescribirase.
Que pasa se quero desinstalalo?
Podes eliminar manualmente o directorio raíz web, o ficheiro de contrasinais e a configuración de Fail2Ban. O script non deixará ningún outro rastro no sistema.
Escribe ao final
Sempre pensei que as operacións e o mantemento non deberían ser tan complicados.
Moitas tarefas manuais pódense automatizar mediante scripts. Isto permíteche dedicar o teu tempo a cousas máis importantes, como optimizar o rendemento do servidor, monitorizar o estado das aplicacións e investigar novas tecnoloxías.
Isto lémbrame unha historia. Na década de 1880, a electricidade comezou a estenderse polos Estados Unidos. Moitos propietarios de fábricas gastaron moito diñeiro en mercar xeradores e motores eléctricos e instalálos nas súas fábricas. Non obstante, despois da instalación, moitos descubriron que a eficiencia da produción non mellorara significativamente. Isto debíase a que só substituíran as máquinas de vapor por motores eléctricos, pero a disposición xeral, os procesos e os métodos de xestión da fábrica permaneceron sen cambios.
Aqueles que realmente se beneficiaron do auxe da electricidade foron os primeiros en comprender o que realmente significaba a electricidade. Redeseñaron as liñas de produción, reestruturaron os talleres e reorganizaron o xeito en que operaban os traballadores.
O mesmo aplícase á automatización das operacións e o mantemento. Moita xente sabe que se poden usar scripts, pero aínda prefiren a operación manual, igual que aqueles donos de fábricas do pasado que coñecían os motores eléctricos pero aínda usaban a mentalidade das máquinas de vapor para usalos. Os scripts non están destinados a substituír o teu xuízo, senón a automatizar tarefas repetitivas, mecánicas e propensas a erros, o que che permite concentrar a túa enerxía no que realmente require reflexión.
Así xurdiu este guión. Resolveu un problema para min e espero que tamén che poida axudar a ti.
Se estás a usar HestiaCP e Adminer, quizais queiras probar este script. Poderíache aforrar moito tempo.
Xa que leches ata aquí, se che resultou útil, por favor, dálle a "Gústame" e compárteo. Se queres recibir actualizacións primeiro, tamén podes seguirme!
Grazas por ler o meu artigo. Ata a próxima.
Esperemos que o artigo "HestiaCP One-Click Automated Deployment Script for Adminer (Including Nginx Authentication + Fail2Ban Dual Protection)" compartido no blog de Chen Weiliang ( https://www.chenweiliang.com/ ) che sexa útil.
Non dubides en compartir a ligazón deste artigo: https://www.chenweiliang.com/cwl-34395.html
