HestiaCP bay deplwaman otomatik yon sèl klike sou script Adminer la (ki gen ladan otantifikasyon Nginx + pwoteksyon doub Fail2Ban).

Sispann enstale Adminer manyèlman! Yon sèl script ka jere tout konfigirasyon sekirite a.

Sa gen kèk jou, yon zanmi mwen, ki travay tou nan administrasyon sistèm, te plenyen ban mwen ke li pran l prèske tout jounen an pou l enstale Adminer sou sèvè li a. Se pa ke Adminer li menm difisil pou enstale; se jis yon fichye PHP, ou ka jis lanse l epi l ap mache. Men pwoblèm nan se, ou pa ka jis lanse yon fichye PHP epi fini ak sa.

Ou bezwen konfigire soudomèn yo, chaje plugins yo, mete kanpe otantifikasyon Nginx la, epi konfigire Fail2Ban pou anpeche atak fòs brit. Chak etap pa konplike, men ansanm yo lakòz yon pakèt kòmand ak fichye konfigirasyon fragmenté.

Sa ki pi anmèdan toujou se ke konfigirasyon ki gen rapò ak sekirite tankou otantifikasyon ak pare-feu yo patikilyèman gen tandans pou yo gen erè. Yon ti neglijans ka ekspoze koòdone jesyon baz done a bay entènèt piblik la, sa ki fè li aksesib a nenpòt moun.

Mwen te ri lè sa a paske mwen te konn fè menm bagay la anvan. Apre sa, mwen pa t ka sipòte l ankò, donk mwen te ekri yon script deplwaman yon sèl klike pou otomatize tout etap sa yo.

HestiaCP bay deplwaman otomatik yon sèl klike sou script Adminer la (ki gen ladan otantifikasyon Nginx + pwoteksyon doub Fail2Ban).

Poukisa ou pa itilizefpmyadmen

Ou ta ka mande, poukisa ou pa itilize phpMyAdmin, ki pi komen?

Se vre, phpMyAdmin gen plis itilizatè ak yon kominote ki pi laj. Men, mwen panse Adminer fè yon pi bon travay nan kèk domèn.

Premyèman, li lejè; Adminer se jis yon sèl fichye PHP, alòske phpMyAdmin se yon pakèt fichye. Dezyèmman, li an sekirite; Filozofi konsepsyon Adminer a se "pa fyab pa default," sa vle di ou bezwen konfigire enfòmasyon koneksyon an eksplisitman pou opere baz done a.

Yon lòt aspè se pèfòmans; Adminer pi rapid pase phpMyAdmin lè l ap jere gwo baz done.

Natirèlman, okenn nan bagay sa yo pa pi enpòtan. Bagay ki pi enpòtan an se ke script sa a vle di mwen pa bezwen konfigire bagay sa yo ki gen rapò ak sekirite manyèlman ankò.

Kisa egzakteman senaryo a te fè?

Lidé ki dèyè script sa a vrèman senp: otomatize tout etap ou nòmalman fè manyèlman.

Pou antre entèaktif, script la ap poze w kèk kesyon: non itilizatè HestiaCP , non domèn, non itilizatè otantifikasyon, ak modpas. Ou sèlman bezwen antre sa yo, epi script la ap okipe rès la.

Skript la kreye anyè rasin entènèt la otomatikman, li tcheke si apache2-utils (ki itilize pou jenere fichye modpas) ak anviwònman PHP a enstale, epi li jere kreyasyon anyè ak enstalasyon depandans.

Lè w ap telechaje Adminer, script la premye eseye telechaje dènye vèsyon an nan depo ofisyèl la. Si depo ofisyèl la pa disponib, li otomatikman chanje nan depo GitHub Releases ki estab la. Mwen panse sa enpòtan anpil, paske depo ofisyèl la ka pafwa enstab; mwen te deja rankontre pwoblèm koneksyon ki pa fonksyone byen anvan.

Konsènan telechajman plugin yo, script la pral telechaje twa plugin prensipal yo: plugin.php se loader plugin nan, fc-sqlite-connection-without-credentials.php itilize pou jere koneksyon san modpas, epi login-password-less.php sipòte koneksyon ak hach ​​modpas.

Konsènan jenerasyon hach ​​modpas la ak index.php, gen yon ti detay: script la itilize getenv() pou rekipere modpas la olye pou l itilize $_ENV dirèkteman. Sa evite yon pwoblèm konfigirasyon php.ini ki lakòz kalkil hach ​​la vid. Mwen menm mwen te rankontre pyèj sa a epi mwen te pase anpil tan ap chèche konnen ke scope 'E' a pa te aktive nan php.ini.

Pou konfigire otantifikasyon Nginx la, script la itilize mekanis enklizyon natif natal HestiaCP a olye pou l modifye dirèkteman fichye konfigirasyon prensipal Nginx la. Avantaj apwòch sa a se ke otantifikasyon an p ap echwe menm si ou rebati konfigirasyon domèn nan.

Nan konfigirasyon Fail2Ban an, script la kreye yon règ filtraj pou kontwole erè 401 yo. Si yon IP pa konekte 3 fwa nan 10 minit, li pral bloke pandan 1 èdtan.

Konsènan reparasyon pèmisyon yo ak rechaje sèvis la, script la pral otomatikman mete pèmisyon fichye ki kòrèk yo epi rechaje PHP-FPM, Nginx, ak Fail2Ban.

Mwen serye sou sekirite.

Onètman, sekirite zouti jesyon baz done yo se bagay ki pi enpòtan pou mwen.

Reflechi sou sa, yon administratè ka manipile tout baz done ki sou sèvè w la dirèkteman. Si li ekspoze a entènèt piblik la epi yon moun eskane li, konsekans yo t ap inimajinab.

Script sa a gen trip pwoteksyon.

Premye kouch la se Otantifikasyon HTTP Debaz Nginx la. Lè ou antre nan Adminer, navigatè w la ap montre yon bwat dyalòg ki mande w pou w antre non itilizatè w ak modpas ou. Se sèlman apre w fin antre enfòmasyon ki kòrèk yo ou ka wè paj koneksyon Administratè a.

Dezyèm kouch la se pwòp modpas koneksyon Administratè a ki fonksyone ak hachaj. Mwen te konfigire hachaj modpas nan index.php, kidonk menm si yon moun pa itilize otantifikasyon Nginx la, yo p ap konnen modpas koneksyon Administratè a.

Twazyèm kouch la se pwoteksyon fòs brit Fail2Ban an. Si yon moun eseye fòse modpas ou a, Fail2Ban ap otomatikman bloke adrès IP yo a.

Avèk twa kouch pwoteksyon sa yo konbine, ou ka fondamantalman mete Administratè sou entènèt piblik la ak lapè lespri.

Operasyon yon sèl klike, se vreman yon sèl klike.

Pwosesis deplwaman an trè senp.

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

Kijan pou egzekite script la: Bay script la pèmisyon egzekisyon:

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

Kouri script la avèk sudo:

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

Antre enfòmasyon konfigirasyon an jan yo mande w la:

  • Antre non itilizatè HestiaCP ou a (pa egzanp, admin).
  • Antre soudomèn konplè ki prepare a (pa egzanp, adminer.example.com).
  • Antre modpas sekirite ou a (pa egzanp, MySuperPassword123)

Script la ap otomatikman konplete tout pwosesis konfigirasyon an san l pa kite anyen deyò.

Pwosesis la an antye pran apeprè youn oubyen de minit. Skript la ap jere tout bagay otomatikman, epi ou pa bezwen egzekite okenn kòmand manyèlman.

Apre ou fini, ou ka jwenn aksè nan Adminer atravè https://yourdomain/index.php

Gen kèk kesyon ou ka ap enkyete w pou yo

Gen kèk zanmi ki ka mande, èske script sa a sipòte plizyè vèsyon PHP?

Wi, li sipòte. Skript la pral otomatikman detekte tout sèvis PHP-FPM k ap fonksyone sou sistèm nan epi rechaje yo youn pa youn. Kidonk li fonksyone byen kit w ap itilize PHP 7.4 oswa PHP 8.2.

Gen kèk zanmi ki ta ka mande, e si mwen vle chanje modpas mwen an?

Li trè senp; jis egzekite script la ankò. Script la pral rejenere hash modpas la, rekonfigure otantifikasyon Nginx la, epi rekonfigure Fail2Ban an. Ansyen konfigirasyon an pral ranplase.

E si mwen vle dezenstale li?

Ou ka tou senpleman efase anyè rasin entènèt la, fichye modpas la, ak konfigirasyon Fail2Ban an manyèlman. Script la p ap kite okenn lòt tras sou sistèm nan.

Ekri nan dènye a

Mwen toujou panse operasyon ak antretyen pa ta dwe tèlman konplike.

Anpil travay manyèl ka aktyèlman otomatize lè l sèvi avèk script. Sa pèmèt ou pase tan ou sou bagay ki pi enpòtan, tankou optimize pèfòmans sèvè, siveye estati aplikasyon yo, epi fè rechèch sou nouvo teknoloji.

Sa fè m sonje yon istwa istorik. Nan ane 1880 yo, elektrisite te kòmanse gaye Ozetazini. Anpil pwopriyetè faktori te depanse anpil lajan pou achte dèlko ak motè elektrik epi enstale yo nan faktori yo. Sepandan, apre enstalasyon an, anpil te jwenn ke efikasite pwodiksyon an pa t amelyore anpil. Sa a te paske yo te sèlman ranplase motè vapè ak motè elektrik, men plan jeneral, pwosesis yo ak metòd jesyon faktori a te rete menm jan an.

Moun ki te vrèman benefisye de boom elektrisite a se te premye moun ki te konprann sa elektrisite reyèlman vle di. Yo te reamenaje liy pwodiksyon yo, restriktire atelye yo, epi reòganize fason travayè yo te opere.

Menm bagay la tou aplike pou operasyon ak automatisation antretyen. Anpil moun konnen yo ka itilize script, men yo toujou prefere operasyon manyèl, menm jan ak pwopriyetè faktori nan tan lontan ki te konnen motè elektrik men ki te toujou itilize mantalite motè vapè pou itilize yo. Script yo pa fèt pou ranplase jijman ou, men pou otomatize travay repetitif, mekanik ak ki gen tandans fè erè, sa ki pèmèt ou konsantre enèji ou sou sa ki vrèman mande refleksyon.

Men kijan script sa a te fèt. Li te rezoud yon pwoblèm pou mwen, epi mwen espere li ka ede ou tou.

Si w ap itilize HestiaCP ak Adminer, ou ta ka vle eseye script sa a. Li ta ka fè w ekonomize anpil tan.

Piske ou fin li tout sa, si ou twouve l itil, tanpri like li epi pataje li. Si ou vle resevwa dènye nouvèl yo an premye, ou ka swiv mwen tou!

Mèsi paske ou li atik mwen an. N a wè pita.

kòmantè

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

Ki gen tèt