HestiaCP omogućava automatsko postavljanje Adminer skripte jednim klikom (uključujući Nginx autentifikaciju + Fail2Ban dvostruku zaštitu).

Prestanite ručno instalirati Adminer! Jedan skript može obraditi cijelu sigurnosnu konfiguraciju.

Prije par dana, moj prijatelj, koji također radi u sistem administraciji, požalio mi se da mu treba veći dio dana da instalira Adminer na svoj server. Nije da je sam Adminer teško instalirati; to je samo PHP datoteka, možete je jednostavno instalirati i radit će. Ali problem je što ne možete samo instalirati PHP datoteku i završiti s tim.

Potrebno je konfigurirati poddomene, učitati dodatke (pluginove), postaviti Nginx autentifikaciju i konfigurirati Fail2Ban kako biste spriječili napade grubom silom (brute-force). Svaki korak nije kompliciran, ali zajedno čine gomilu fragmentiranih naredbi i konfiguracijskih datoteka.

Još je iritantnije to što su konfiguracije vezane za sigurnost, poput autentifikacije i zaštitnih zidova, posebno sklone greškama. Mali propust može izložiti interfejs za upravljanje bazom podataka javnom internetu, čineći ga dostupnim svima.

U tom trenutku sam se smijao jer sam i prije radio istu stvar. Kasnije to više nisam mogao podnijeti, pa sam napisao skriptu za implementaciju jednim klikom kako bih automatizirao sve ove korake.

HestiaCP omogućava automatsko postavljanje Adminer skripte jednim klikom (uključujući Nginx autentifikaciju + Fail2Ban dvostruku zaštitu).

Zašto ne koristitiphpMyAdmin

Možda se pitate, zašto ne koristiti phpMyAdmin, koji je uobičajeniji?

Zaista, phpMyAdmin ima više korisnika i veću zajednicu. Ali mislim da Adminer radi bolji posao u nekoliko oblasti.

Prvo, lagan je; Adminer je samo jedna PHP datoteka, dok je phpMyAdmin čitav niz datoteka. Drugo, siguran je; Adminerova filozofija dizajna je "nepouzdana po defaultu", što znači da morate eksplicitno konfigurirati informacije o vezi da biste upravljali bazom podataka.

Drugi aspekt su performanse; Adminer je znatno brži od phpMyAdmin-a pri rukovanju velikim bazama podataka.

Naravno, ništa od ovoga nije najvažnije. Najvažnije je da ovaj skript znači da više ne moram ručno konfigurirati te stvari vezane za sigurnost.

Šta je tačno uradio scenario?

Ideja iza ovog skripta je zapravo prilično jednostavna: automatizirati sve korake koje inače radite ručno.

Za interaktivni unos, skripta će vam postaviti nekoliko pitanja: korisničko ime HestiaCP , naziv domene, korisničko ime za autentifikaciju i lozinka. Trebate unijeti samo ovo, a skripta će se pobrinuti za ostalo.

Skripta automatski kreira korijenski web direktorij, provjerava da li su instalirani apache2-utils (koji se koristi za generiranje datoteka s lozinkama) i PHP okruženje, te se bavi kreiranjem direktorija i instalacijom zavisnosti.

Prilikom preuzimanja Adminer-a, skripta prvo pokušava preuzeti najnoviju verziju iz službenog repozitorija. Ako službeni repozitorij nije dostupan, automatski se prebacuje na stabilni GitHub Releases repozitorij. Mislim da je ovo prilično važno, jer službeni repozitorij ponekad može biti nestabilan; već sam se susreo s vremenskim ograničenjima veze.

Što se tiče preuzimanja dodataka, skripta će preuzeti tri osnovna dodatka: plugin.php je program za učitavanje dodataka, fc-sqlite-connection-without-credentials.php se koristi za rukovanje vezama bez lozinke, a login-password-less.php podržava prijavu sa hešeom lozinke.

Što se tiče generiranja heša lozinke i index.php, postoji mali detalj: skripta koristi getenv() za preuzimanje lozinke umjesto direktnog korištenja $_ENV. Ovo izbjegava problem s konfiguracijom php.ini datoteke koji uzrokuje da izračun heša bude prazan. I sam sam naišao na ovu zamku i proveo sam dugo vremena pokušavajući shvatiti da opseg 'E' nije omogućen u php.ini.

Za konfigurisanje Nginx autentifikacije, skripta koristi HestiaCP-ov izvorni mehanizam uključivanja umjesto direktnog mijenjanja glavne Nginx konfiguracijske datoteke. Prednost ovog pristupa je što autentifikacija neće propasti čak i ako ponovo izgradite konfiguraciju domene.

U Fail2Ban konfiguraciji, skripta kreira pravilo filtriranja za praćenje 401 grešaka. Ako se IP adresa ne uspije prijaviti 3 puta u roku od 10 minuta, bit će blokirana na 1 sat.

Što se tiče popravke dozvola i ponovnog učitavanja servisa, skripta će automatski postaviti ispravne dozvole za datoteke i ponovo učitati PHP-FPM, Nginx i Fail2Ban.

Ozbiljno mislim o sigurnosti.

Iskreno, sigurnost alata za upravljanje bazama podataka je ono što me najviše zanima.

Razmislite o tome, administrator može direktno manipulirati svim bazama podataka na vašem serveru. Ako je izložen javnom internetu i neko ga skenira, posljedice bi bile nezamislive.

Ovaj scenarij ima trostruku zaštitu.

Prvi sloj je Nginx-ov HTTP Basic Auth. Kada pristupite Administreru, vaš preglednik će prikazati dijaloški okvir u kojem će vas tražiti da unesete svoje korisničko ime i lozinku. Tek nakon unosa ispravnih podataka možete vidjeti stranicu za prijavu na Administrer.

Drugi sloj je administratorova vlastita lozinka za prijavu. Konfigurirao sam heširanje lozinke u index.php, tako da čak i ako neko zaobiđe Nginx autentifikaciju, neće znati administratorsku lozinku za prijavu.

Treći sloj je Fail2Ban-ova zaštita metodom brute-force. Ako neko pokuša da vam provali lozinku, Fail2Ban će automatski blokirati njihovu IP adresu.

Kombinacijom ova tri sloja zaštite, u osnovi možete bezbrižno koristiti administratorski pristup javnom internetu.

Operacija jednim klikom, zaista je jedan klik.

Proces implementacije je izuzetno jednostavan.

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

Kako pokrenuti skriptu: Dodijelite skripti dozvole za izvršavanje:

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

Pokrenite skriptu koristeći sudo:

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

Unesite podatke o konfiguraciji prema uputama:

  • Unesite svoje HestiaCP korisničko ime (npr. admin).
  • Unesite pripremljenu punu poddomenu (npr. adminer.example.com).
  • Unesite svoju sigurnosnu lozinku (npr. MySuperPassword123)

Skripta će automatski završiti cijeli proces konfiguracije bez izostavljanja ičega.

Cijeli proces traje oko jednu ili dvije minute. Skripta će sve automatski obraditi i ne morate ručno izvršavati nikakve naredbe.

Nakon što završite, možete pristupiti Administreru putem https://vasadomena/index.php

Neka pitanja koja vas možda brinu

Neki prijatelji bi mogli pitati, da li ovaj skript podržava više PHP verzija?

Da, podržano je. Skripta će automatski detektovati sve PHP-FPM servise koji rade na sistemu i ponovo ih učitati jedan po jedan. Dakle, radi dobro bez obzira da li koristite PHP 7.4 ili PHP 8.2.

Neki prijatelji bi mogli pitati, šta ako želim promijeniti lozinku?

Vrlo je jednostavno; samo ponovo pokrenite skriptu. Skripta će regenerirati hash lozinke, rekonfigurirati Nginx autentifikaciju i rekonfigurirati Fail2Ban. Stara konfiguracija će biti prepisana.

Šta ako želim da ga deinstaliram?

Možete jednostavno ručno izbrisati glavni web direktorij, datoteku s lozinkama i konfiguraciju Fail2Ban-a. Skripta neće ostaviti nikakve druge tragove na sistemu.

Napiši na kraju

Oduvijek sam smatrao da rad i održavanje ne bi trebali biti toliko komplicirani.

Mnogi ručni zadaci se zapravo mogu automatizirati pomoću skripti. To vam omogućava da svoje vrijeme posvetite važnijim stvarima, kao što su optimizacija performansi servera, praćenje statusa aplikacija i istraživanje novih tehnologija.

Ovo me podsjeća na jednu historijsku priču. Osamdesetih godina 1880. vijeka, električna energija se počela širiti u Sjedinjenim Američkim Državama. Mnogi vlasnici fabrika su potrošili mnogo novca na kupovinu generatora i elektromotora i instalirali ih u svojim fabrikama. Međutim, nakon instalacije, mnogi su otkrili da se efikasnost proizvodnje nije značajno poboljšala. To je bilo zato što su samo parne mašine zamijenili elektromotorima, ali ukupni raspored, procesi i metode upravljanja fabrikom ostali su nepromijenjeni.

Oni koji su zaista imali koristi od procvata električne energije bili su prvi koji su shvatili šta električna energija zapravo znači. Redizajnirali su proizvodne linije, restrukturirali radionice i reorganizirali način rada radnika.

Isto važi i za automatizaciju operacija i održavanja. Mnogi ljudi znaju da se skripte mogu koristiti, ali i dalje preferiraju ručno upravljanje, baš kao i oni vlasnici fabrika u prošlosti koji su znali za elektromotore, ali su ipak koristili način razmišljanja parnih mašina da bi ih koristili. Skripte nisu namijenjene da zamijene vašu prosudbu, već da automatiziraju repetitivne, mehaničke i zadatke sklone greškama, omogućavajući vam da usmjerite svoju energiju na ono što zaista zahtijeva razmišljanje.

Ovako je nastao ovaj scenarij. Riješio je moj problem i nadam se da može pomoći i vama.

Ako koristite HestiaCP i Adminer, možda biste trebali isprobati ovaj skript. Može vam uštedjeti mnogo vremena.

Pošto ste pročitali do sada, ako vam je bilo korisno, molimo vas da lajkujete i podijelite. Ako želite prvi primati novosti, možete me i pratiti!

Hvala vam što ste pročitali moj članak. Vidimo se sljedeći put.

Komentari

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

Dođite na vrh