2026年7月24日星期五

HestiaCP一键自动化部署Adminer脚本(含 Nginx 认证 + Fail2Ban 双重防护)

原文链接:https://www.chenweiliang.com/cwl-34395.html


文章目录



别再手动装Adminer了,一个脚本搞定全套安全配置


前两天我有个朋友,也是搞运维的,跟我吐槽说他每次在服务器上装Adminer,都得折腾大半天。不是Adminer本身有多难装,它就是一个PHP文件,扔上去就能用。但问题是,你不能光扔一个PHP文件上去就完事了。


你得配置子域名,得加载插件,得设置Nginx认证,还得配置Fail2Ban防暴力破解。每一步都不复杂,但加起来就是一堆零碎的命令和配置文件。


更烦人的是,认证和防火墙这种安全相关的配置,特别容易出错。稍微疏忽一下,数据库管理界面就暴露在公网上了,谁都能访问。


我当时就乐了,因为我之前也是这样的。后来我实在受不了了,就写了个一键部署脚本,把所有这些步骤都自动化了。


HestiaCP一键自动化部署Adminer脚本(含 Nginx 认证 + Fail2Ban 双重防护)


为什么不用phpMyAdmin


你可能会问,为什么不用phpMyAdmin,那个更主流。


确实,phpMyAdmin用的人更多,社区也更大。但我觉得Adminer有几个地方做得更好。


首先是轻量,Adminer整个就一个PHP文件,phpMyAdmin是一大堆文件。其次是安全性,Adminer的设计理念是「默认不信任」,你需要显式地配置连接信息才能操作数据库。


还有就是性能,Adminer在处理大数据库的时候,比phpMyAdmin快不少。


当然,这些都不是最重要的。最重要的是,这个脚本让我再也不用手动配置那些安全相关的玩意了。


脚本到底做了什么


这个脚本的思路其实很简单,就是把你平时手动做的那些步骤,全部自动化。


交互式输入这块,脚本会问你几个问题,HestiaCP用户名、域名、认证用户名和密码。你只需要输入这些,剩下的全交给脚本。


创建目录和安装依赖这块,脚本会自动创建Web根目录,检查有没有安装apache2-utils,用来生成密码文件的,还有PHP环境。


下载Adminer这块,脚本会先从官方源下载最新版,如果官方源连不上,自动切换到GitHub Releases的稳定源。这点我觉得挺重要的,官方源有时候确实不太稳定,我之前就遇到过连接超时的情况。


下载插件这块,脚本会下载三个核心插件,plugin.php是插件加载器,fc-sqlite-connection-without-credentials.php用来处理无密码连接,login-password-less.php支持密码哈希登录。


生成密码Hash和index.php这块,这里有个小细节,脚本用getenv()来获取密码,而不是直接用$_ENV,这样可以避免php.ini配置问题导致Hash计算为空。我自己就踩过这个坑,当时搞了半天才发现是php.ini没开启E作用域。


配置Nginx认证这块,脚本用的是HestiaCP的原生Include机制,不是直接修改Nginx主配置文件。这样做的好处是,即使你重建了域名配置,认证也不会失效。


配置Fail2Ban这块,脚本会创建一个过滤规则,监控401错误,如果某个IP在10分钟内尝试登录失败3次,就封禁它1小时。


修复权限和重载服务这块,脚本会自动设置正确的文件权限,重载PHP-FPM、Nginx和Fail2Ban。


安全这块,我是认真的


说真的,数据库管理工具的安全性,是我最在意的一件事。


你想啊,Adminer这个东西,它是可以直接操作你服务器上所有数据库的。如果暴露在公网上,被人扫到,那后果不堪设想。


这个脚本做了三重保护。


第一重是Nginx的HTTP Basic Auth。你访问Adminer的时候,浏览器会弹出一个对话框,让你输入用户名和密码。只有输入正确了,才能看到Adminer的登录界面。


第二重是Adminer自身的密码哈希登录。我在index.php里配置了密码哈希,这样即使有人绕过了Nginx认证,也不知道Adminer的登录密码。


第三重是Fail2Ban的暴力破解防护。如果有人试图暴力破解你的密码,Fail2Ban会自动把他的IP封掉。


这三重保护加在一起,基本上可以放心把Adminer放在公网上了。


一键运行,真的就是一键


部署的过程特别简单。


#!/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 = ^ – . “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 “==================================================”


如何运行该脚本: 赋予脚本执行权限:


Bash sudo chmod +x /usr/local/bin/deploy-adminer.sh 使用 sudo 运行脚本:


Bash sudo /usr/local/bin/deploy-adminer.sh 按提示输入配置信息:


输入你的 HestiaCP 用户名(如 admin)


输入准备好的完整子域名(如 adminer.example.com)


输入你的防护密码(例如 MySuperPassword123)


脚本将自动全流程配置完成,绝不留手。


你先把脚本保存到服务器上,比如: /usr/local/bin/deploy-adminer.sh


然后赋予执行权限,sudo chmod +x /usr/local/bin/deploy-adminer.sh。


然后运行它,sudo /usr/local/bin/deploy-adminer.sh。


脚本会问你几个问题,你输入HestiaCP用户名、域名、认证用户名和密码,然后就等着就行了。


整个过程大概一两分钟,脚本会自动处理所有事情,你不需要手动执行任何命令。


做完之后,你就可以通过https://你的域名/index.php访问Adminer了。


一些你可能关心的问题


有朋友可能会问,这个脚本支持多PHP版本吗?


支持的。脚本会自动检测系统上运行的所有PHP-FPM服务,并逐个重载。所以不管你是用PHP 7.4还是PHP 8.2,都没问题。


还有朋友可能会问,如果我想换密码怎么办?


很简单,重新运行脚本就行了。脚本会重新生成密码Hash,重新配置Nginx认证,重新配置Fail2Ban。旧的配置会被覆盖。


那如果我想卸载呢?


你就手动删除Web根目录、密码文件和Fail2Ban配置就行了。脚本不会在系统上留下其他痕迹。


写在最后


我一直觉得,运维这件事,不应该那么复杂。


很多手动操作,其实都可以用脚本来自动化。这样你就能把时间花在更重要的事情上,比如优化服务器性能,比如监控应用状态,比如研究新技术。


这让我想起了一个历史故事,1880年代,电力开始在美国普及,当时很多工厂主花大价钱买了发电机和电动机,装在自己的工厂里。但是装完之后,很多人发现生产效率并没有显著提升。因为他们只是用电动机替代了蒸汽机,但整个工厂的布局、流程、管理方式都没有变。


真正吃到电力红利的人,是那些最早想明白,电力到底意味着什么的那波人。他们重新设计了生产线,重新规划了车间布局,重新组织了工人的工作方式。


运维自动化也是一样。很多人知道可以用脚本,但还是习惯手动操作,就像当年那些工厂主,知道有电动机,但还是用蒸汽机的思维来使用它。脚本不是用来替代你的判断力的,而是把那些重复的、机械的、容易出错的事情自动处理掉,让你能把精力放在真正需要思考的地方。


这个脚本就是这样诞生的。它解决了我自己的一个痛点,我也希望它能帮到你。


如果你也在用HestiaCP,也在用Adminer,不妨试试这个脚本。说不定,它能帮你省下不少时间。


以上,既然看到这里了,如果觉得不错,随手点赞、转发吧,如果想第一时间收到推送,也可以给我个关注~


谢谢你看我的文章,我们,下次再见。





欢迎转载《HestiaCP一键自动化部署Adminer脚本(含 Nginx 认证 + Fail2Ban 双重防护)

欢迎分享本文链接:https://www.chenweiliang.com/cwl-34395.html


网站地址:https://www.chenweiliang.com/



欲获取更多资讯内幕和秘技,欢迎进入Telegram频道:https://www.chenweiliang.com/go/tgchannel

没有评论:

发表评论