# نصب کافه‌کد روی هاست PHP

این نسخه به Node.js، سرویس دائمی یا Composer نیاز ندارد. پیش‌نیازها: PHP 8.1 یا بالاتر، افزونهٔ PDO MySQL، MySQL 5.7+/MariaDB، HTTPS و Apache/LiteSpeed با mod_rewrite. اپ پیام‌ها را هنگام باز بودن هر ۳ ثانیه دریافت می‌کند.

## نصب با پنل هاست

۱. در پنل یک پایگاه داده و یک کاربر **جدید مخصوص کافه‌کد** بساز و دسترسی کاربر را فقط به همان پایگاه داده بده.

۲. در phpMyAdmin همان پایگاه داده را انتخاب و فایل `devcafe-private/schema.mysql.sql` را از گزینهٔ Import وارد کن. این فایل جدول‌ها و چهار گروه عمومی را ایجاد می‌کند.

۳. فایل ZIP را در پوشهٔ home اکانت هاست، یعنی **یک سطح بالاتر از public_html**، استخراج کن. ساختار نهایی باید این باشد:

```text
home/USERNAME/
  devcafe-private/
    bootstrap.php
    config.example.php
    schema.mysql.sql
    .htaccess
  public_html/
    api/
      index.php
      .htaccess
      .user.ini
```

پوشهٔ `devcafe-private` محل کد و تنظیمات داخلی است و باید بیرون از مسیر عمومی وب بماند. اگر ساختار document root هاست متفاوت است، مسیر `$private` در `api/index.php` باید به همین پوشه اشاره کند.

۴. یک کپی از `config.example.php` با نام `config.php` در همان پوشهٔ خصوصی بساز. نام دیتابیس، نام کاربر، رمز دیتابیس و در صورت لزوم آدرس MySQL را در آن وارد کن. مقدار `base_path` برای این چیدمان `/api` است. رمز را داخل چت یا فایل APK قرار نده.

۵. SSL ساب‌دامنهٔ `app.amirmahdi-dev.ir` را از پنل فعال کن. آدرس `https://app.amirmahdi-dev.ir/api/health` باید خروجی `{"status":"ok"}` بدهد.

۶. APK را روی دو گوشی نصب کن. آدرس پیش‌فرض نسخهٔ 0.1.1 برابر `https://app.amirmahdi-dev.ir/api` است. اگر نسخهٔ قبلی آدرس دیگری ذخیره کرده، در قسمت Server URL آن را تغییر بده. برای هر گوشی حساب جداگانه بساز؛ هر دو عضو گروه اندروید می‌شوند. برای چت خصوصی، نام کاربری دقیق حساب دوم را در «چت جدید» بنویس.

برای این ساب‌دامنه، Document Root را در پنل بررسی کن: محتوای `public_html/api` داخل ZIP باید در پوشهٔ `api` زیر ریشهٔ واقعی **app.amirmahdi-dev.ir** قرار بگیرد. ریشهٔ ساب‌دامنه لزوماً خود `public_html` نیست. در این حالت مسیر `$private` در `index.php` را به مسیر مطلق پوشهٔ `devcafe-private` خارج از فضای عمومی تنظیم کن؛ مثلاً `/home/USERNAME/devcafe-private/bootstrap.php` با نام واقعی اکانت هاست.

اگر پنل اجازهٔ استخراج ZIP بالاتر از public_html را نمی‌دهد، پوشه‌ها را جداگانه در File Manager ایجاد و فایل‌ها را در محل درست آپلود کن.

## تنظیمات و رفع اشکال

- `404` روی مسیر health: فایل مخفی `.htaccess` باید آپلود شده باشد و Rewrite فعال باشد.
- خطای `500`: اطلاعات `config.php`، افزونهٔ `pdo_mysql`، نسخهٔ PHP و لاگ خطای هاست را بررسی کن. جزئیات دیتابیس عمداً در پاسخ عمومی نمایش داده نمی‌شوند.
- خطای ورود روی همهٔ درخواست‌ها: هاست باید هدر Authorization را به PHP منتقل کند؛ تنظیم آن در `.htaccess` موجود است.
- ارسال فایل: حداکثر حجم ۵ مگابایت است. `post_max_size` حداقل `8M` و `max_allowed_packet` پایگاه داده حداقل ۸ مگابایت باشد. فایل `.user.ini` تنظیمات PHP را درخواست می‌کند؛ اعمال آن ممکن است چند دقیقه طول بکشد یا به سیاست هاست بستگی داشته باشد.
- اگر WAF هاست درخواست PATCH پروفایل را مسدود می‌کند، باید برای مسیر `/api/me` مجاز شود.
- فایل‌های پیوست در جدول messages ذخیره می‌شوند. نسخهٔ پشتیبان دیتابیس شامل حساب‌ها، گفتگوها و فایل‌هاست. کلیدهای نشست گوشی در Android Keystore نگه‌داری می‌شوند.

## اجرای محلی و تست

از ریشهٔ پروژه در PowerShell:

```powershell
.\scripts\start-php-server.ps1
# دسترسی از گوشی روی همان وای‌فای:
.\scripts\start-php-server.ps1 -Lan
```

اجرای محلی از SQLite مستقل از دیتابیس هاست استفاده می‌کند. آدرس شبیه‌ساز `http://10.0.2.2:8787` و آدرس گوشی `http://IP-COMPUTER:8787` است. HTTP محلی فقط در APK debug مجاز است؛ روی هاست از HTTPS استفاده کن.

تست‌های HTTP مستقل نسخهٔ PHP:

```powershell
# اگر PHP در PATH نیست:
$env:PHP_BINARY = 'path/to/php.exe'
$env:PHP_EXTENSION_DIR = 'path/to/php/ext'
node --test server-php/test/api.test.mjs
```

PHP_EXTENSION_DIR برای نسخهٔ ویندوزی است و افزونه‌های PDO SQLite و PDO MySQL را برای فرآیند تست بارگذاری می‌کند. تست‌ها سرور و دیتابیس موقت اختصاصی می‌سازند و به اطلاعات هاست وصل نمی‌شوند.

## محدودهٔ نسخه

۵ تست یکپارچهٔ این سرور هم روی SQLite و هم روی MySQL 8.0.30 پاس شده‌اند؛ احراز هویت، پروفایل، عضویت، پیام و فایل خصوصی، جلوگیری از تکرار، صفحه‌بندی و محدودیت ورودی بررسی شده‌اند. APK و ۵ تست واحد اندروید نیز با موفقیت ساخته/اجرا شده‌اند؛ تست رابط روی گوشی انجام نشده است.

حساب، پروفایل، چت گروهی و خصوصی، کد و فایل پیاده‌سازی شده‌اند. اعلان در پس‌زمینه، بازیابی رمز، حذف حساب، مدیریت/گزارش تخلف و رمزنگاری سرتاسری هنوز وجود ندارند. برای گروه کوچک مناسب است؛ تاریخچه و فایل‌های زیاد به فضای دیتابیس هاست و بازبینی طراحی نیاز دارند. انتشار عمومی و نصب روی هاست واقعی بدون مشخصات میزبانی انجام نشده است.
