HestiaCP erbjuder automatisk distribution av Adminer-skriptet med ett klick (inklusive Nginx-autentisering + dubbelt skydd mot Fail2Ban).

Sluta installera Adminer manuellt! Ett enda skript kan hantera hela säkerhetskonfigurationen.

För ett par dagar sedan klagade en vän till mig, som också jobbar med systemadministration, på att det tar honom större delen av dagen att installera Adminer på sin server. Det är inte så att Adminer i sig är svårt att installera; det är bara en PHP-fil, du kan bara starta den så fungerar den. Men problemet är att du inte bara kan starta en PHP-fil och bara sluta använda den.

Du behöver konfigurera underdomäner, ladda plugins, ställa in Nginx-autentisering och konfigurera Fail2Ban för att förhindra brute-force-attacker. Varje steg är inte komplicerat, men tillsammans utgör de en massa fragmenterade kommandon och konfigurationsfiler.

Ännu mer irriterande är att säkerhetsrelaterade konfigurationer som autentisering och brandväggar är särskilt benägna att orsaka fel. Ett litet misstag kan exponera databashanteringsgränssnittet för det offentliga internet, vilket gör det tillgängligt för vem som helst.

Jag skrattade då eftersom jag hade gjort samma sak förut. Senare stod jag inte ut längre, så jag skrev ett driftsättningsskript med ett enda klick för att automatisera alla dessa steg.

HestiaCP erbjuder automatisk distribution av Adminer-skriptet med ett klick (inklusive Nginx-autentisering + dubbelt skydd mot Fail2Ban).

Varför inte användaphpMyAdmin

Du kanske undrar, varför inte använda phpMyAdmin, som är mer vanligt?

Visserligen har phpMyAdmin fler användare och en större community. Men jag tycker att Adminer gör ett bättre jobb på några områden.

För det första är det lätt; Adminer är bara en enda PHP-fil, medan phpMyAdmin är en hel massa filer. För det andra är det säkert; Adminers designfilosofi är "icke betrodd som standard", vilket innebär att du explicit måste konfigurera anslutningsinformation för att driva databasen.

En annan aspekt är prestanda; Adminer är betydligt snabbare än phpMyAdmin vid hantering av stora databaser.

Naturligtvis är inget av detta det viktigaste. Det viktigaste är att det här skriptet innebär att jag inte längre behöver konfigurera de säkerhetsrelaterade sakerna manuellt.

Vad gjorde manuset egentligen?

Idén bakom det här skriptet är faktiskt ganska enkel: att automatisera alla steg du normalt gör manuellt.

För interaktiv inmatning kommer skriptet att ställa några frågor: HestiaCP användarnamn, domännamn, autentiseringsanvändarnamn och lösenord. Du behöver bara ange dessa, så hanterar skriptet resten.

Skriptet skapar automatiskt webbens rotkatalog, kontrollerar om apache2-utils (används för att generera lösenordsfiler) och PHP-miljön är installerade, och hanterar skapandet av kataloger och installationen av beroenden.

När man laddar ner Adminer försöker skriptet först ladda ner den senaste versionen från det officiella arkivet. Om det officiella arkivet inte är tillgängligt växlar det automatiskt till det stabila GitHub Releases-arkivet. Jag tycker att detta är ganska viktigt, eftersom det officiella arkivet ibland kan vara instabilt; jag har stött på timeouts för anslutningen tidigare.

Angående nedladdningar av plugin-program kommer skriptet att ladda ner tre centrala plugin-program: plugin.php laddar plugin-programmet, fc-sqlite-connection-without-credentials.php används för att hantera lösenordslösa anslutningar och login-password-less.php stöder hash-inloggning med lösenord.

Angående generering av lösenordshash och index.php finns det en liten detalj: skriptet använder getenv() för att hämta lösenordet istället för att direkt använda $_ENV. Detta undviker ett php.ini-konfigurationsproblem som gör att hashberäkningen blir tom. Jag stötte själv på denna fallgrop och lade lång tid på att lista ut att 'E'-scopet inte var aktiverat i php.ini.

För att konfigurera Nginx-autentisering använder skriptet HestiaCPs inbyggda inkluderingsmekanism istället för att direkt modifiera Nginx huvudkonfigurationsfil. Fördelen med denna metod är att autentiseringen inte kommer att misslyckas även om du återskapar domänkonfigurationen.

I Fail2Ban-konfigurationen skapar skriptet en filtreringsregel för att övervaka 401-fel. Om en IP-adress misslyckas med att logga in 3 gånger inom 10 minuter blockeras den i 1 timme.

Angående reparation av behörigheter och omladdning av tjänster, kommer skriptet automatiskt att ställa in korrekta filbehörigheter och ladda om PHP-FPM, Nginx och Fail2Ban.

Jag menar allvar med säkerheten.

Ärligt talat är säkerheten för databashanteringsverktyg det jag bryr mig mest om.

Tänk på det, administratörer kan direkt manipulera alla databaser på din server. Om de exponeras för det offentliga internet och någon skannar dem, skulle konsekvenserna vara ofattbara.

Detta skript har trippelt skydd.

Det första lagret är Nginx HTTP Basic Auth. När du öppnar Adminer kommer din webbläsare att visa en dialogruta där du ombeds ange ditt användarnamn och lösenord. Först efter att du har angett korrekt information kan du se inloggningssidan för Admin.

Det andra lagret är administratörens egen lösenordshash-inloggning. Jag konfigurerade lösenordshashing i index.php, så även om någon kringgår Nginx-autentisering kommer de inte att känna till administratörens inloggningslösenord.

Det tredje lagret är Fail2Bans brute-force-skydd. Om någon försöker brute-forcera ditt lösenord kommer Fail2Ban automatiskt att blockera deras IP-adress.

Med dessa tre skyddslager kombinerade kan du i princip sätta upp Administrator på det offentliga internet med sinnesro.

Ett klick, det är verkligen ett klick.

Implementeringsprocessen är extremt enkel.

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

Så här kör du skriptet: Ge skriptet körningsbehörighet:

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

Kör skriptet med sudo:

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

Ange konfigurationsinformationen enligt anvisningarna:

  • Ange ditt HestiaCP-användarnamn (t.ex. admin).
  • Ange den förberedda fullständiga underdomänen (t.ex. administratör.exampel.com).
  • Ange ditt säkerhetslösenord (t.ex. MySuperPassword123)

Skriptet kommer automatiskt att slutföra hela konfigurationsprocessen utan att utelämna något.

Hela processen tar ungefär en eller två minuter. Skriptet hanterar allt automatiskt, och du behöver inte köra några kommandon manuellt.

När du är klar kan du komma åt Admin via https://dindomän/index.php

Några frågor du kan oroa dig för

Vissa vänner kanske frågar, stöder det här skriptet flera PHP-versioner?

Ja, det stöds. Skriptet kommer automatiskt att upptäcka alla PHP-FPM-tjänster som körs på systemet och ladda om dem en efter en. Så det fungerar bra oavsett om du använder PHP 7.4 eller PHP 8.2.

Vissa vänner kanske frågar, tänk om jag vill ändra mitt lösenord?

Det är väldigt enkelt; kör bara skriptet igen. Skriptet kommer att generera lösenordshashen, omkonfigurera Nginx-autentisering och omkonfigurera Fail2Ban. Den gamla konfigurationen kommer att skrivas över.

Vad händer om jag vill avinstallera det?

Du kan helt enkelt ta bort webbens rotkatalog, lösenordsfilen och Fail2Ban-konfigurationen manuellt. Skriptet kommer inte att lämna några andra spår på systemet.

Skriv i slutet

Jag har alltid känt att drift och underhåll inte borde vara så komplicerat.

Många manuella uppgifter kan faktiskt automatiseras med hjälp av skript. Detta gör att du kan lägga din tid på viktigare saker, som att optimera serverprestanda, övervaka applikationsstatus och undersöka nya tekniker.

Detta påminner mig om en historisk berättelse. På 1880-talet började elektricitet bli utbredd i USA. Vid den tiden spenderade många fabriksägare mycket pengar på att köpa generatorer och elmotorer och installera dem i sina fabriker. Men efter installationen upptäckte många att produktionseffektiviteten inte förbättrades nämnvärt. Detta berodde på att de bara hade ersatt ångmaskiner med elmotorer, men fabrikens övergripande layout, processer och ledningsmetoder förblev oförändrade.

De som verkligen gynnades av elboomen var de första som förstod vad elektricitet egentligen innebar. De omformade produktionslinjer, omstrukturerade verkstäder och omorganiserade hur arbetarna arbetade.

Detsamma gäller för automatisering av drift och underhåll. Många vet att skript kan användas, men de föredrar fortfarande manuell drift, precis som de fabriksägare förr i tiden som kände till elmotorer men ändå använde ångmaskinernas tankesätt för att använda dem. Skript är inte avsedda att ersätta ditt omdöme, utan att automatisera repetitiva, mekaniska och felbenägna uppgifter, så att du kan fokusera din energi på det som verkligen kräver tanke.

Så här kom det här manuset till. Det löste en problematisk fråga för mig, och jag hoppas att det kan hjälpa dig också.

Om du använder HestiaCP och Adminer kanske du vill prova det här skriptet. Det kan spara dig mycket tid.

Eftersom du har läst så här långt, om du tyckte att det var hjälpsamt, gilla och dela det gärna. Om du vill få uppdateringar först kan du också följa mig!

Tack för att du läste min artikel. Vi ses nästa gång.

发表 评论

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

Bläddra till början