HestiaCP מספק פריסה אוטומטית בלחיצה אחת של סקריפט ה-Admin (כולל אימות Nginx + הגנה כפולה מפני Fail2Ban).

הפסק להתקין את Adminer באופן ידני! סקריפט אחד יכול לטפל בכל תצורת האבטחה.

לפני כמה ימים, חבר שלי, שעובד גם הוא בניהול מערכות, התלונן בפניי שלוקח לו את רוב היום להתקין את Adminer על השרת שלו. זה לא שקשה להתקין את Adminer עצמו; זה רק קובץ PHP, אתה יכול פשוט להעלות אותו וזה יעבוד. אבל הבעיה היא, שאתה לא יכול פשוט להעלות קובץ PHP ולסיים עם זה.

עליך להגדיר תת-דומיינים, לטעון תוספים, להגדיר אימות Nginx ולקבוע את תצורת Fail2Ban כדי למנוע התקפות Brute-Force. כל שלב אינו מסובך, אך יחד הם יוצרים חבורה של פקודות וקבצי תצורה מקוטעים.

מה שמעצבן עוד יותר הוא שתצורות הקשורות לאבטחה כמו אימות וחומות אש נוטות במיוחד לשגיאות. חוסר תשומת לב קל יכול לחשוף את ממשק ניהול מסד הנתונים לאינטרנט הציבורי, ולהפוך אותו לנגיש לכל אחד.

צחקתי באותו רגע כי עשיתי את אותו הדבר בעבר. מאוחר יותר, לא יכולתי לסבול את זה יותר, אז כתבתי סקריפט פריסה בלחיצה אחת כדי להפוך את כל השלבים האלה לאוטומטיים.

HestiaCP מספק פריסה אוטומטית בלחיצה אחת של סקריפט ה-Admin (כולל אימות 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 תומך בכניסה באמצעות גיבוב סיסמה.

בנוגע ליצירת ה-hash של הסיסמה ולקובץ index.php, יש פרט קטן: הסקריפט משתמש ב-getenv() כדי לאחזר את הסיסמה במקום להשתמש ישירות ב-$_ENV. זה מונע בעיית תצורה של php.ini שגורמת לחישוב ה-hash להיות ריק. אני בעצמי נתקלתי במלכודת הזו ובזבזתי זמן רב בגילוי שסקופ 'E' לא הופעל ב-php.ini.

לצורך הגדרת אימות Nginx, הסקריפט משתמש במנגנון ההכללה המקורי של HestiaCP במקום לשנות ישירות את קובץ התצורה הראשי של Nginx. היתרון של גישה זו הוא שהאימות לא ייכשל גם אם תבנה מחדש את תצורת הדומיין.

בתצורת Fail2Ban, הסקריפט יוצר כלל סינון כדי לנטר שגיאות 401. אם כתובת IP נכשלת בכניסה 3 פעמים תוך 10 דקות, היא תיחסם למשך שעה.

בנוגע לתיקון הרשאות וטעינת שירות מחדש, הסקריפט יגדיר אוטומטית את הרשאות הקובץ הנכונות ויטען מחדש את PHP-FPM, Nginx ו-Fail2Ban.

אני רציני לגבי בטיחות.

בכנות, האבטחה של כלי ניהול מסדי נתונים היא הדבר שהכי אכפת לי ממנו.

תחשבו על זה, מנהל המערכת יכול לתפעל ישירות את כל מסדי הנתונים בשרת שלכם. אם הם נחשפים לאינטרנט הציבורי ומישהו סורק אותם, ההשלכות יהיו בלתי נתפסות.

לסקריפט הזה יש הגנה משולשת.

השכבה הראשונה היא HTTP Basic Auth של Nginx. כשתיגשו ל-Adminer, הדפדפן שלכם יפתח תיבת דו-שיח שתבקש מכם להזין את שם המשתמש והסיסמה שלכם. רק לאחר הזנת המידע הנכון תראו את דף הכניסה של Admin.

השכבה השנייה היא סיסמת ההתחברות של מנהל המערכת. הגדרתי סיסמה מבוססת hashing ב-index.php, כך שגם אם מישהו יעקוף את אימות Nginx, הוא לא ידע את סיסמת ההתחברות של מנהל המערכת.

השכבה השלישית היא הגנה מפני שימוש בכוח גס של Fail2Ban. אם מישהו ינסה לפרוץ את הסיסמה שלך באמצעות כוח גס, Fail2Ban יחסום אוטומטית את כתובת ה-IP שלו.

עם שילוב של שלוש שכבות ההגנה הללו, תוכלו בעצם להציב את Administrator באינטרנט הציבורי בראש שקט.

פעולה בלחיצה אחת, זה באמת קליק אחד.

תהליך הפריסה פשוט ביותר.

#!/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)

הסקריפט ישלים באופן אוטומטי את כל תהליך התצורה מבלי להשמיט דבר.

התהליך כולו אורך בערך דקה או שתיים. הסקריפט יטפל בכל דבר באופן אוטומטי, ואין צורך לבצע פקודות ידנית.

לאחר שתסיים, תוכל לגשת ל-Admin דרך https://yourdomain/index.php

כמה שאלות שעשויות להדאיג אותך

חלק מהחברים עשויים לשאול, האם הסקריפט הזה תומך במספר גרסאות PHP?

כן, זה נתמך. הסקריפט יזהה אוטומטית את כל שירותי PHP-FPM הפועלים במערכת ויטען אותם מחדש אחד אחד. כך שזה עובד מצוין בין אם אתם משתמשים ב-PHP 7.4 או ב-PHP 8.2.

חלק מהחברים עשויים לשאול, מה אם אני רוצה לשנות את הסיסמה שלי?

זה מאוד פשוט; פשוט הפעל מחדש את הסקריפט. הסקריפט ייצור מחדש את קוד ה-hash של הסיסמה, יגדיר מחדש את אימות Nginx ויגדיר מחדש את Fail2Ban. התצורה הישנה תוחלף.

מה אם אני רוצה להסיר את ההתקנה?

ניתן פשוט למחוק את ספריית השורש של האינטרנט, קובץ הסיסמה ואת תצורת Fail2Ban באופן ידני. הסקריפט לא ישאיר עקבות אחרים במערכת.

לכתוב בסוף

תמיד הרגשתי שתפעול ותחזוקה לא צריכים להיות כל כך מסובכים.

ניתן למעשה להפוך משימות ידניות רבות לאוטומטיות באמצעות סקריפטים. זה מאפשר לך להקדיש את זמנך לדברים חשובים יותר, כגון אופטימיזציה של ביצועי השרת, ניטור סטטוס היישומים ומחקר טכנולוגיות חדשות.

זה מזכיר לי סיפור היסטורי. בשנות ה-80 של המאה ה-19, החשמל החל להתפשט בארצות הברית. בעלי מפעלים רבים הוציאו כסף רב על קניית גנרטורים ומנועים חשמליים והתקינו אותם במפעלים שלהם. עם זאת, לאחר ההתקנה, רבים גילו כי יעילות הייצור לא השתפרה באופן משמעותי. הסיבה לכך הייתה שהם החליפו רק מנועי קיטור במנועים חשמליים, אך המבנה הכללי, התהליכים ושיטות הניהול של המפעל נותרו ללא שינוי.

אלו שבאמת נהנו מפריחת החשמל היו הראשונים להבין מהי משמעות החשמל באמת. הם עיצבו מחדש קווי ייצור, ארגון מחדש של בתי מלאכה וארגנו מחדש את אופן פעולת העובדים.

אותו הדבר חל על אוטומציה של תפעול ותחזוקה. אנשים רבים יודעים שניתן להשתמש בסקריפטים, אך הם עדיין מעדיפים הפעלה ידנית, בדיוק כמו בעלי מפעלים בעבר שידעו על מנועים חשמליים אך עדיין השתמשו בחשיבה של מנועי קיטור כדי להשתמש בהם. סקריפטים אינם נועדו להחליף את שיקול הדעת שלך, אלא להפוך משימות חוזרות ונשנות, מכניות ומועדות לטעויות לאוטומטיות, מה שמאפשר לך למקד את האנרגיה שלך במה שבאמת דורש מחשבה.

כך נוצר התסריט הזה. הוא פתר לי נקודת כאב, ואני מקווה שהוא יוכל לעזור גם לכם.

אם אתם משתמשים ב-HestiaCP וב-Adminer, אולי כדאי לכם לנסות את הסקריפט הזה. זה עשוי לחסוך לכם הרבה זמן.

מאחר שקראתם עד כאן, אם מצאתם את זה מועיל, אנא עשו לייק ושתפו. אם אתם רוצים לקבל עדכונים ראשונים, אתם יכולים גם לעקוב אחריי!

תודה שקראתם את המאמר שלי. נתראה בפעם הבאה.

אני מקווה שהמאמר "HestiaCP One-Click Automated Deployment Script for Adminer (Including Nginx Authentication + Fail2Ban Dual Protection)" שפורסם בבלוג של צ'ן וייליאנג ( https://www.chenweiliang.com/ ) יהיה לעזר עבורך.

אל תהססו לשתף את הקישור למאמר הזה: https://www.chenweiliang.com/cwl-34395.html

כדי לפתוח עוד טריקים נסתרים🔑, מוזמנים להצטרף לערוץ הטלגרם שלנו!

שתפו ותעשו לייק אם אהבתם! השיתופים והלייקים שלך הם המניע המתמשך שלנו!

 

发表 评论

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

גלול למעלה