نصب خودکار

روش خودکار: یک اسکریپت از حساب کاربری کل سرور را آماده می‌کند (پشتهٔ وب Apache + PHP، پایگاه‌داده، ابزارهای امنیتی، cron). سپس — استقرار داشبورد، صدور SSL و وارد کردن لایسنس. روی Ubuntu/Debian کار می‌کند: روی VPS تازه همه‌چیز را از صفر تنظیم می‌کند و روی سرور از پیش پیکربندی‌شده — فقط به‌صورت افزودنی (نمایهٔ «سرور پیکربندی‌شده»، گام ۰۱). همهٔ دستورهای زیر به‌ترتیب‌اند، کافی است از بالا به پایین پیش بروید. روی VPS تازه هر گام به‌ترتیب مناسب است؛ اگر سرور از پیش پیکربندی شده باشد یا پنل هاستینگ روی آن نصب باشد، اسکریپت بخشی از کار را عمداً بر عهدهٔ شما می‌گذارد — اینکه دقیقاً چه چیزی، در پایان کار خود می‌نویسد (تحلیل خروجی — در گام ۰۱).

مقادیر جای‌گزین در دستورها را با مقادیر خودتان عوض کنید: monitor.example.com — دامنهٔ شما؛ 203.0.113.10 — IP واقعی سرور؛ /var/www/monitor — ریشهٔ داشبورد (جایی که public/، assets/، config.php قرار دارند)؛ گذرواژهٔ پایگاه‌داده را خودتان انتخاب کنید.
مجموعهٔ کامل («محافظت کامل») برای VPS تازه در نظر گرفته شده است. روی Ubuntu/Debian تمیز، سیستم امنیتی را از صفر تنظیم می‌کند — Fail2ban (jail.local)، root-crontab، قواعد UFW، پیکربندی Apache. اگر سرور از پیش پیکربندی شده است (داشبورد فعال، سایت‌ها، ایمیل، jailهای خودتان) — نمایهٔ «سرور پیکربندی‌شده» را انتخاب کنید: فقط تغییرات افزودنی اعمال می‌کند و به فایروال، Fail2ban، ایمیل، SSH و sysctl شما دست نمی‌زند. با شناسایی پنل هاستینگ، اسکریپت خودش به این حالت سوئیچ می‌کند. پیش از نخستین اجرا می‌توانید اجرای آزمایشی را فعال کنید (تیک در حساب کاربری) — نشان می‌دهد چه کاری انجام می‌شود، بدون تغییر چیزی. روی سرور فعال، برای احتیاط یک snapshot بگیرید.

01. فرمان پیکربندی خودکار از حساب کاربری

این فرمان را در حساب کاربری خود my.arciveo.com ← بخش «پیکربندی سرور» (پس از تهیه Arcivéo Security Monitor در دسترس است) دریافت می‌کنید. این فرمان به حساب شما پیوند دارد و شامل یک توکن اختصاصی است.

این اسکریپت کل سرور را آماده می‌کند: وب‌استک (Apache + PHP)، پایگاه داده، ابزارهای SSL، مجموعه کامل ابزارهای محافظتی و وظایف cron (Lynis، SMART، debsums، Logwatch، گزارش روزانه، به‌روزرسانی ipsum).

۱) سطح محافظت را انتخاب کنید (در حساب کاربری، پیش از کپی فرمان):

  • محافظت کامل (توصیه‌شده) — UFW (فایروال)، Fail2ban، CrowdSec + bouncer، ipsum (فهرست مسدودسازی IP)، Suricata (IDS/IPS)، Falco، ModSecurity + OWASP CRS (WAF)، PSAD، mod_evasive (ضد DoS)، AIDE (یکپارچگی فایل‌ها)، debsums، ClamAV + maldet (آنتی‌ویروس)، Auditd، AppArmor، Monit، Lynis (ممیزی)، Logwatch، به‌روزرسانی‌های خودکار امنیتی.
  • سبک — برای VPS با حافظه RAM کم: مجموعه پایه بدون مؤلفه‌های سنگین.
  • سرور پیکربندی‌شده (پنل هاستینگ) — برای سروری که از پیش فعال است و پنل (HestiaCP و مانند آن)، سایت‌ها و ایمیل دارد: فقط تغییرات افزودنی (نصب ابزارهای تکمیلی، cron، قواعد sudo) و فایروال، Fail2ban، ایمیل، SSH و sysctl همان‌طور که هستند باقی می‌مانند. روی سروری با پنل، اسکریپت خودش این حالت را انتخاب می‌کند.
اجرای آزمایشی. در حساب کاربری می‌توانید گزینه «اجرای آزمایشی» را علامت بزنید — در این صورت فرمان فقط نشان می‌دهد اسکریپت چه چیزی نصب و تغییر می‌دهد و بدون دست‌زدن به چیزی پایان می‌یابد. روی سرور از پیش پیکربندی‌شده مفید است: نخست اجرای آزمایشی، سپس اجرای واقعی بدون علامت.

۲) روی سرور با کاربر root فرمان موجود در حساب کاربری را اجرا کنید — این‌گونه است:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
فرمان را محرمانه نگه دارید — به حساب شما پیوند دارد. لینک اعتبار محدودی دارد؛ اگر منقضی شد، در حساب کاربری روی «دریافت لینک جدید» کلیک کنید.
پس از پیکربندی خودکار، وب‌سرور Apache + PHP-FPM است و ابزارهای امنیتی و وظایف cron از پیش نصب شده و به‌صورت آماده کار می‌کنند.

۳) خروجی پایان کار را بخوانید — آنجا نوشته شده چه چیزی بر عهدهٔ شما مانده است. اسکریپت کار خود را با یک بلوک بررسی‌ها و فهرست «گام بعدی — نصب پنل» به پایان می‌رساند. بخشی از گام‌ها را عمداً انجام نمی‌دهد: اینکه دقیقاً کدام‌ها، به نمایهٔ انتخابی و به آنچه روی سرور یافته است بستگی دارد. با فهرست زیر مقایسه کنید — تنها بندهایی را انجام دهید که خط مربوط به آن‌ها در خروجی شما ظاهر شده باشد.

  • Control panel detected (…) — سایت با ابزارهای خودِ پنل هاستینگ ساخته می‌شود و اسکریپت vhost نمی‌سازد. گام ۰۳، شاخهٔ «سرور با پنل هاستینگ».
  • No vhost created (no domain given) — نمایهٔ «سرور پیکربندی‌شده» بدون دامنه: یک vhost بی‌نام به سایت پیش‌فرض تبدیل می‌شد و درخواست‌های سایت‌های خود شما را می‌ربود، بنابراین ساخته نشده است. گام ۰۳، شاخهٔ «ساخت دستی vhost».
  • sudo rules NOT written — اسکریپت نتوانست تشخیص دهد پنل با کدام حساب کار می‌کند. این وضعیتی عادی است: فایل‌های پنل پس از پیکربندی خودکار بارگذاری می‌شوند و هنوز چیزی برای تشخیص وجود نداشت. بدون این قواعد، ماژول‌ها داده‌های سیستمی را نمی‌بینند. گام ۰۴، بلوک «sudo برای وب‌سرور».
  • ! Nginx does not read .htaccess — جلوی Apache یک Nginx قرار دارد و نوشتن خودکار قاعدهٔ منع در پیکربندی آن ممکن نشد. حتماً این کار را انجام دهید: وگرنه data/، keys/، database/ و config.php با دور زدن .htaccess به بیرون داده می‌شوند. گام ۰۳، بلوک «اگر جلوی Apache یک Nginx قرار دارد».
  • UFW installed but inactive — فایروال نصب شده اما خاموش است: روی سرور پیکربندی‌شده، اسکریپت خودش آن را روشن نمی‌کند تا دسترسی شما را قطع نکند. خودتان آن را روشن کنید و حتماً پورت SSH خود را مجاز نمایید:
    sudo ufw allow OpenSSH # پورت غیراستاندارد SSH: sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running — اجرا کنید: sudo systemctl enable --now fail2ban.
  • Database server present … but not running — پیش از گام ۰۴ پایگاه داده را اجرا کنید: sudo systemctl enable --now mariadb (یا mysql — بسته به آنچه نصب است).
  • Certbot skipped — issue SSL in … — گواهی با کلید Let's Encrypt در پنل هاستینگ صادر می‌شود؛ گام ۰۶ برای شما لازم نیست.
اگر در بلوک بررسی‌ها همه‌چیز درست باشد، آخرین خط All checks passed است. بندهای دارای ! نیاز به توجه دارند؛ جزئیات در لاگ نوشته می‌شود و مسیر آن را اسکریپت در همان انتها چاپ می‌کند (Log: …).

02. دامنه و DNS

برای باز کردن پنل با نشانی‌ای مانند monitor.example.com و دریافت SSL رایگان، دامنه باید به سرور اشاره کند. در پنل مدیریت DNS (نزد ثبت‌کننده یا میزبان) یک رکورد A بسازید:

نوع: A نام: monitor (زیردامنه ← monitor.example.com) یا @ (ریشه دامنه ← example.com) مقدار: 203.0.113.10 ← IP سرور شما TTL: 3600

پس از چند دقیقه (گاهی تا یک ساعت) بررسی کنید که دامنه به سرور اشاره می‌کند:

dig +short monitor.example.com # باید IP شما را برگرداند # یا، اگر dig نصب نیست: getent hosts monitor.example.com
گواهی SSL (مرحله 06) فقط برای دامنه صادر می‌شود — پس DNS باید پیش از صدور گواهی به سرور اشاره کند.

03. بارگذاری فایل‌های پنل

حالت معمول (VPS تازه). پیکربندی خودکار قبلاً دایرکتوری پنل /var/www/monitor را ساخته و سایت Apache را تنظیم کرده است (DocumentRoot روی ریشهٔ پنل، PHP-FPM و AllowOverride برای .htaccess). در خروجی اسکریپت این همان خط vhost … → DocumentRoot … است. ساختن جداگانهٔ دایرکتوری و vhost لازم نیست — فقط فایل‌ها را بارگذاری کنید و دسترسی‌ها را تنظیم کنید.
دو حالتی که در آن‌ها vhost ساخته نمی‌شود — اسکریپت در پایان کار صریحاً این را اعلام می‌کند. در این صورت نخست شاخهٔ مناسب را در پایین اجرا کنید و تنها پس از آن فایل‌ها را بارگذاری نمایید.

شاخهٔ «سرور با پنل هاستینگ» (در خروجی: Control panel detected (…)). روی چنین سروری سایت‌ها را پنل مدیریت می‌کند و اسکریپت عمداً vhost خودش را نمی‌سازد — با نخستین بازسازی پیکربندی‌ها توسط پنل پاک می‌شد. ترتیب کار چنین است:

  1. در پنل هاستینگ (HestiaCP و مانند آن) یک وب‌دامنه بسازید — DocumentRoot آن دست‌نخورده می‌ماند.
  2. بستهٔ نصب را به‌طور کامل در public_html همان دامنه بارگذاری کنید: کنار index.php، api/، assets/ باید پوشه‌ها و فایل‌های خدماتی config.php، includes/، data/، tmp/، logs/، keys/، cron/، database/ هم قرار بگیرند. لازم نیست چیزی را بالاتر از ریشهٔ وب ببرید: پوشه‌های خدماتی با فایل .htaccess بستهٔ نصب بسته شده‌اند و زیر Nginx با قاعدهٔ منعی که اسکریپت در پیکربندی دامنه نوشته است.
  3. SSL با کلید Let's Encrypt در خود پنل صادر می‌شود — گام ۰۶ را رد کنید.
  4. سپس دسترسی‌ها (پایین‌تر در همین گام)، پایگاه داده (گام ۰۴) و config.php (گام ۰۵). مسیرها را در دستورها با /home/حساب/web/دامنه/public_html و مالک را به‌جای www-data با کاربر همان دامنه جایگزین کنید.

شاخهٔ «ساخت دستی vhost» (در خروجی: No vhost created (no domain given)). این فقط روی نمایهٔ «سرور پیکربندی‌شده» و زمانی رخ می‌دهد که دامنه داده نشده باشد. ساده‌ترین راه، اجرای دوبارهٔ فرمان حساب کاربری همراه با دامنه است:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo bash -s -- monitor.example.com

اجرای دوباره ایمن است: آنچه انجام شده تکرار نمی‌شود. اما اگر می‌خواهید vhost را دستی بسازید — این همان پیکربندی‌ای است که نصب‌کننده می‌نویسد:

sudo mkdir -p /var/www/monitor # سوکت PHP-FPM را خودکار تشخیص می‌دهیم — نسخهٔ PHP روی سرورها متفاوت است. PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) sudo tee /etc/apache2/sites-available/arciveo-monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/arciveo-monitor_error.log CustomLog ${APACHE_LOG_DIR}/arciveo-monitor_requests.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/arciveo-monitor.conf sudo a2ensite arciveo-monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2
ServerName در اینجا الزامی است. یک vhost بی‌نام به سایت پیش‌فرض Apache تبدیل می‌شود و شروع به پاسخ‌گویی برای دامنه‌های دیگر همان سرور می‌کند. به همین دلیل روی سرور پیکربندی‌شده 000-default.conf را غیرفعال نکنید: ممکن است این سایت برای یک پروژهٔ فعال بازسازی شده باشد — روی VPS تازه نصب‌کننده خودش آن را برمی‌دارد و اینجا نیازی به این کار نیست.
اگر جلوی Apache یک Nginx قرار دارد (در خروجی: ! Nginx does not read .htaccess). Nginx فایل‌های ایستا را مستقیم از دیسک می‌دهد و .htaccess را نمی‌خواند — پوشه‌های خدماتی به بیرون باز می‌مانند، هرچند Apache آن‌ها را درست می‌بندد. اسکریپت از پیش فایلی با قواعد منع آماده کرده است؛ باید آن را در بلوک server{} سایت خود include کنید و Nginx را بازخوانی نمایید:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # بررسی: باید 403 برگرداند، نه محتوای فایل curl -sI https://monitor.example.com/config.php | head -1
فایل‌های پنل (آرشیو بستهٔ نصب) پس از خرید در حساب کاربری my.arciveo.com ← «دانلودها» دانلود می‌شوند. پیش از بارگذاری روی سرور، آرشیو را از حالت فشرده خارج کنید.

محتوای بستهٔ نصب را بارگذاری کنید در /var/www/monitor (به‌گونه‌ای که public/، assets/، config.php و غیره داخل آن قرار گیرند) — از طریق SFTP/SCP (FileZilla / WinSCP) یا با فرمان scp از رایانهٔ محلی:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
برای اینکه دامنهٔ شما بی‌درنگ در vhost ثبت شود (ServerName)، آن را همان در گام 01 به فرمان پیکربندی خودکار می‌دهند: … | sudo bash -s -- monitor.example.com (یا دامنه را در فیلد «دامنهٔ پنل» در حساب کاربری وارد می‌کنند). اگر دامنه‌ای داده نشود — پنل به هر هاست و از طریق IP پاسخ می‌دهد و certbot هنگام صدور SSL (گام 06) مقدار ServerName را ثبت می‌کند؛ نیازی به نصب دوباره نیست.
دسترسی فایل‌ها را تنظیم کنید — این گام الزامی است. اگر با root یا از طریق SFTP بارگذاری کرده‌اید، فایل‌ها متعلق به root هستند و وب‌سرور (www-data) نمی‌تواند آن‌ها را بخواند — پنل خالی یا با خطای 403 باز می‌شود (در لاگ: .htaccess unreadable / directory not executable). فرمان زیر این را برطرف می‌کند:
# دسترسی کل وب‌روت را عادی می‌کنیم: دایرکتوری‌ای که root ساخته برای # وب‌سرور (www-data) قابل دسترس نیست — بدون این کار پنل صفحهٔ خالی یا 403 می‌دهد. cd /var/www/monitor # پوشه‌های کاری را پیش از chown می‌سازیم — وگرنه دایرکتوری‌های جدید root:root می‌مانند # و با chmod 750 وب‌سرور (www-data) نمی‌تواند در آن‌ها بنویسد. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

بارگذاری فایل با SFTP را برای خودتان باز کنید. پس از دستور بالا همهٔ فایل‌ها متعلق به www-data هستند، در حالی که FileZilla / WinSCP با کاربر خودتان وصل می‌شوند — آنگاه بارگذاری با خطای SSH_FX_PERMISSION_DENIED (Permission denied) شکست می‌خورد. یکی از دو گزینه را انتخاب کنید.

گزینهٔ A — یک ACL فقط برای کاربر خودتان (توصیه‌شده). دسترسی نوشتن تنها به شما داده می‌شود و وب‌سرور همچنان نمی‌تواند کد پنل را بازنویسی کند:

sudo apt install -y acl # دسترسی نوشتن برای کاربر شما روی کل پوشهٔ پنل: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # همان قاعده به‌صورت پیش‌فرض — برای فایل‌ها و پوشه‌هایی که بعداً ساخته می‌شوند: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

گزینهٔ B — از طریق گروه www-data. ساده‌تر است، اما دسترسی نوشتن روی فایل‌های پنل به وب‌سرور هم می‌رسد: با وجود یک آسیب‌پذیری در PHP می‌توان کد را جایگزین کرد. ترتیب دستورها مهم است — config.php و پوشه‌های کاری در پایان بسته می‌شوند:

sudo usermod -aG www-data deploy # دسترسی نوشتن برای گروه + setgid (بیت ۲): فایل‌های بارگذاری‌شده با SFTP # در گروه www-data باقی می‌مانند — وگرنه پنل نمی‌تواند آن‌ها را بازنویسی کند. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
پس از گزینهٔ B در FileZilla دوباره وصل شوید (سرور ← قطع اتصال، سپس ورود دوباره) — گروه جدید فقط با ورود تازه اعمال می‌شود و تا آن زمان همچنان دسترسی نخواهید داشت. بررسی: id deploy — در فهرست گروه‌ها باید www-data ظاهر شود؛ ls -ld /var/www/monitor — دسترسی‌ها drwxrwsr-x و حرف s به‌جای x یعنی setgid تنظیم شده است.

04. پایگاه داده

پایگاه داده و کاربر را بسازید، سپس شِما را وارد کنید. بلوک مربوط به پایگاه داده را به‌طور کامل در ترمینال بچسبانید (sudo mysql با کاربر root از طریق unix-socket وارد می‌شود — رمز root لازم نیست). monitor_db و monitor_user فقط نمونه هستند و می‌توانید هر نامی که خواستید بگذارید؛ نام پایگاه داده، کاربر و رمز را به خاطر بسپارید — در مرحله بعد آن‌ها را در config.php وارد می‌کنید:

# 1. پایگاه داده. نام پایگاه داده، کاربر و رمز عبور یک بار در پایین تعیین و در همه خطوط جایگذاری می‌شوند. # بلوک را به‌طور کامل در ترمینال بچسبانید؛ sudo mysql با کاربر root از unix-socket وارد می‌شود # (رمز root لازم نیست). از حالت تعاملی `sudo mysql -u root -p` # با کپی-پیست استفاده نکنید — هنگام چسباندن، خطوط SQL وارد بخش درخواست رمز می‌شوند و از بین می‌روند. DBNAME='monitor_db' # ← نام پایگاه داده، می‌تواند بماند DBUSER='monitor_user' # ← کاربر پایگاه داده، می‌تواند بماند DBPASS='CHOOSE_A_PASSWORD' # ← رمز عبور، رمز خود را بگذارید sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS $DBNAME CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON $DBNAME.* TO '$DBUSER'@'localhost'; FLUSH PRIVILEGES; SQL # بررسی (باید $DBNAME را نشان دهد): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # همین سه مقدار را در config.php → DB_NAME, DB_USER, DB_PASS وارد کنید.
معمولاً نیازی به وارد کردن شِما نیست — پنل هنگام اولین ورود در مرورگر، جدول‌ها و حساب admin را خودش می‌سازد (از database/db.sql)، اگر پایگاه داده خالی باشد.

اگر جدول‌ها ساخته نشدند (پنل خطای اتصال به پایگاه داده یا صفحهٔ خالی به‌جای فرم ورود نشان می‌دهد) — شِما را دستی وارد کنید. دستور در ریشهٔ پنل اجرا می‌شود و مقادیر از بلوک بالا گرفته می‌شوند:

# وارد کردن شِما: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # بررسی — باید فهرست جدول‌ها ظاهر شود: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
اگر متغیرهای $DBNAME / $DBUSER / $DBPASS دیگر «فراموش» شده‌اند (نشست تازهٔ ترمینال) — مقادیر را دستی در دستور بگذارید یا آن‌ها را با همان سه خط بلوک بالا دوباره تعیین کنید.
sudo برای وب‌سرور. معمولاً این قواعد را پیکربندی خودکار نوشته است و ماژول‌ها بی‌درنگ داده‌های سیستمی را می‌بینند. اما اگر در خروجی اسکریپت خط sudo rules NOT written بود — چیزی برای تشخیص حساب پنل وجود نداشت (فایل‌ها هنوز بارگذاری نشده بودند) و قواعد ساخته نشده‌اند. بدون آن‌ها بخش‌هایی مانند فایروال، Fail2ban و CrowdSec خالی می‌مانند. حالا که فایل‌ها سر جای خود هستند، فرمان حساب کاربری را یک بار دیگر اجرا کنید و حساب را صریحاً نام ببرید:
curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo ARCIVEO_USER=www-data bash -s -- monitor.example.com
www-data را با کاربری که PHP سایت شما با آن اجرا می‌شود جایگزین کنید (روی پنل هاستینگ معمولاً مالک دامنه است). آن را چنین می‌توان دید:
ps -o user= -C php-fpm8.3 | sort -u # نسخه را خودتان بگذارید # یا: ps aux | grep -m3 '[p]hp-fpm'
بررسی پس از اجرای دوباره: فایل /etc/sudoers.d/monitor وجود دارد و در آن خط‌هایی با کاربر شما هست.

05. پیکربندی config.php

config.php در ریشهٔ پنل (/var/www/monitor/config.php) تنها فایلی است که باید دستی ویرایش شود. همهٔ تنظیمات پنل در آن با ثابت‌های define() تعریف شده‌اند. آن را در ویرایشگر باز کنید:

sudo nano /var/www/monitor/config.php

مقادیر خود را در جاهای برجسته‌شده قرار دهید؛ بقیه را دست‌نخورده رها کنید:

// --- پایگاه داده (از گام ۰۴) --- define('DB_HOST', 'localhost'); // بدون تغییر define('DB_NAME', 'db_name'); // آنچه در گام ۰۴ ساختید define('DB_USER', 'user'); // آنچه در گام ۰۴ ساختید define('DB_PASS', 'db_password'); // آنچه در گام ۰۴ تعیین کردید define('DB_CHARSET', 'utf8mb4'); // بدون تغییر // --- برنامه --- define('APP_URL', 'https://monitor.example.com'); // آدرس پنل، بدون اسلش انتهایی define('TIMEZONE', 'Asia/Tehran'); // منطقهٔ زمانی شما // --- زمان نشست --- define('SESSION_LIFETIME', 28800); // بی‌کاری تا ورود مجدد، ثانیه (28800 = 8 ساعت)

چه چیزی را تغییر دهید:

  • DB_NAME، DB_USER، DB_PASS — دقیقاً همان نام پایگاه داده، کاربر و رمزی که هنگام ایجاد پایگاه داده در گام ۰۴ تعیین کردید (اگر مثال‌ها را نگه داشتید — monitor_db / monitor_user). DB_HOST و DB_CHARSET را دست نزنید.
  • APP_URL — آدرس کامل پنل همراه با https://، بدون اسلش انتهایی و بدون www. باید با دامنه‌ای که لایسنس را روی آن فعال می‌کنید (گام ۰۷) یکسان باشد، وگرنه کلید رد می‌شود.
  • TIMEZONE — منطقهٔ زمانی شما (فهرست — timedatectl list-timezones). فقط بر نحوهٔ نمایش تاریخ‌ها در پنل اثر می‌گذارد؛ بر زمان اجرای کارهای cron اثری ندارد (آنجا منطقهٔ زمانی سیستم حاکم است).
  • SESSION_LIFETIME — پس از چند ثانیه بی‌کاری پنل ورود مجدد می‌خواهد (پیش‌فرض ۸ ساعت). مثلاً 3600 = ۱ ساعت، 86400 = یک شبانه‌روز.
  • بخش ثبت خطاها (display_errors، log_errors، error_log) — پیش‌فرض را نگه دارید.

فایل را ذخیره کنید (Ctrl+O، Enter، سپس Ctrl+X) و PHP-FPM را ری‌استارت کنید — وگرنه به دلیل OPcache تغییرات اعمال نمی‌شوند:

sudo systemctl restart php*-fpm
config.php یک فایل محرمانه است (رمز پایگاه داده در آن است). در ریشهٔ پنل قرار دارد که همان ریشهٔ وب است، اما محافظت‌شده: دسترسی 640 (در گام ۰۳ تنظیم شده) و منع صریح در .htaccess ریشه. آن را در مخازن عمومی قرار ندهید و با رمز واقعی به پشتیبانی نفرستید.
بررسی دقیق همهٔ پارامترها در FAQ: «فایل config.php — همهٔ تنظیمات پنل».

06. صدور SSL (HTTPS)

پنل فقط با HTTPS کار می‌کند. نشست ورود از یک کوکی امن استفاده می‌کند و WebAuthn (2FA) طبق استاندارد فقط روی HTTPS کار می‌کند. با http:// نمی‌توانید وارد شوید.
روی سروری با پنل هاستینگ این گام لازم نیست (در خروجی اسکریپت: Certbot skipped — issue SSL in …). گواهی با کلید Let's Encrypt روی وب‌دامنه در خود پنل صادر می‌شود — تمدید آن را هم همان پنل بر عهده می‌گیرد.

certbot و افزونه Apache در پیکربندی خودکار نصب شده‌اند. DNS دامنه باید پیش‌تر به سرور اشاره کند (گام 02). صدور با یک فرمان:

sudo certbot --apache -d monitor.example.com

اگر پنل باید با www. هم باز شود — هر دو نام را در یک دستور بیاورید، وگرنه روی نشانی دوم مرورگر دربارهٔ گواهی هشدار می‌دهد:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
نام دوم را تنها در صورتی اضافه کنید که برای آن هم یک رکورد A به همین سرور وجود داشته باشد (گام ۰۲). در غیر این صورت Let's Encrypt نمی‌تواند آن را بررسی کند و گواهی را به‌طور کامل — از جمله برای دامنهٔ اصلی — صادر نمی‌کند.
چیزهایی که certbot می‌پرسد:
  1. Enter email address — ایمیل شما (اعلان‌های انقضای گواهی به آنجا می‌آید).
  2. Terms of Service … (Y)es/(N)o — Y.
  3. Share email with the EFF … (Y)es/(N)o — به انتخاب خودتان.
سپس certbot خودش گواهی را صادر می‌کند، <VirtualHost *:443> را می‌نویسد، ریدایرکت http→https و تمدید خودکار را تنظیم می‌کند. در پایان — Successfully enabled HTTPS.
اگر صدور با خطا مواجه شد — بررسی کنید که dig +short monitor.example.com آدرس IP سرور را برگرداند و پورت‌های 80/443 باز باشند (sudo ufw allow 80,443/tcp).

پس از صدور: https://monitor.example.com با قفل باز می‌شود و http:// به https:// ریدایرکت می‌شود.

07. ورود و پیکربندی اولیه

https://monitor.example.com را باز کنید، با admin / useradmin وارد شوید و چک‌لیست را طی کنید:

  1. تغییر رمز عبور admin — بخش «کاربران» در منو.
  2. فعال‌سازی WebAuthn (2FA) — «کلیدهای WebAuthn» ← ثبت کلید/passkey (نیازمند HTTPS). همان ابتدا دو کلید ثبت کنید: با گم شدن تنها کلید، ورود با آن ممکن نخواهد بود. جزئیات بیشتر.
  3. محدودسازی دسترسی بر اساس IP — «تنظیمات» ← «محدودسازی دسترسی بر اساس IP» (پیش از فعال‌سازی IP خود را وارد کنید، وگرنه دسترسی خود را می‌بندید).
  4. ورود لایسنس — کد فعال‌سازی ARCIVEO-… از حساب کاربری را روی دامنه خود فعال کنید و کلید را در «تنظیمات» ← «لایسنس» وارد کنید. جزئیات بیشتر.
  5. پیکربندی اعلان‌ها — Telegram و/یا Email در «تنظیمات». جزئیات بیشتر.
  6. حذف نصب‌کننده public/start_db.php، اگر باقی مانده است: این فایل امکان بازسازی پایگاه داده بدون احراز هویت را می‌دهد. تا زمانی که این فایل در ریشه پنل یا در public/ باشد، پنل با یک بنر قرمز درباره آن هشدار می‌دهد.
  7. اجرای دستی نخستین بررسی‌ها — وگرنه بخشی از بخش‌ها تا شب خالی می‌مانند (بلوک زیر را ببینید).
چرا «ممیزی Lynis» و «Logwatch» در ابتدا خالی‌اند. پیکربندی خودکار ابزارها را نصب و وظایف cron را ایجاد کرده است، اما خود بررسی‌ها را اجرا نکرده — آن‌ها طبق زمان‌بندی انجام می‌شوند: Lynis ساعت ۰۳:۰۰، Logwatch ساعت ۰۶:۰۰، debsums ساعت ۰۴:۳۰، ClamAV ساعت ۰۱:۳۰. تا آن زمان این بخش‌ها صادقانه نشان می‌دهند که هنوز گزارشی وجود ندارد. برای اینکه یک شبانه‌روز منتظر نمانید، یک بار آن‌ها را دستی اجرا کنید:
# ممیزی Lynis — نخستین گزارش (چند دقیقه): sudo /usr/local/bin/lynis-scan.sh # گزارش Logwatch برای یک شبانه‌روز: sudo /usr/local/bin/logwatch_daily.sh # یکپارچگی بسته‌ها (debsums) — روی سرور بزرگ طولانی است: sudo /usr/local/bin/debsums-scan.sh
Lynis را از خود پنل هم می‌توان اجرا کرد — دکمهٔ «اجرای ممیزی» در صفحهٔ «ممیزی Lynis»: همان اسکریپت را در پس‌زمینه اجرا می‌کند و گزارش را خودش به‌روز می‌کند. پس از آن همه‌چیز طبق زمان‌بندی پیش می‌رود و دیگر نیازی به اجرای دستی نیست.
نخستین پویش آنتی‌ویروس (sudo /usr/local/bin/clamav-scan.sh) دیسک و پردازنده را به‌شدت بار می‌کند و ممکن است یک ساعت و بیشتر طول بکشد — روی سرور فعال بهتر است منتظر اجرای شبانه در ۰۱:۳۰ بمانید. بخش‌های «دیسک‌ها (SMART)»، «کارایی» و «به‌روزرسانی‌های امنیتی» خودشان پر می‌شوند: به‌ترتیب هر ۳۰ دقیقه، هر ۵ دقیقه و ساعتی یک بار.
تمام شد. راهنمای هر ابزار در FAQ است.
اگر روی این سرور به سایت دیگری با دامنهٔ خودش نیاز دارید — به FAQ مراجعه کنید: «سایت دوم روی همین سرور (یک دامنه دیگر)».