HestiaCP ҷойгиркунии автоматии скрипти Adminer-ро бо як клик таъмин мекунад (аз ҷумла аутентификатсияи Nginx + ҳимояи дугонаи Fail2Ban).

Насби дастӣ барои Adminer-ро қатъ кунед! Як скрипт метавонад тамоми конфигуратсияи амниятиро идора кунад.

Чанд рӯз пеш, як дӯстам, ки дар соҳаи маъмурияти система низ кор мекунад, ба ман шикоят кард, ки аксари рӯзро барои насб кардани Adminer дар сервераш сарф мекунад. Ин маънои онро надорад, ки худи Adminer насб карданаш душвор аст; ин танҳо як файли PHP аст, шумо метавонед онро танҳо партоед ва он кор хоҳад кард. Аммо мушкил дар он аст, ки шумо наметавонед танҳо як файли PHP-ро партоед ва онро як рӯз даъват кунед.

Барои пешгирӣ аз ҳамлаҳои brute-force , шумо бояд зердоменҳоро танзим кунед, плагинҳоро бор кунед, аутентификатсияи Nginx-ро танзим кунед ва Fail2Ban-ро танзим кунед . Ҳар як қадам мураккаб нест, аммо онҳо якҷоя як даста фармонҳои фрагментӣ ва файлҳои конфигуратсияро ташкил медиҳанд.

Чизи аз ҳама нохушояндтар ин аст, ки конфигуратсияҳои марбут ба амният, ба монанди аутентификатсия ва деворҳои оташӣ, ба хатогиҳо бештар майл доранд. Як нодидагирии ночиз метавонад интерфейси идоракунии пойгоҳи додаҳоро ба интернети ҷамъиятӣ фош кунад ва онро барои ҳама дастрас гардонад.

Ман дар он вақт хандидам, зеро қаблан низ ҳамин корро мекардам. Баъдтар, дигар тоқат карда натавонистам, аз ин рӯ скрипти ҷойгиркунии як кликро барои автоматикунонии ҳамаи ин қадамҳо навиштам.

HestiaCP ҷойгиркунии автоматии скрипти Adminer-ро бо як клик таъмин мекунад (аз ҷумла аутентификатсияи Nginx + ҳимояи дугонаи Fail2Ban).

Чаро истифода набаредphpMyAdmin

Шумо метавонед пурсед, ки чаро phpMyAdmin-ро, ки маъмултар аст, истифода набаред?

Дар ҳақиқат, phpMyAdmin корбарони бештар ва ҷомеаи васеътар дорад. Аммо ман фикр мекунам, ки Adminer дар чанд самт кори беҳтареро анҷом медиҳад.

Аввалан, он сабук аст; Adminer танҳо як файли PHP аст, дар ҳоле ки phpMyAdmin як маҷмӯи пурраи файлҳо мебошад. Дуюм, он бехатар аст; Фалсафаи тарроҳии Adminer "пешфарз нобовар аст", яъне шумо бояд маълумоти пайвастшавиро барои кор бо пойгоҳи додаҳо ба таври возеҳ танзим кунед.

Ҷанбаи дигар ин самаранокӣ аст; Adminer ҳангоми коркарди пойгоҳҳои додаҳои калон нисбат ба phpMyAdmin хеле зудтар аст.

Албатта, ҳеҷ яке аз инҳо муҳимтарин чизҳо нестанд. Муҳимтар аз ҳама он аст, ки ин скрипт маънои онро дорад, ки ман дигар маҷбур нестам, ки ин чизҳои марбут ба амниятро дастӣ танзим кунам.

Скрипт дар асл чӣ кор мекард?

Идеяи ин скрипт дар асл хеле содда аст: автоматикунонии ҳамаи қадамҳое, ки шумо одатан дастӣ анҷом медиҳед.

Барои вуруди интерактивӣ, скрипт аз шумо чанд савол медиҳад: номи корбарии HestiaCP , номи домен, номи корбарии аутентификатсия ва парол. Шумо танҳо бояд инҳоро ворид кунед ва скрипт боқимондаро идора мекунад.

Скрипт ба таври худкор директорияи решаи вебро эҷод мекунад, тафтиш мекунад, ки оё apache2-utils (барои тавлиди файлҳои парол истифода мешавад) ва муҳити PHP насб шудаанд ва эҷоди директория ва насби вобастагиро идора мекунад.

Ҳангоми зеркашӣ кардани Adminer, скрипт аввал кӯшиш мекунад, ки версияи охиринро аз анбори расмӣ зеркашӣ кунад. Агар анбори расмӣ дастрас набошад, он ба таври худкор ба анбори устувори GitHub Releases мегузарад. Ман фикр мекунам, ки ин хеле муҳим аст, зеро анбори расмӣ баъзан метавонад ноустувор бошад; Ман қаблан бо тайм-аутҳои пайвастшавӣ дучор шуда будам.

Дар мавриди зеркашиҳои плагинҳо, скрипт се плагини асосиро зеркашӣ мекунад: plugin.php боркунандаи плагин аст, fc-sqlite-connection-without-credentials.php барои коркарди пайвастҳои бепарол истифода мешавад ва login-password-less.php воридшавии хэш-паролро дастгирӣ мекунад.

Дар мавриди тавлиди хэш-парол ва index.php, як ҷузъиёти хурд вуҷуд дорад: скрипт ба ҷои истифодаи мустақими $_ENV, аз getenv() барои гирифтани парол истифода мебарад. Ин аз мушкилоти танзимоти php.ini, ки боиси холӣ будани ҳисобкунии хэш мегардад, пешгирӣ мекунад. Ман худам бо ин мушкилот дучор шудам ва каме вақт лозим шуд, то фаҳмам, ки диапазони 'E' дар php.ini фаъол нест.

Барои танзим кардани аутентификатсияи Nginx, скрипт ба ҷои тағир додани мустақими файли асосии конфигуратсияи Nginx, механизми дохилии HestiaCP-ро истифода мебарад. Бартарии ин равиш дар он аст, ки ҳатто агар шумо конфигуратсияи доменро аз нав созед, аутентификатсия ноком намешавад.

Дар конфигуратсияи Fail2Ban, скрипт қоидаи филтркуниро барои назорат кардани хатогиҳои 401 эҷод мекунад. Агар IP дар давоми 10 дақиқа 3 маротиба ворид нашавад, он барои 1 соат масдуд карда мешавад.

Дар мавриди таъмири иҷозатҳо ва аз нав боркунии хидмат, скрипт ба таври худкор иҷозатҳои дурусти файлро муқаррар мекунад ва PHP-FPM, Nginx ва Fail2Ban-ро аз нав бор мекунад.

Ман дар бораи бехатарӣ ҷиддӣ ҳастам.

Ростӣ, амнияти абзорҳои идоракунии пойгоҳи додаҳо чизест, ки барои ман аз ҳама бештар муҳим аст.

Дар ин бора фикр кунед, администратор метавонад ҳамаи пойгоҳҳои додаҳои сервери шуморо мустақиман идора кунад. Агар он ба интернети ҷамъиятӣ дастрасӣ дошта бошад ва касе онро скан кунад, оқибатҳояш тасаввурнашаванда хоҳанд буд.

Ин скрипт дорои ҳимояи сегона мебошад.

Қабати аввал HTTP Basic Auth аз Nginx мебошад. Вақте ки шумо ба Adminer ворид мешавед, браузери шумо қуттии муколамаеро пайдо мекунад, ки аз шумо хоҳиш мекунад, ки номи корбар ва пароли худро ворид кунед. Танҳо пас аз ворид кардани маълумоти дуруст шумо метавонед саҳифаи вуруди Adminer-ро бубинед.

Қабати дуюм воридшавии хэш-пароли худи администратор аст. Ман хэш-паролро дар index.php танзим кардам, аз ин рӯ, ҳатто агар касе аутентификатсияи Nginx-ро сарфи назар кунад ҳам, онҳо пароли воридшавии администраторро намедонанд.

Қабати сеюм муҳофизати brute-force-и Fail2Ban аст. Агар касе кӯшиш кунад, ки пароли шуморо brute-force-и худкор истифода барад, Fail2Ban ба таври худкор суроғаи IP-и онҳоро масдуд мекунад.

Бо якҷоя кардани ин се сатҳи муҳофизат, шумо метавонед Администраторро бо оромии хотир дар интернети ҷамъиятӣ ҷойгир кунед.

Амалиёт бо як клик, он дар асл як клик аст.

Раванди ҷойгиркунӣ бениҳоят содда аст.

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

Чӣ тавр скриптро иҷро кардан мумкин аст: Ба скрипт иҷозатҳои иҷрои онро диҳед:

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

Скриптро бо истифода аз фармони sudo иҷро кунед:

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

Маълумоти конфигуратсияро мувофиқи дархост ворид кунед:

  • Номи корбарии HestiaCP-и худро ворид кунед (масалан, admin).
  • Зердомени пурраи омодашударо ворид кунед (масалан, adminer.example.com).
  • Пароли амниятии худро ворид кунед (масалан, MySuperPassword123)

Скрипт ба таври худкор тамоми раванди танзимотро бе ягон чиз анҷом медиҳад.

Тамоми раванд тақрибан як ё ду дақиқа вақтро мегирад. Скрипт ҳама чизро ба таври худкор иҷро мекунад ва ба шумо лозим нест, ки ягон фармонро дастӣ иҷро кунед.

Пас аз анҷом, шумо метавонед ба Adminer тавассути https://yourdomain/index.php дастрасӣ пайдо кунед

Баъзе саволҳое, ки шумо метавонед дар бораи онҳо нигарон бошед

Баъзе дӯстон метавонанд пурсанд, ки оё ин скрипт версияҳои гуногуни PHP-ро дастгирӣ мекунад?

Бале, он дастгирӣ мешавад. Скрипт ба таври худкор ҳамаи хидматҳои PHP-FPM-ро, ки дар система кор мекунанд, муайян мекунад ва онҳоро як ба як аз нав бор мекунад. Пас, он новобаста аз он ки шумо PHP 7.4 ё PHP 8.2-ро истифода мебаред, кор хоҳад кард.

Баъзе дӯстон метавонанд бипурсанд, ки агар ман хоҳам пароламро иваз кунам, чӣ мешавад?

Ин хеле содда аст; танҳо скриптро аз нав иҷро кунед. Скрипт хэш-и паролро аз нав танзим мекунад, аутентификатсияи Nginx-ро аз нав танзим мекунад ва Fail2Ban-ро аз нав танзим мекунад. Конфигуратсияи кӯҳна аз нав навишта мешавад.

Чӣ мешавад, агар ман хоҳам онро нест кунам?

Шумо метавонед танҳо директорияи решаи веб, файли парол ва конфигуратсияи Fail2Ban-ро дастӣ нест кунед. Скрипт ягон нишони дигарро дар система нахоҳад гузошт.

Дар охири нависед

Ман ҳамеша ҳис мекардам, ки амалиёт ва нигоҳдорӣ набояд он қадар мураккаб бошанд.

Бисёре аз вазифаҳои дастӣ метавонанд бо истифода аз скриптҳо автоматӣ карда шаванд. Ин ба шумо имкон медиҳад, ки вақти худро барои корҳои муҳимтар, ба монанди беҳсозии кори сервер, назорати вазъи барномаҳо ва таҳқиқи технологияҳои нав, сарф кунед.

Ин ба ман як достони таърихиро ба хотир меорад. Дар солҳои 1880-ум, нерӯи барқ ​​дар Иёлоти Муттаҳида васеъ паҳн шуд. Дар он вақт, бисёре аз соҳибони корхонаҳо пули зиёдеро барои харидани генераторҳо ва муҳаррикҳои барқӣ сарф карда, онҳоро дар корхонаҳои худ насб карданд. Аммо, пас аз насб, бисёриҳо муайян карданд, ки самаранокии истеҳсолот ба таври назаррас беҳтар нашудааст. Ин аз он сабаб буд, ки онҳо танҳо муҳаррикҳои буғиро бо муҳаррикҳои барқӣ иваз карда буданд, аммо тарҳбандӣ, равандҳо ва усулҳои идоракунии тамоми корхона бетағйир боқӣ монданд.

Онҳое, ки воқеан аз шукуфоии нерӯи барқ ​​баҳра бурданд, аввалин шуда фаҳмиданд, ки нерӯи барқ ​​дар асл чӣ маъно дорад. Онҳо хатҳои истеҳсолиро аз нав тарҳрезӣ карданд, коргоҳҳоро аз нав сохтанд ва тарзи кори коргаронро аз нав ташкил карданд.

Ҳамин чиз ба автоматикунонии амалиёт ва нигоҳдорӣ низ дахл дорад. Бисёриҳо медонанд, ки скриптҳоро истифода бурдан мумкин аст, аммо онҳо то ҳол идоракунии дастиро афзалтар медонанд, мисли он соҳибони корхонаҳои гузашта, ки дар бораи муҳаррикҳои барқӣ медонистанд, аммо то ҳол тарзи фикрронии муҳаррикҳои буғиро барои истифодаи онҳо истифода мебурданд. Скриптҳо барои иваз кардани доварии шумо пешбинӣ нашудаанд, балки барои автоматикунонии вазифаҳои такроршаванда, механикӣ ва хатогидошта пешбинӣ шудаанд ва ба шумо имкон медиҳанд, ки энергияи худро ба он чизе равона кунед, ки воқеан фикрро талаб мекунад.

Ин сенария чунин пайдо шуд. Он як нуқтаи дарди маро ҳал кард ва умедворам, ки ба шумо низ кӯмак карда метавонад.

Агар шумо HestiaCP ва Adminer-ро истифода баред, шумо метавонед ин скриптро санҷед. Ин метавонад вақти зиёдеро сарфа кунад.

Азбаски шумо то ин ҷо хондаед, агар он барои шумо муфид бошад, лутфан онро лайк монед ва мубодила кунед. Агар шумо хоҳед, ки аввал навсозиҳоро қабул кунед, шумо инчунин метавонед маро пайгирӣ кунед!

Ташаккур барои хондани мақолаи ман. Дафъаи оянда мебинем.

Умедворем, ки мақолаи "Скрипти маъмурии ҷойгиркунии автоматии HestiaCP One-Click (Including Nginx Authentication + Fail2Ban Dual Protection)", ки дар блоги Чен Вейлианг ( https://www.chenweiliang.com/ ) мубодила шудааст, барои шумо муфид хоҳад буд.

Озодона истиноди ин мақоларо мубодила кунед: https://www.chenweiliang.com/cwl-34395.html

Барои кушодани ҳилаҳои пинҳонии бештар🔑, хуш омадед ба канали мо дар Telegram ҳамроҳ шавед!

Поделиться ва лайк, агар ба шумо писанд омад! Саҳмияҳо ва лайкҳои шумо ангезаи доимии мо мебошанд!

 

发表 评论

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

Акс аз бойгонӣ