# План міграції сайту на нову версію PHP

Мета: підготувати alarm.minifinder.com до роботи на PHP 8.3 (зараз прод: 7.4 для сайту, 8.3 default на сервері — див. prod-environment.md).

**Джерело плану:** `~/.cursor/plans/docker_та_апгрейд_php_822bc45b.plan.md` (Docker та апгрейд PHP).

---

## Відповідність оригінальному плану (кроки 1–6)

| Крок | План | Статус |
|------|------|--------|
| 1 | docs/prod-environment.md, збір даних з проду | ✅ Виконано |
| 2 | Dockerfile для PHP 7.4 + extensions (+ XDebug) | ✅ Виконано (docker/php/Dockerfile.74) |
| 3 | php:8.3-fpm + Apache mod_proxy_fcgi, Dockerfile.83, docker/apache/php83.conf | ✅ Виконано |
| 4 | docker-compose: профілі php74 / php83, порти 8080 / 8081 | ✅ Виконано (+ mysql, pma) |
| 5 | XDebug 3 в образах + docs/debug.md | ✅ Виконано |
| 6 | Далі: Composer platform, PHPStan/Psalm, тести, CI, staging, прод | ⏳ Залишилось |

---

## Виконано

- [x] **Docker-середовище**
  - PHP 7.4 (Apache) — профіль `php74`, порт 8080
  - PHP 8.3 (Apache + FPM) — профіль `php83`, порт 8081
  - MySQL 8.0 (порт 3307), створення БД/користувача з `.env`
  - phpMyAdmin на порту 8082
- [x] **Розширення PHP під prod** (gd, imap, intl, redis, memcached, xdebug, soap, xsl, zip тощо) — Dockerfile.74 і Dockerfile.83
- [x] **Підключення до БД у Docker**
  - Кореневий `config.php`: getenv для DB_*
  - `avarn_no/config.php`: getenv для DB_*
  - PHP-FPM: `clear_env = no` (щоб контейнер передавав DB_* в PHP)
- [x] **.env / .env.example** — DB_*, MYSQL_ROOT_PASSWORD, APP_ENV, XDEBUG_MODE
- [x] **docs/debug.md** — XDebug (порт 9003, trigger, path mapping)

---

## Залишилось / опційно

### Крок 6 плану (подальші дії)

- **Composer:** при старті контейнера використовується відповідний lock-файл (`composer.lock.74` / `composer.lock.83`) і виконується `composer install` (скрипт [docker/php/entrypoint-composer.sh](docker/php/entrypoint-composer.sh)). Щоб оновити залежності для **обох** платформ одразу: `./scripts/composer-both.sh require vendor/package` або `./scripts/composer-both.sh update` — скрипт виконує composer у 7.4, зберігає `composer.lock.74`, потім `composer update` у 8.3 і зберігає `composer.lock.83`.
- **Статичний аналіз:** PHPStan або Psalm (рівень 0/1) під 7.4, потім під 8.3 — виправити deprecated та несумісний код.
  - **6.2 Виконано (тільки список):** PHPStan level 1 під PHP 8.3 — результат у [docs/phpstan-report.md](phpstan-report.md) (29 знахідок, без виправлень коду).
- **Тести:** якщо з’являться — запуск у PHP-контейнері (наприклад `docker compose run --profile php83 app-83-php php vendor/bin/phpunit`).
- **CI:** pipeline (GitHub Actions / GitLab CI) — збірка образу 8.3, залежності, PHPStan/Psalm, тести.
- **Підготовка проду:** чекліст оновлення, бекап БД, план відкату; спочатку staging з PHP 8.3.

### Обов’язково перед переключенням проду на 8.3

1. **Перевірка коду на PHP 8.x**
   - Запускати основний сценарій під PHP 8.3 у Docker (php83), перевірити головні entry points: `report.php`, `user_devices/`, провайдери (avarn_no, harmonicare, mqtt тощо).
   - Увімкнути відображення помилок/логів, перевірити deprecation notices (PHP 8.1/8.2/8.3).
   - При потребі виправити: неправильні типи, застарілі функції, `null`-аргументи тощо.

2. **Конфіги провайдерів для Docker**
   - У `avarn_no` вже використовується getenv для DB_*.
   - Якщо інші провайдери (avarn, harmonicare, cubsec, alarm24, mqtt, addsecure, securityassistance) будуть викликатися під Docker або окремим середовищем — у їхніх `config.php` теж варто використовувати `getenv('DB_HOST') ?: 'localhost'` (і інші DB_*), щоб не хардкодити `localhost`.

### Опційно

3. **Розширення з проду, яких нема в Docker**
   - geoip, imagick, oauth — додати в Dockerfile.83 лише якщо вони використовуються в коді.

4. **Схема/дамп БД**
   - У репо немає дампу або міграцій; для повноцінного тесту під 8.3 потрібен імпорт дампу з проду або створення таблиць за актуальною схемою.

5. **Документація**
   - Короткий README або розділ у цьому файлі: як підняти Docker (`docker compose --profile php83 up -d`), порти, .env, перемикання php74/php83.

---

## Швидкий старт (Docker)

```bash
cp .env.example .env   # при потребі відредагуй DB_*, MYSQL_ROOT_PASSWORD
docker compose --profile php83 up -d
# Додаток: http://localhost:8081
# phpMyAdmin: http://localhost:8082
# Логи: docker compose logs -f app-83-apache
```

Перемикання на PHP 7.4: `docker compose --profile php74 up -d` → http://localhost:8080
