# korzilla.ru на Laravel + Filament

Сайт korzilla.ru, перенесённый с Tilda на собственную платформу:

- **Дизайн, тексты, SEO и адреса — как на Tilda.** HTML страниц совпадает с оригиналом байт в байт (без учёта ссылок на CDN, которые теперь ведут на свой сервер), кроме намеренных правок: SEO-исправлений из `php artisan site:fix-seo` (19 страниц, внешне не изменились) и обязательных галочек согласий, которые `php artisan site:form-consents` добавляет в формы «Узнайте стоимость и сроки разработки» (на Tilda их там не было).
- **Всё хранится у нас:** 1254 изображения, шрифты, библиотеки Tilda и 420 наборов стилей блоков лежат в `public/`. Сайт не обращается к CDN Tilda.
- **Админка на Filament:** страницы, блоки, SEO, общие блоки, шапка и подвал, редиректы, заявки, код сайта, CSS.

Стек: PHP 8.3+, Laravel 13, Filament 5, MySQL 8 (или MariaDB 10.6+), Node не нужен.

---

## Быстрый старт (локально, Laragon)

```bash
composer install
cp .env.example .env         # затем заполнить DB_*, ADMIN_EMAIL, ADMIN_PASSWORD
php artisan key:generate
php artisan migrate
php artisan tilda:import     # страницы и блоки из зеркала (файлы уже в public/, CDN Tilda не нужен)
php artisan site:fix-seo     # исправления SEO-ошибок, найденных при аудите (docs/audit.md)
php artisan site:form-consents  # галочки согласий во всех формах заявок
php artisan db:seed          # первый администратор из ADMIN_EMAIL / ADMIN_PASSWORD
php artisan serve            # http://127.0.0.1:8000, админка — /admin
```

Всё нужное для импорта уже в репозитории: зеркало сайта `storage/app/tilda-mirror` (210 HTML-страниц, `sitemap.xml`, `robots.txt`, `custom.css`), картинки `public/uploads/tild…` и библиотеки Tilda `public/tilda`. Сайт разворачивается без обращения к Tilda. Если нужен свежий снимок, см. раздел «Повторный перенос».

В Laragon можно вместо `artisan serve` нажать Menu → Reload: появится хост `korzilla-site.test` с корнем в `public/`. Так быстрее: встроенный сервер `artisan serve` на Windows без OPcache тратит около секунды на любой запрос.

## Как устроено

```
Tilda-страница  →  Page (pages)            адрес, SEO, шапка/подвал, подключения CSS/JS Tilda
Tilda-блок rec… →  Block (blocks)          исходный HTML блока — единственный источник правды
T121 «ссылка»   →  Block.ref_block_id      общий блок: контент берётся из исходного блока
Шапка/подвал    →  Page kind=header/footer как в Tilda: отдельные страницы, на которые ссылаются остальные
```

**Почему HTML, а не конструктор.** На сайте 87 разных типов блоков Tilda. Если переписывать их шаблонами, дизайн неизбежно поплывёт. Вместо этого админка находит в HTML блока редактируемые места: тексты (`field="…"`), картинки (`data-original`, `<img>`), ссылки, кнопки, подписи форм. Правка меняет **только** эти фрагменты (`app/Support/Html/HtmlPatch.php`), остальной код блока остаётся байт в байт.

Ключевые места кода:

| Что | Где |
|---|---|
| Парсер HTML с точными смещениями | `app/Support/Html/HtmlDocument.php`, `HtmlPatch.php` |
| Поля блока: извлечение и применение правок | `app/Support/Tilda/BlockContentEditor.php` |
| Сборка страницы в формате Tilda | `app/Support/Site/PageRenderer.php` |
| Маршрутизация, редиректы, 404 | `app/Http/Controllers/PageController.php` |
| Приём заявок с форм Tilda | `app/Http/Controllers/TildaFormController.php`, `app/Support/Forms/LeadDelivery.php` |
| Миниатюры вместо thb.tildacdn.com | `app/Http/Controllers/ThumbnailController.php` |
| sitemap.xml, robots.txt, rss.xml | `app/Http/Controllers/SeoController.php` |
| Импорт из Tilda | `app/Support/Tilda/SiteImporter.php`, `AssetDownloader.php`, `TildaUrl.php`, `TildaPatches.php` |
| Админка | `app/Filament/**` |

### Файлы

| Путь | Что там |
|---|---|
| `public/uploads/tild…/…` | картинки и файлы из Tilda (382 МБ) |
| `public/uploads/images/ГГГГ-ММ/…` | картинки, загруженные в админке |
| `public/tilda/…` | библиотеки Tilda (JS/CSS/шрифты/иконки) и наборы стилей блоков `ws/project2266888/tilda-blocks-page*.min.css/js` |
| `public/thb/…` | миниатюры (создаются автоматически при первом запросе, папку можно чистить) |
| `public/custom.css` | общий CSS проекта (редактируется в админке, копии — в `storage/app/backups/custom-css`) |

### Формы и заявки

- Формы Tilda отправляют данные на `/tilda-forms/procces` (адрес подставлен в локальную копию `tilda-forms-1.0.min.js`). Ответ совместим с сервисом Tilda, поэтому сообщения об успехе и колбэки блоков работают без изменений.
- Заявки сохраняются в «Заявки» и уходят по каналам из «Настройки → Настройки сайта → Заявки»: e-mail, Telegram, Битрикс24 (`crm.lead.add`).
  Письма отправляются через SMTP почтового ящика со вкладки «Почта (SMTP)» (пароль хранится зашифрованным `APP_KEY`; пока сервер не указан — `MAIL_*` из `.env`).
  Telegram — через зеркало Bot API (`TELEGRAM_API_URL` в `.env`, поле «Telegram: адрес Bot API» в админке важнее): с российских серверов `api.telegram.org` не открывается. Токен бота и ключ вебхука вырезаются из текстов ошибок.
- **Важно:** скрипт `start.korzilla.ru/authsite/auth.js` (подключён в общем коде сайта) подменяет часть попап-форм CRM-формами Битрикс24. Такие заявки, как и раньше, идут напрямую в Битрикс24 и в админке не появляются.

### Тестовый стенд и продакшен

`SITE_TRACKING` в `.env` управляет счётчиками и CRM-виджетами (Метрика, Битрикс24, auth.js):

- `false` — они вырезаются из HTML. Тестовые визиты не попадают в статистику, тестовые заявки не уходят в боевую CRM.
- `true` (по умолчанию при `APP_ENV=production`) — выводятся как на Tilda.

## Деплой на сервер

Боевой сервер (109.73.193.24, HestiaCP) уже настроен: выкатка — `bash bin/deploy.sh` после коммита, подробности и порядок запуска — в **[DEPLOY.md](DEPLOY.md)**. Ниже — общие требования, если понадобится другой сервер.

1. PHP 8.3+ (расширения: `pdo_mysql`, `mbstring`, `gd`, `intl`, `zip`, `fileinfo`, `curl`), MySQL 8 или MariaDB 10.6+, Nginx или Apache. Корень сайта — `public/`.
2. Выложить код, выполнить `composer install --no-dev --optimize-autoloader`.
3. Картинки из Tilda (`public/uploads/tild…`) и библиотеки (`public/tilda`) приходят вместе с репозиторием. Картинки, загруженные через админку (`public/uploads/images`, `public/uploads/og`), в git не попадают: их, как и базу, нужно бэкапить на сервере.
4. `.env`: `APP_ENV=production`, `APP_DEBUG=false`, `APP_URL=https://korzilla.ru`, доступы к БД, `SITE_TRACKING=true`, `CACHE_STORE=file` (или `redis`: готовый HTML страниц кэшируется, по умолчанию кэш лежит в БД). Включите OPcache в PHP.
5. `php artisan migrate --force && php artisan optimize && php artisan filament:optimize`.
6. Наполнить базу: `php artisan tilda:import --force && php artisan site:fix-seo && php artisan site:form-consents && php artisan db:seed --force`. Второй вариант — перенести дамп базы с тестового стенда (`mysqldump korzilla_site`), если в админке уже что-то правили.
7. После любых правок `.env` или `config/*`: `php artisan optimize:clear && php artisan cache:clear`.

Пример Nginx:

```nginx
server {
    server_name korzilla.ru;
    root /var/www/korzilla/public;
    index index.php;
    client_max_body_size 32m;

    location / { try_files $uri $uri/ /index.php?$query_string; }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    }
    location ~* ^/(uploads|tilda|thb)/ { expires 30d; access_log off; try_files $uri /index.php?$query_string; }
    location = /custom.css { expires 1h; }
}
```

Миниатюры `/thb/…` при первом запросе создаёт Laravel, дальше их отдаёт сам веб-сервер.

## Чек-лист перед переключением домена

- [ ] Заполнить получателей заявок: «Настройки сайта → Заявки» (e-mail / Telegram / вебхук Битрикс24) и нажать «Отправить тестовую заявку». На Tilda каждая форма отправлялась в 4 подключённых сервиса — проверьте в кабинете Tilda, какие именно, и повторите их здесь.
- [ ] Настроить SMTP: «Настройки сайта → Почта (SMTP)», кнопка «Отправить тестовое письмо».
- [ ] `SITE_TRACKING=true`, проверить Метрику 84831700 и виджет Битрикс24.
- [ ] Пройтись по ключевым страницам на тестовом домене: главная, блог, портфолио, цены, попапы, квиз.
- [x] SEO-ошибки, найденные при аудите, исправлены командой `php artisan site:fix-seo` (список — в `docs/audit.md`).
- [x] Во всех формах заявок обязательные галочки согласий с политикой конфиденциальности и на обработку персональных данных (`php artisan site:form-consents`).
- [ ] Переключить DNS / DDoS-Guard на новый сервер, проверить `https://korzilla.ru/sitemap.xml`, `robots.txt`, 301 с `/pageNNN.html`.
- [ ] В Яндекс.Вебмастере и Search Console запросить переобход sitemap.

## Повторный перенос

Если до запуска контент на Tilda ещё меняется:

```bash
python tools/crawl.py --fresh         # свежий снимок сайта → storage/app/tilda-mirror
php artisan tilda:import              # УДАЛИТ страницы/блоки в базе и создаст заново (спросит подтверждение)
php artisan site:fix-seo              # снова применить SEO-исправления (команда идемпотентна)
php artisan site:form-consents        # снова добавить галочки согласий в формы (тоже идемпотентна)
php artisan tilda:patch-assets        # повторно применить патчи к библиотекам Tilda
```

После начала работы в админке повторный импорт не делаем: он перезапишет правки.

## Тесты

```bash
php artisan test
```

Покрыто: парсер HTML и точечные правки, редактор полей и элементов списков, админка (сохранение блоков, общие блоки), маршруты сайта (301, 404, регистр адресов), sitemap/robots, приём заявок и антиспам, отключение счётчиков на тестовом стенде, SEO-исправления, галочки согласий в формах, отправка заявок по SMTP и в Telegram через зеркало.
