Каталог артыкулаў
Перастаньце ўсталёўваць Adminer уручную! Адзін скрыпт можа апрацоўваць усю канфігурацыю бяспекі.
Пару дзён таму мой сябар, які таксама працуе сістэмным адміністратарам, паскардзіўся мне, што ў яго сыходзіць амаль увесь дзень на ўстаноўку Adminer на сервер. Не тое каб сам Adminer складана ўсталяваць; гэта проста PHP-файл, можна проста загрузіць яго, і ён будзе працаваць. Але праблема ў тым, што нельга проста загрузіць PHP-файл і спыніцца на гэтым.
Вам трэба наладзіць паддамены, загрузіць плагіны, наладзіць аўтэнтыфікацыю 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, ёсць невялікая дэталь: скрыпт выкарыстоўвае getenv() для атрымання пароля замест непасрэднага выкарыстання $_ENV. Гэта дазваляе пазбегнуць праблемы з канфігурацыяй php.ini, з-за якой разлік хэша будзе пустым. Я сам сутыкнуўся з гэтай памылкай і доўга высвятляў, што вобласць дзеяння 'E' не ўключана ў php.ini.
Для налады аўтэнтыфікацыі Nginx скрыпт выкарыстоўвае ўбудаваны механізм падключэння HestiaCP замест непасрэднай змены асноўнага файла канфігурацыі Nginx. Перавага гэтага падыходу заключаецца ў тым, што аўтэнтыфікацыя не будзе завершана памылкай, нават калі вы перабудуеце канфігурацыю дамена.
У канфігурацыі Fail2Ban скрыпт стварае правіла фільтрацыі для маніторынгу памылак 401. Калі IP-адрас не ўдаецца ўвайсці ў сістэму 3 разы на працягу 10 хвілін, ён будзе заблакіраваны на 1 гадзіну.
Што тычыцца аднаўлення дазволаў і перазагрузкі службы, скрыпт аўтаматычна ўсталюе правільныя правы доступу да файлаў і перазагрузіць PHP-FPM, Nginx і Fail2Ban.
Я сур'ёзна стаўлюся да бяспекі.
Шчыра кажучы, бяспека інструментаў кіравання базамі дадзеных — гэта тое, што мяне хвалюе больш за ўсё.
Падумайце: адміністратар можа непасрэдна маніпуляваць усімі базамі дадзеных на вашым серверы. Калі ён будзе выстаўлены ў адкрыты доступ да Інтэрнэту і хтосьці яго праскануе, наступствы будуць неўяўнымі.
Гэты скрыпт мае патройную абарону.
Першы ўзровень — гэта базавая аўтэнтыфікацыя HTTP Nginx. Пры доступе да адміністратара ў вашым браўзеры з'явіцца дыялогавае акно з просьбай увесці імя карыстальніка і пароль. Толькі пасля ўводу правільнай інфармацыі вы ўбачыце старонку ўваходу ў адміністратар.
Другі ўзровень — гэта ўласны хэш пароля адміністратара для ўваходу. Я наладзіў хэшаванне пароляў у index.php, таму нават калі хтосьці абыдзе аўтэнтыфікацыю Nginx, ён не будзе ведаць пароль адміністратара для ўваходу.
Трэці ўзровень — гэта абарона Fail2Ban метадам грубай сілы. Калі хтосьці паспрабуе ўзламаць ваш пароль метадам грубай сілы, 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)
Скрыпт аўтаматычна завершыць увесь працэс канфігурацыі, нічога не прапусціўшы.
Увесь працэс займае каля адной-двух хвілін. Скрыпт зробіць усё аўтаматычна, і вам не трэба будзе выконваць ніякіх каманд уручную.
Пасля завяршэння вы можаце атрымаць доступ да адміністратара праз https://yourdomain/index.php
Некаторыя пытанні, якія вас могуць хваляваць
Некаторыя сябры могуць спытаць, ці падтрымлівае гэты скрыпт некалькі версій PHP?
Так, падтрымліваецца. Скрыпт аўтаматычна выявіць усе службы PHP-FPM, якія працуюць у сістэме, і перазагрузіць іх па адной. Такім чынам, ён будзе працаваць добра, незалежна ад таго, выкарыстоўваеце вы PHP 7.4 ці PHP 8.2.
Некаторыя сябры могуць спытаць, што рабіць, калі я хачу змяніць свой пароль?
Гэта вельмі проста; проста перазапусціце скрыпт. Скрыпт перагенеруе хэш пароля, пераналадзіць аўтэнтыфікацыю Nginx і пераналадзіць Fail2Ban. Старая канфігурацыя будзе перазапісана.
Што рабіць, калі я хачу яго выдаліць?
Вы можаце проста выдаліць кораневы вэб-каталог, файл пароляў і канфігурацыю Fail2Ban уручную. Скрыпт не пакіне ніякіх іншых слядоў у сістэме.
Напішыце ў канцы
Я заўсёды лічыў, што эксплуатацыя і тэхнічнае абслугоўванне не павінны быць такімі складанымі.
Шмат якія ручныя задачы можна аўтаматызаваць з дапамогай скрыптоў. Гэта дазваляе вам марнаваць свой час на больш важныя рэчы, такія як аптымізацыя прадукцыйнасці сервера, маніторынг стану праграм і даследаванне новых тэхналогій.
Гэта нагадвае мне адну гістарычную гісторыю. У 1880-х гадах электрычнасць пачала распаўсюджвацца ў Злучаных Штатах. Многія ўладальнікі фабрык выдаткавалі шмат грошай на куплю генератараў і электрарухавікоў і ўсталявалі іх на сваіх фабрыках. Аднак пасля ўстаноўкі многія выявілі, што эфектыўнасць вытворчасці істотна не палепшылася. Гэта адбылося таму, што яны замянілі толькі паравыя рухавікі электрарухавікамі, але агульная планіроўка, працэсы і метады кіравання фабрыкай засталіся нязменнымі.
Тыя, хто сапраўды атрымаў выгаду ад электрычнага буму, першымі зразумелі, што насамрэч азначае электрычнасць. Яны перапраектавалі вытворчыя лініі, рэструктурызавалі майстэрні і рэарганізавалі спосаб працы рабочых.
Гэта ж тычыцца і аўтаматызацыі аперацый і тэхнічнага абслугоўвання. Многія людзі ведаюць, што можна выкарыстоўваць сцэнарыі, але яны ўсё яшчэ аддаюць перавагу ручному кіраванню, як і тыя ўладальнікі фабрык у мінулым, якія ведалі пра электрарухавікі, але ўсё яшчэ выкарыстоўвалі мысленне паравых рухавікоў для іх выкарыстання. Скрыпты не прызначаны для замены вашага меркавання, а для аўтаматызацыі паўтаральных, механічных і схільных да памылак задач, дазваляючы вам сканцэнтраваць сваю энергію на тым, што сапраўды патрабуе роздуму.
Вось так з'явіўся гэты сцэнар. Ён вырашыў маю праблему, і я спадзяюся, што дапаможа і вам.
Калі вы карыстаецеся HestiaCP і Adminer, магчыма, вам варта паспрабаваць гэты скрыпт. Ён можа зэканоміць вам шмат часу.
Калі вы дачыталі да гэтага месца, пастаўце лайк і падзяліцеся гэтым артыкулам, калі ласка. Калі вы хочаце атрымліваць абнаўленні першымі, вы таксама можаце падпісацца на мяне!
Дзякуй, што прачыталі мой артыкул. Да сустрэчы ў наступны раз.
Спадзяюся, артыкул «Скрыпт адміністравання аўтаматызаванага разгортвання HestiaCP адным пстрычкай мышы (уключаючы аўтэнтыфікацыю Nginx + падвойную абарону Fail2Ban)», апублікаваны ў блогу Чэнь Вэйляна ( https://www.chenweiliang.com/ ), будзе вам карысным.
Не саромейцеся падзяліцца спасылкай на гэты артыкул: https://www.chenweiliang.com/cwl-34395.html
