# Deploy (GitHub Actions → Server)

Repo: https://github.com/DigitalBondMena/mrkatatest

## Direction of sync

| Direction | How |
|-----------|-----|
| **Repo → Server** | Automatic on push to `main` via `.github/workflows/deploy.yml` (SSH + `git pull`) |
| **Server → Repo** | Manual only: commit on the server, then `git push origin main` |

Do **not** enable blind two-way autosync.

---

## أسرار GitHub

```
Repository secrets
```

Settings → Secrets and variables → Actions → Repository secrets

| Secret | ملاحظات |
|--------|---------|
| `SSH_HOST` | IP السيرفر أو hostname الـ SSH من cPanel (مش شرط يكون دومين الموقع) |
| `SSH_USER` | يوزر SSH |
| `SSH_PRIVATE_KEY` | المفتاح الخاص كامل |
| `SSH_PASSPHRASE` | باسورد المفتاح لو موجود |
| `SSH_PORT` | بورت SSH من cPanel (غالبًا مش 22) |
| `DEPLOY_PATH` | مسار المشروع على السيرفر |

---

## خطأ: Connection timed out

المعنى: GitHub مش قادر يوصل لسيرفرك على بورت SSH.  
مش مشكلة باسورد المفتاح.

### Checklist

1. **SSH_HOST**  
   لازم IP الحقيقي أو hostname الـ SSH من cPanel  
   مش دائمًا نفس دومين الموقع

2. **SSH_PORT**  
   لازم نفس الرقم من cPanel بالظبط  
   على الاستضافة المشتركة غالبًا **مش** `22`

3. **SSH Access**  
   لازم يكون مفعّل في cPanel

4. **Firewall**  
   الاستضافة ممكن تمنع IP بتاع GitHub Actions  
   اطلب من الدعم فتح SSH من الإنترنت، أو allowlist  
   لو الاستضافة تمنع SSH من برّه خالص → GitHub Actions مش هينفع

5. **اختبار من جهازك**

```
ssh -p PORT USER@HOST
```

- لو الشغل من جهازك تمام، و Actions يعمل timeout → غالبًا Firewall بيمنع GitHub  
- لو من جهازك كمان مش بيوصل → HOST أو PORT غلط، أو SSH مقفول

### بدائل لو SSH مقفول من برّه

- cPanel → Git Version Control → Pull يدوي
- Webhook داخل الاستضافة
- FTP deploy action (مش مفضل)

---

## قاعدة البيانات (DB)

**مهم جدًا:**  
ملف `.env` يفضل على السيرفر فقط.  
متحطّش باسورد الداتابيز في GitHub repo.  
ومتتعملش commit لـ `.env`.

### الطريقة الصحيحة

1. على السيرفر، داخل مجلد المشروع، عدّل `.env`:

```
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...
```

2. الـ deploy من GitHub بيسحب الكود فقط (`git pull`)  
   مش بيغيّر بيانات الداتابيز

3. لو كتبت باسورد الداتابيز في الشات → **غيّره فورًا من cPanel** (MySQL / Databases)  
   لأنّه اتكشف

---

## مفتاح SSH عليه باسورد (cPanel)

1. cPanel → SSH Access → Manage SSH Keys
2. المفتاح مثلاً `github_deploy`
3. Download للمفتاح **Private** (مش Public)
4. حطّه في `SSH_PRIVATE_KEY` كامل من `BEGIN` لـ `END`
5. Authorize للمفتاح العام
6. باسورد المفتاح → `SSH_PASSPHRASE`
7. Actions → Re-run

---

## خطأ: Permission denied (publickey)

المعنى: السيرفر رافض المفتاح أو اليوزر.  
الاتصال واصل، بس الدخول مرفوض.

### Checklist

1. السر:

```
SSH_USER
```

لازم يوزر cPanel (مثلاً `mrkata`)  
مش `root` ومش إيميل

2. السر:

```
SSH_PRIVATE_KEY
```

لازم المفتاح **الخاص** لنفس المفتاح المفعّل  
اسمه مثلاً:

```
github_deploy
```

من cPanel → View/Download → Private  
من أول `BEGIN` لآخر `END`

3. في cPanel للمفتاح العام: لازم يكون

```
Authorized
```

4. السر:

```
SSH_PASSPHRASE
```

لازم نفس باسورد المفتاح بالظبط

5. لو غيّرت المفتاح: انسخ الخاص تاني لـ GitHub وحدّث السر، وبعدين Re-run

### السيرفر يسحب من GitHub (`git pull`)

الـ workflow بيفضّل المفتاح:

```
~/.ssh/github_pull
```

(من غير باسورد)  
ولو مش موجود يستخدم:

```
~/.ssh/github_deploy
```

مع:

```
SSH_PASSPHRASE
```

### الطريقة المضمونة (مستحسن) — من ترمينال SSH على السيرفر

1) اعمل مفتاح من غير باسورد:

```bash
ssh-keygen -t ed25519 -f ~/.ssh/github_pull -N ""
```

2) اطبع المفتاح العام:

```bash
cat ~/.ssh/github_pull.pub
```

3) انسخ السطر ده → GitHub → الريبو → Settings → Deploy keys → Add deploy key  
(فعل Read access)

4) إعداد SSH على السيرفر:

```bash
cat > ~/.ssh/config <<'EOF'
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_pull
  IdentitiesOnly yes
EOF
```

5) صلاحيات:

```bash
chmod 600 ~/.ssh/config ~/.ssh/github_pull
```

6) اختبر:

```bash
ssh -T git@github.com
```

7) بعد كده Re-run للـ Actions

---




## إعداد السيرفر مرة واحدة

```bash
git clone https://github.com/DigitalBondMena/mrkatatest.git /path/to/app
cd /path/to/app
cp .env.example .env
# عدّل .env (DB + APP_KEY) على السيرفر فقط
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
```

بعدها: أي push على `main` يحاول يعمل deploy تلقائي لو SSH مفتوح لـ GitHub.
