Каталог статей
Припиніть ручне встановлення 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://вашдомен/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
