Drejtoria e artikujve
别再手动装Adminer了,一个脚本搞定全套安全配置
前两天我有个朋友,也是搞运维的,跟我吐槽说他每次在服务器上装Adminer,都得折腾大半天。不是Adminer本身有多难装,它就是一个PHP文件,扔上去就能用。但问题是,你不能光扔一个PHP文件上去就完事了。
你得配置子域名,得加载插件,得设置Nginx认证,还得配置Fail2Ban防暴力破解。每一步都不复杂,但加起来就是一堆零碎的命令和配置文件。
更烦人的是,认证和防火墙这种安全相关的配置,特别容易出错。稍微疏忽一下,数据库管理界面就暴露在公网上了,谁都能访问。
我当时就乐了,因为我之前也是这样的。后来我实在受不了了,就写了个一键部署脚本,把所有这些步骤都自动化了。

Pse të mos përdoretphpMyAdmin
你可能会问,为什么不用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 完美版)
================================================== ===============================
vendos -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 = ^
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配置就行了。脚本不会在系统上留下其他痕迹。
shkruani në fund
我一直觉得,运维这件事,不应该那么复杂。
很多手动操作,其实都可以用脚本来自动化。这样你就能把时间花在更重要的事情上,比如优化服务器性能,比如监控应用状态,比如研究新技术。
这让我想起了一个历史故事,1880年代,电力开始在美国普及,当时很多工厂主花大价钱买了发电机和电动机,装在自己的工厂里。但是装完之后,很多人发现生产效率并没有显著提升。因为他们只是用电动机替代了蒸汽机,但整个工厂的布局、流程、管理方式都没有变。
真正吃到电力红利的人,是那些最早想明白,电力到底意味着什么的那波人。他们重新设计了生产线,重新规划了车间布局,重新组织了工人的工作方式。
运维自动化也是一样。很多人知道可以用脚本,但还是习惯手动操作,就像当年那些工厂主,知道有电动机,但还是用蒸汽机的思维来使用它。脚本不是用来替代你的判断力的,而是把那些重复的、机械的、容易出错的事情自动处理掉,让你能把精力放在真正需要思考的地方。
这个脚本就是这样诞生的。它解决了我自己的一个痛点,我也希望它能帮到你。
如果你也在用HestiaCP,也在用Adminer,不妨试试这个脚本。说不定,它能帮你省下不少时间。
Meqenëse e lexuat deri këtu, nëse e gjetët të dobishme, ju lutem pëlqeni dhe shpërndajeni. Nëse doni të merrni përditësime të parët, mund të më ndiqni edhe mua!
Faleminderit që lexuat artikullin tim. Shihemi herën tjetër.
Blogu Hope Chen Weiliang ( https://www.chenweiliang.com/ ) 分享的《HestiaCP一键自动化部署Adminer脚本(含 Nginx 认证 + Fail2Ban 双重防护)》,对您有帮助。
Mirë se vini të shpërndani lidhjen e këtij artikulli:https://www.chenweiliang.com/cwl-34395.html
