HestiaCP proporciona una implementación automatizada con un solo clic del script Adminer (que incluye autenticación Nginx + doble protección Fail2Ban).

¡Deja de instalar Adminer manualmente! Un solo script puede gestionar toda la configuración de seguridad.

Hace un par de días, un amigo mío, que también trabaja en administración de sistemas, se quejó de que le lleva casi todo el día instalar Adminer en su servidor. No es que Adminer sea difícil de instalar; es solo un archivo PHP, basta con subirlo y funciona. Pero el problema es que no puedes simplemente subir un archivo PHP y darlo por terminado.

Necesitas configurar subdominios, cargar complementos, configurar la autenticación de Nginx y configurar Fail2Ban para prevenir ataques de fuerza bruta. Cada paso es sencillo, pero en conjunto conforman un conjunto de comandos y archivos de configuración fragmentados.

Lo que resulta aún más molesto es que las configuraciones de seguridad, como la autenticación y los cortafuegos, son particularmente propensas a errores. Un pequeño descuido puede exponer la interfaz de administración de la base de datos a internet, haciéndola accesible a cualquiera.

En aquel momento me reí porque yo también había hecho lo mismo antes. Después, ya no lo soportaba más, así que escribí un script de implementación con un solo clic para automatizar todos esos pasos.

HestiaCP proporciona una implementación automatizada con un solo clic del script Adminer (que incluye autenticación Nginx + doble protección Fail2Ban).

¿Por qué no?phpMyAdmin

Quizás te preguntes, ¿por qué no usar phpMyAdmin, que es más común?

De hecho, phpMyAdmin tiene más usuarios y una comunidad más grande. Pero creo que Adminer lo hace mejor en algunos aspectos.

En primer lugar, es ligero; Adminer es solo un archivo PHP, mientras que phpMyAdmin consta de varios archivos. En segundo lugar, es seguro; la filosofía de diseño de Adminer es "no confiable por defecto", lo que significa que debe configurar explícitamente la información de conexión para operar la base de datos.

Otro aspecto es el rendimiento; Adminer es significativamente más rápido que phpMyAdmin al manejar bases de datos grandes.

Por supuesto, ninguna de estas es la más importante. Lo más importante es que este script significa que ya no tengo que configurar manualmente esos aspectos relacionados con la seguridad.

¿Qué hacía exactamente el guion?

La idea detrás de este script es bastante simple: automatizar todos los pasos que normalmente realizas manualmente.

Para la entrada interactiva, el script le hará algunas preguntas: nombre de usuario de HestiaCP , nombre de dominio, nombre de usuario de autenticación y contraseña. Solo necesita ingresar estos datos; el script se encargará del resto.

El script crea automáticamente el directorio raíz web, comprueba si están instalados apache2-utils (utilizado para generar archivos de contraseñas) y el entorno PHP, y gestiona la creación de directorios y la instalación de dependencias.

Al descargar Adminer, el script primero intenta descargar la última versión del repositorio oficial. Si el repositorio oficial no está disponible, cambia automáticamente al repositorio estable de GitHub Releases. Creo que esto es bastante importante, ya que el repositorio oficial a veces puede ser inestable; he experimentado problemas de conexión en el pasado.

En cuanto a la descarga de complementos, el script descargará tres complementos principales: plugin.php es el cargador de complementos, fc-sqlite-connection-without-credentials.php se utiliza para gestionar conexiones sin contraseña y login-password-less.php admite el inicio de sesión con hash de contraseña.

Respecto a la generación del hash de la contraseña y el archivo index.php, hay un pequeño detalle: el script utiliza getenv() para obtener la contraseña en lugar de usar directamente $_ENV. Esto evita un problema de configuración en php.ini que provoca que el cálculo del hash quede vacío. Yo mismo me topé con este problema y tardé mucho en descubrir que el ámbito 'E' no estaba habilitado en php.ini.

Para configurar la autenticación de Nginx, el script utiliza el mecanismo de inclusión nativo de HestiaCP en lugar de modificar directamente el archivo de configuración principal de Nginx. La ventaja de este enfoque es que la autenticación no fallará incluso si se reconstruye la configuración del dominio.

En la configuración de Fail2Ban, el script crea una regla de filtrado para monitorizar los errores 401. Si una IP falla al iniciar sesión 3 veces en 10 minutos, se bloqueará durante 1 hora.

En lo que respecta a la reparación de permisos y la recarga del servicio, el script configurará automáticamente los permisos de archivo correctos y recargará PHP-FPM, Nginx y Fail2Ban.

Me tomo la seguridad muy en serio.

Sinceramente, la seguridad de las herramientas de gestión de bases de datos es lo que más me preocupa.

Piénsalo, el administrador puede manipular directamente todas las bases de datos de tu servidor. Si está expuesto a internet y alguien lo escanea, las consecuencias serían inimaginables.

Este script tiene triple protección.

La primera capa es la autenticación básica HTTP de Nginx. Al acceder a Adminer, aparecerá un cuadro de diálogo en tu navegador solicitando tu nombre de usuario y contraseña. Solo después de ingresar la información correcta podrás ver la página de inicio de sesión de Adminer.

La segunda capa es el inicio de sesión con hash de contraseña del propio administrador. Configuré el hash de contraseña en index.php, de modo que incluso si alguien elude la autenticación de Nginx, no conocerá la contraseña de inicio de sesión del administrador.

La tercera capa es la protección contra ataques de fuerza bruta de Fail2Ban. Si alguien intenta descifrar tu contraseña mediante fuerza bruta, Fail2Ban bloqueará automáticamente su dirección IP.

Con estas tres capas de protección combinadas, básicamente puedes poner al administrador en internet público con total tranquilidad.

Funcionamiento con un solo clic, realmente es un solo clic.

El proceso de despliegue es extremadamente sencillo.

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

Cómo ejecutar el script: Otorgue al script permisos de ejecución:

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

Ejecuta el script usando sudo:

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

Introduzca la información de configuración cuando se le solicite:

  • Introduce tu nombre de usuario de HestiaCP (por ejemplo, admin).
  • Introduzca el subdominio completo preparado (por ejemplo, adminer.example.com).
  • Introduzca su contraseña de seguridad (p. ej., MiSupercontraseña123)

El script completará automáticamente todo el proceso de configuración sin omitir nada.

Todo el proceso dura aproximadamente uno o dos minutos. El script se encargará de todo automáticamente y no necesitarás ejecutar ningún comando manualmente.

Una vez que hayas terminado, puedes acceder a Adminer a través de https://tudominio/index.php

Algunas preguntas que podrían preocuparle

Algunos amigos podrían preguntar: ¿este script es compatible con varias versiones de PHP?

Sí, es compatible. El script detectará automáticamente todos los servicios PHP-FPM que se estén ejecutando en el sistema y los recargará uno por uno. Por lo tanto, funciona correctamente tanto si utiliza PHP 7.4 como PHP 8.2.

Algunos amigos podrían preguntar: ¿Qué pasa si quiero cambiar mi contraseña?

Es muy sencillo; solo tienes que volver a ejecutar el script. Este regenerará el hash de la contraseña, reconfigurará la autenticación de Nginx y reconfigurará Fail2Ban. La configuración anterior se sobrescribirá.

¿Y si quiero desinstalarlo?

Puedes eliminar manualmente el directorio raíz web, el archivo de contraseñas y la configuración de Fail2Ban. El script no dejará ningún otro rastro en el sistema.

Escribir al final

Siempre he pensado que las operaciones y el mantenimiento no deberían ser tan complicados.

Muchas tareas manuales pueden automatizarse mediante scripts. Esto te permite dedicar tu tiempo a asuntos más importantes, como optimizar el rendimiento del servidor, supervisar el estado de las aplicaciones e investigar nuevas tecnologías.

Esto me recuerda una historia. En la década de 1880, la electricidad comenzó a extenderse por Estados Unidos. Muchos dueños de fábricas invirtieron grandes sumas de dinero en la compra de generadores y motores eléctricos, que instalaron en sus fábricas. Sin embargo, tras la instalación, muchos descubrieron que la eficiencia de la producción no mejoró significativamente. Esto se debía a que solo habían reemplazado las máquinas de vapor por motores eléctricos, pero la distribución general, los procesos y los métodos de gestión de la fábrica permanecieron inalterados.

Quienes realmente se beneficiaron del auge de la electricidad fueron los primeros en comprender el verdadero significado de la electricidad. Rediseñaron las líneas de producción, reestructuraron los talleres y reorganizaron la forma en que trabajaban los empleados.

Lo mismo se aplica a la automatización de operaciones y mantenimiento. Mucha gente sabe que se pueden usar scripts, pero aún prefieren el trabajo manual, al igual que aquellos dueños de fábricas del pasado que conocían los motores eléctricos pero seguían utilizando la mentalidad de las máquinas de vapor. Los scripts no pretenden reemplazar tu criterio, sino automatizar tareas repetitivas, mecánicas y propensas a errores, permitiéndote concentrar tu energía en lo que realmente requiere reflexión.

Así surgió este script. Me solucionó un problema y espero que también te sea útil.

Si utilizas HestiaCP y Adminer, te recomendamos probar este script. Podría ahorrarte mucho tiempo.

Ya que has leído hasta aquí, si te ha resultado útil, dale a "Me gusta" y compártelo. Si quieres ser el primero en recibir las novedades, ¡también puedes seguirme!

Gracias por leer mi artículo. ¡Hasta la próxima!

发表 评论

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

Ir al Inicio