স্বয়ংক্রিয় ইনস্টলেশন

স্বয়ংক্রিয় পদ্ধতি: অ্যাকাউন্ট থেকে একটি স্ক্রিপ্ট গোটা সার্ভার প্রস্তুত করে (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 আপডেট)।

1) সুরক্ষার স্তর বেছে নিন (অ্যাকাউন্টে, কমান্ড কপি করার আগে):

  • সম্পূর্ণ সুরক্ষা (প্রস্তাবিত) — 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, স্বয়ংক্রিয় নিরাপত্তা আপডেট।
  • হালকা সংস্করণ — কম RAM-এর VPS-এর জন্য: ভারী কম্পোনেন্ট ছাড়া মৌলিক সেট।
  • কনফিগার করা সার্ভার (হোস্টিং-প্যানেল) — প্যানেল (HestiaCP প্রভৃতি), সাইট ও মেইলসহ ইতিমধ্যে চালু সার্ভারের জন্য: শুধু সংযোজনমূলক পরিবর্তন (টুল অতিরিক্ত ইনস্টল, cron, sudo-নিয়ম), আর ফায়ারওয়াল, Fail2ban, মেইল, SSH ও sysctl যেমন আছে তেমনই থাকে। প্যানেলযুক্ত সার্ভারে স্ক্রিপ্ট নিজেই এই মোড বেছে নেয়।
শুকনো রান। অ্যাকাউন্টে “শুকনো রান” চেকবক্স দেওয়া যায় — তখন কমান্ড শুধু দেখাবে স্ক্রিপ্ট কী ইনস্টল ও পরিবর্তন করবে, এবং কিছু না ছুঁয়ে শেষ হবে। ইতিমধ্যে কনফিগার করা সার্ভারে উপযোগী: প্রথমে রান, তারপর চেকবক্স ছাড়া প্রকৃত লঞ্চ।

2) সার্ভারে root হিসেবে চালান অ্যাকাউন্টের কমান্ডটি — এটি দেখতে এমন:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
কমান্ডটি গোপন রাখুন — এটি আপনার অ্যাকাউন্টের সাথে যুক্ত। লিঙ্কের মেয়াদ সীমিত; মেয়াদ শেষ হলে অ্যাকাউন্টে “নতুন লিঙ্ক নিন” চাপুন।
স্বয়ংক্রিয় সেটআপের পরে ওয়েব-সার্ভার — Apache + PHP-FPM, আর নিরাপত্তা টুল ও cron-টাস্ক ইতিমধ্যে ইনস্টল করা ও “বাক্স থেকেই” চালু।

3) শেষের আউটপুটটি পড়ুন — সেখানেই লেখা থাকে কী আপনার উপর রয়ে গেল। স্ক্রিপ্ট তার কাজ শেষ করে যাচাইয়ের একটি ব্লক এবং “এরপর — প্যানেল ইনস্টল” তালিকা দিয়ে। কিছু ধাপ সে ইচ্ছাকৃতভাবে করে না: ঠিক কোনগুলো, তা নির্ভর করে নির্বাচিত প্রোফাইলের উপর এবং সার্ভারে সে কী পেয়েছে তার উপর। নিচের তালিকার সাথে মিলিয়ে নিন — শুধু সেই পয়েন্টগুলোই করতে হবে, যাদের লাইন আপনার আউটপুটে এসেছে।

  • 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, .htaccess-এর জন্য AllowOverride)। স্ক্রিপ্টের আউটপুটে এটি 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{} ব্লকে যুক্ত করে 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-তে সাড়া দেয়, আর SSL ইস্যুর সময় (ধাপ 06) certbot নিজেই 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 (বিট 2): 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, x-এর জায়গায় s অক্ষরের মানে setgid সেট করা আছে।

04. ডেটাবেস

একটি ডেটাবেস ও ব্যবহারকারী তৈরি করুন, তারপর স্কিমা ইম্পোর্ট করুন। ডেটাবেস ব্লকটি টার্মিনালে সম্পূর্ণভাবে পেস্ট করা হয় (sudo mysql ইউনিক্স-সকেটের মাধ্যমে root হিসেবে প্রবেশ করে — root পাসওয়ার্ড লাগে না)। monitor_db ও monitor_user উদাহরণের নাম, আপনি নিজের যেকোনো নাম দিতে পারেন; ডেটাবেসের নাম, ব্যবহারকারী ও পাসওয়ার্ড মনে রাখুন — পরের ধাপে সেগুলো config.php-তে লিখবেন:

# 1. ডেটাবেস। ডেটাবেসের নাম, ব্যবহারকারী ও পাসওয়ার্ড নিচে একবারই দেওয়া হয় এবং সব লাইনে বসানো হয়। # ব্লকটি টার্মিনালে সম্পূর্ণভাবে পেস্ট করুন; sudo mysql ইউনিক্স-সকেটে root হিসেবে প্রবেশ করে # (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/Dhaka'); // আপনার টাইমজোন // --- সেশনের মেয়াদ --- 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 — আপনার e-mail (সার্টিফিকেট মেয়াদ শেষের নোটিফিকেশন সেখানে আসবে)।
  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 দেখুন: “এই সার্ভারে দ্বিতীয় সাইট (আরও একটি ডোমেন)”।