لبدء التثبيت على نظام جديد تمامًا، اتبع هذه الخطوات بدقة:
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y curl wget git unzip dialog ca-certificateswget https://raw.githubusercontent.com/jaksws/hestia-odoo-installer/main/installer.sh
chmod +x installer.sh
dos2unix installer.shsudo ./installer.sh --install 2>&1 | tee install.log# التحقق من HestiaCP
curl -k https://localhost:2083
# التحقق من Odoo
curl -I http://localhost:8069
# التحقق من سجلات التثبيت
tail -f install.log# تغيير كلمة مرور root (اختياري)
# تم تضمين هذه الخطوة في السكربت، لا حاجة لإجراء إضافي
# إعداد جدار الحماية
# تم تضمين هذه الخطوة في السكربت، لا حاجة لإجراء إضافي# تم تضمين هذه الخطوة في السكربت، لا حاجة لإجراء إضافي# تثبيت Certbot
sudo apt install -y certbot
# الحصول على شهادة SSL
sudo certbot certonly --standalone -d example.com
# إعداد Nginx كوكيل عكسي مع SSL
sudo nano /etc/nginx/sites-available/odoo
# أضف التكوين التالي:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# تفعيل التكوين
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
sudo systemctl restart nginx
# إعداد تجديد الشهادة التلقائي باستخدام Certbot
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer# تثبيت Visual Studio Code
sudo snap install --classic code
# تثبيت ملحق GitHub Copilot
code --install-extension GitHub.copilot
# تسجيل الدخول إلى حساب GitHub الخاص بك
# اتبع التعليمات التي تظهر على الشاشة# التحقق من صحة اسم النطاق
if [[ -z "$DOMAIN" || ! "$DOMAIN" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "اسم النطاق غير صالح."
exit 1
fi
# التحقق من صحة عنوان IP
if [[ -z "$SERVER_IP" || ! "$SERVER_IP" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
echo "عنوان IP غير صالح."
exit 1
fi
# التحقق من صحة منفذ هيستيا
if [[ -z "$HESTIA_PORT" || ! "$HESTIA_PORT" =~ ^[0-9]{1,5}$ || "$HESTIA_PORT" -lt 1 || "$HESTIA_PORT" -gt 65535 ]]; then
echo "منفذ هيستيا غير صالح."
exit 1
fi
# التحقق من صحة إصدار Odoo
if [[ -z "$ODOO_VERSION" || ! "$ODOO_VERSION" =~ ^[0-9]+\.[0-9]+$ ]]; then
echo "إصدار Odoo غير صالح."
exit 1
fi
# التحقق من صحة منفذ Odoo
if [[ -z "$ODOO_PORT" || ! "$ODOO_PORT" =~ ^[0-9]{1,5}$ || "$ODOO_PORT" -lt 1 || "$ODOO_PORT" -gt 65535 ]]; then
echo "منفذ Odoo غير صالح."
exit 1
fi
# التحقق من صحة مفتاح API الخاص بـ Cloudflare
if [[ -ن "$CF_API" && ! "$CF_API" =~ ^[a-zA-Z0-9]{32}$ ]]; then
echo "مفتاح API الخاص بـ Cloudflare غير صالح."
exit 1
fi
# التحقق من صحة البريد الإلكتروني الخاص بـ Cloudflare
if [[ -ن "$CF_EMAIL" && ! "$CF_EMAIL" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "البريد الإلكتروني الخاص بـ Cloudflare غير صالح."
exit 1
fi
# التحقق من صحة معرف المنطقة الخاص بـ Cloudflare
if [[ -ن "$CF_ZONE" && ! "$CF_ZONE" =~ ^[a-zA-Z0-9]{32}$ ]]; then
echo "معرف المنطقة الخاص بـ Cloudflare غير صالح."
exit 1
fisudo apt install -y python3-dev python3-pip python3-venvsudo systemctl restart postgresql
sudo -u postgres psql -c "CREATE USER odoo WITH PASSWORD 'odoo';"# إعادة تكوين DNS يدويًا
sudo nano installer.sh
# ابحث عن قسم Cloudflare وأدخل API keys يدويًاsudo ./installer.sh --uninstall
sudo rm -rf /usr/local/hestia /opt/odoo
sudo ./installer.sh --installأرسل لي مخرجات الأمر التالي إذا استمرت المشكلة:
tail -n 50 install.log# تحديث النظام الأساسي
sudo apt update && sudo apt full-upgrade -y
# تثبيت التبعيات الأساسية
sudo apt install -y curl wget git unzip dialog ca-certificates
# تنزيل السكربت وتجهيزه
wget https://raw.githubusercontent.com/jaksws/hestia-odoo-installer/main/installer.sh
chmod +x installer.sh
dos2unix installer.sh
# تشغيل التثبيت مع المراقبة
sudo ./installer.sh --install 2>&1 | tee install.log
# التحقق من المكونات الأساسية بعد التثبيت
curl -k https://localhost:2083
curl -I http://localhost:8069
tail -f install.log
# إعدادات ما بعد التثبيت
sudo passwd root
sudo ufw allow 2083/tcp
sudo ufw allow 8069/tcp
sudo ufw enable
# إعداد HTTPS
sudo apt install -y certbot
sudo certbot certonly --standalone -d example.com
sudo nano /etc/nginx/sites-available/odoo
# أضف التكوين التالي:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
sudo systemctl restart nginx
# تكامل GitHub Copilot
sudo snap install --classic code
code --install-extension GitHub.copilot
# تسجيل الدخول إلى حساب GitHub الخاص بك
# اتبع التعليمات التي تظهر على الشاشة# إضافة مستودع Ondrej Sury
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# تثبيت إصدارات PHP
sudo apt install -y php8.2 php8.3 php8.4
# التحقق من التثبيت
php8.2 -v
php8.3 -v
php8.4 -v# استخدام `screen`
sudo apt install screen -y
screen -S hestia_install
sudo ./installer.sh
# اضغط `Ctrl+A` ثم `D` للانفصال عن الجلسة.
# أعِد الاتصال لاحقًا بـ:
screen -r hestia_install
# استخدام `nohup`
nohup sudo ./installer.sh > install.log 2>&1 &
# تابع التقدم بـ:
tail -f install.log# تثبيت HestiaCP يتضمن خدمات البريد الإلكتروني مثل Exim و Dovecot
# لا حاجة لإجراء إضافي# استخدام `set -e` في بداية السكربت لضمان خروج السكربت فورًا إذا فشل أي أمر
set -e
# استخدام `trap` لالتقاط الأخطاء وتنفيذ إجراءات التنظيف
trap 'echo "حدث خطأ. الخروج..."; exit 1' ERR
# التحقق من نجاح الأوامر الحرجة والتعامل مع الأخطاء وفقًا لذلك
if ! wget -q https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh; then
echo "فشل في تنزيل سكربت HestiaCP."
exit 1
fi
# تجنب تسجيل المعلومات الحساسة مثل كلمات المرور ومفاتيح API# تثبيت Nginx
sudo apt install -y nginx
# الحصول على شهادة SSL باستخدام Certbot
sudo apt install -y certbot
sudo certbot certonly --standalone -d example.com
# إعداد Nginx كوكيل عكسي مع SSL
sudo nano /etc/nginx/sites-available/odoo
# أضف التكوين التالي:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# تفعيل التكوين وإعادة تشغيل Nginx
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
sudo systemctl restart nginx# اكتشاف نظام التشغيل
OS=$(uname -s)
case $OS in
Linux)
DISTRO=$(lsb_release -is)
VERSION=$(lsb_release -rs)
echo "نظام التشغيل: $DISTRO $VERSION"
;;
Darwin)
echo "نظام التشغيل: macOS"
;;
*)
echo "نظام التشغيل غير مدعوم"
exit 1
;;
esac
# تطبيق الإعدادات المخصصة بناءً على البيئة
if [[ $DISTRO == "Ubuntu" ]]; then
echo "تطبيق إعدادات مخصصة لـ Ubuntu..."
sudo apt update
sudo apt install -y curl wget git unzip dialog ca-certificates jq
elif [[ $DISTRO == "Debian" ]]; then
echo "تطبيق إعدادات مخصصة لـ Debian..."
sudo apt update
sudo apt install -y curl wget git unzip dialog ca-certificates jq
elif [[ $DISTRO == "CentOS" ]]; then
echo "تطبيق إعدادات مخصصة لـ CentOS..."
sudo yum update -y
sudo yum install -y curl wget git unzip dialog ca-certificates jq
else
echo "التوزيعة غير مدعومة"
exit 1
fi# تثبيت Docker
if ! command -v docker &> /dev/null; then
echo "جارٍ تثبيت Docker..."
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
fi
# تثبيت Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "جارٍ تثبيت Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi# إعداد Docker Compose لـ Odoo و PostgreSQL
DOMAIN=$1
USER=$2
APP_NAME="odoo_${DOMAIN//./_}"
ODDO_DIR="/home/$USER/web/$DOMAIN"
DB_NAME="${USER}_${DOMAIN//./_}"
DB_USER="${USER}_odoo"
DB_PASSWORD=$(openssl rand -base64 12)
PORT=$(shuf -i 8000-9000 -n 1)
SSL_EMAIL="admin@$DOMAIN"
mkdir -p $ODDO_DIR/{public_html,addons,config}
chown -R $USER:$USER $ODDO_DIR
if ! /usr/local/hestia/bin/v-add-database "$USER" "$DB_NAME" "$DB_USER" "$DB_PASSWORD"; then
echo "فشل إنشاء قاعدة البيانات. يتم التراجع..."
exit 1
fi
cat > $ODDO_DIR/docker-compose.yml <<EOL
version: '3'
services:
odoo:
image: odoo:latest
container_name: $APP_NAME
restart: unless-stopped
ports:
- "$PORT:8069"
volumes:
- $ODDO_DIR/addons:/mnt/extra-addons
- $ODDO_DIR/config:/etc/odoo
environment:
- HOST=postgres
- USER=$DB_USER
- PASSWORD=$DB_PASSWORD
- DB_NAME=$DB_NAME
depends_on:
- postgres
postgres:
image: postgres:13
container_name: ${APP_NAME}_db
restart: unless-stopped
environment:
- POSTGRES_USER=$DB_USER
- POSTGRES_PASSWORD=$DB_PASSWORD
- POSTGRES_DB=$DB_NAME
volumes:
- $ODDO_DIR/postgres:/var/lib/postgresql/data
EOL
sudo -u $USER docker-compose -f $ODDO_DIR/docker-compose.yml up -d || {
echo "فشل تشغيل الحاويات. يتم التراجع..."
/usr/local/hestia/bin/v-delete-database "$USER" "$DB_NAME"
exit 1
}
cat > /etc/nginx/sites-available/$DOMAIN <<EOL
server {
listen 80;
server_name $DOMAIN;
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl;
server_name $DOMAIN;
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
location / {
proxy_pass http://localhost:$PORT;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
}
EOL
ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
systemctl reload nginx
if ! certbot --nginx -d $DOMAIN --non-interactive --agree-tos -m $SSL_EMAIL; then
echo "فشل إصدار شهادة SSL. يتم الاستمرار بدون SSL..."
rm /etc/nginx/sites-enabled/$DOMAIN
cp $ODDO_DIR/nginx-backup.conf /etc/nginx/sites-available/$DOMAIN
ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
systemctl reload nginx
fi
cat > /usr/local/bin/backup-$APP_NAME <<EOL
#!/bin/bash
tar -czf $ODDO_DIR/backup-\$(date +%F).tar.gz $ODDO_DIR/postgres $ODDO_DIR/addons
docker exec ${APP_NAME}_db pg_dump -U $DB_USER $DB_NAME > $ODDO_DIR/db-backup-\$(date +%F).sql
EOL
chmod +x /usr/local/bin/backup-$APP_NAME
echo "0 3 * * * root /usr/local/bin/backup-$APP_NAME" | sudo tee -a /etc/crontab
cat > /etc/fail2ban/jail.d/$APP_NAME.conf <<EOL
[$APP_NAME]
enabled = true
port = $PORT
filter = odoo
logpath = $ODDO_DIR/config/odoo-server.log
maxretry = 3
bantime = 1h
EOL
systemctl restart fail2ban
cat > $ODDO_DIR/installation-info.txt <<EOL
تم تثبيت Odoo بنجاح!
تفاصيل الوصول:
- العنوان: https://$DOMAIN
- اسم المستخدم (افتراضي): admin
- كلمة المرور (افتراضي): admin
- منفذ الحاوية: $PORT
- بيانات قاعدة البيانات:
- المضيف: localhost
- الاسم: $DB_NAME
- المستخدم: $DB_USER
- كلمة المرور: $DB_PASSWORD
نسخة احتياطية تلقائية يومية الساعة 3 صباحًا.
EOL
chown $USER:$USER $ODDO_DIR/installation-info.txt
echo "تم الانتهاء من التثبيت! تفاصيل التثبيت في: $ODDO_DIR/installation-info.txt"# إنشاء سكربت النسخ الاحتياطي
sudo tee /usr/local/bin/odoo-backup <<EOL
#!/bin/bash
BACKUP_DIR="/backups/odoo"
mkdir -p \$BACKUP_DIR
docker exec \$(docker ps -aqf "name=postgres") pg_dump -U $DB_USER $DB_NAME > \$BACKUP_DIR/\$(date +%F).sql
tar -czf \$BACKUP_DIR/\$(date +%F).tar.gz /var/lib/docker/volumes
EOL
# إعداد Cron Job
sudo chmod +x /usr/local/bin/odoo-backup
(crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/odoo-backup") | crontab -# التحقق من تعارض المنافذ
ss -tulpn | grep '8069\|5432'
# التحقق من حالة الخدمات
systemctl status nginx postgresql docker
# فحص السجلات
tail -50 /var/log/nginx/error.log
docker logs \$(docker ps -aqf "name=odoo")# تنظيف التبعيات
sudo apt purge -y nginx postgresql mariadb-server exim4 dovecot-core fail2ban vsftpd rspamd
sudo apt autoremove -y && sudo apt clean# إصلاح Nginx وCertbot
sudo apt install -y python3-certbot-nginx
sudo mkdir -p /etc/nginx/sites-{available,enabled}
sudo tee /etc/nginx/nginx.conf <<EOF
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events { worker_connections 768; }
http {
sendfile on; tcp_nopush on; types_hash_max_size 2048;
include /etc/nginx/mime.types; default_type application/octet-stream;
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
EOF
sudo nginx -t && sudo systemctl restart nginx# التحقق النهائي
sudo systemctl list-units --type=service | grep -E 'nginx|postgres|odoo'
ls -l /usr/local/hestia/bin/ /opt/odoo/ /etc/nginx/
ls -ld /home/*/web/*# إعادة تشغيل نهائية
sudo reboot