- PHP 69.7%
- Blade 24.6%
- CSS 3.8%
- JavaScript 1.8%
| app | ||
| docs | ||
| nginx | ||
| .gitignore | ||
| AI_CONTEXT.md | ||
| docker-compose.yml | ||
| PROJECT_MAP.md | ||
| README.md | ||
Maistar Remontas
Работающий сайт заявок на ремонт электроники и внутренняя CRM для Maistar.
Адреса
- Публичный сайт:
https://remontas.maistar.lt - Админ-панель:
https://remontas.maistar.lt/admin - Git:
https://git.maistar.lt/administrator/remontas-site
Основные возможности
Публичная часть
- регистрация заявки на ремонт;
- загрузка фотографий и файлов;
- проверка и нормализация литовских телефонных номеров;
- отслеживание ремонта по случайному коду;
- публичный статус и комментарий клиенту;
- email-шаблоны и журнал отправки;
- редактируемые цены;
- редактируемый список техники, которая не ремонтируется;
- примеры выполненных ремонтов.
Админ-панель
- рабочая главная страница со статусами очереди, срочными и давно не обновлявшимися ремонтами, финансовой сводкой и графиками;
- ремонты и история изменения статусов;
- клиенты и история их ремонтов;
- места приёма устройств;
- журнал email;
- настройки сайта;
- внутренние заметки ремонта;
- фотографии и файлы в заметках;
- просмотр, скачивание и удаление файлов;
- двухфакторная аутентификация;
- приоритеты и многокритериальная сортировка;
- сохранение фильтров, колонок и размера страницы;
- фильтр по источнику регистрации ремонта;
- быстрый ввод окончательной цены и оплаты при завершении ремонта;
- отдельный учёт платежей, возвратов и расходов с финансовым отчётом;
- счета, связанные с ремонтом и фактическими платежами;
- последовательная нумерация, статусы оплаты и генерация PDF;
- архивирование ремонтов и безопасное полное удаление связанных финансов и файлов;
- верхний центр уведомлений о новых заявках с сайта;
- управление выполненными работами;
- единые настройки публичного сайта.
- собственная статистика посещаемости без аналитических cookies: уникальные посетители и просмотры по дням, популярные страницы и график за 30/90/365 дней.
Шаблоны писем, журнал отправки и события уже реализованы. SMTP-отправка
выполняется асинхронно контейнером remontas-queue, поэтому регистрация
заявки и изменение статуса не ждут ответа внешнего почтового сервиса.
Неудачная отправка повторяется до трёх раз и фиксируется в журнале.
Реквизиты SMTP и адрес для ответов хранятся только в app/.env.
Резервные копии
- PostgreSQL-копии
.sql.gz; - ZIP с загруженными файлами;
- ручной и автоматический запуск;
- выбор SQL, ZIP или обоих типов;
- Laravel Scheduler;
- локальное хранение заданного количества копий;
- отправка на SMB, NAS или Windows Server;
- зашифрованный SMB-пароль;
- тест чтения, записи и удаления;
- история запусков;
- проверка GZIP, ZIP, manifest и SHA-256;
- сравнение локальной и SMB-копии.
Стек
- PHP 8.4
- Laravel 13
- Filament 4
- Livewire
- Blade
- PostgreSQL 16
- Nginx
- Docker Compose
- Caddy reverse proxy
- Cloudflare DNS
- Samba
smbclient
Инфраструктура
Основная папка:
/opt/containers/remontas-site
Контейнеры:
remontas-app
remontas-scheduler
remontas-queue
remontas-web
remontas-postgres
Часовой пояс:
Europe/Vilnius
Основные команды
cd /opt/containers/remontas-site
docker compose ps
docker compose up -d --build
docker exec remontas-app php artisan migrate --force
docker exec remontas-app php artisan optimize:clear
docker exec remontas-app php artisan schedule:list
docker exec remontas-app php artisan queue:restart
docker logs --tail 100 remontas-scheduler
docker logs --tail 100 remontas-queue
Обычное обновление приложения не требует перезапуска app: каталог
приложения подключён к контейнеру напрямую, а PHP проверяет изменения
файлов. Безопасная последовательность без кратковременного 502:
cd /opt/containers/remontas-site
umask 022
git pull --ff-only origin main
git ls-files -z -- app | xargs -0 -r chmod a+r
docker exec remontas-app php artisan migrate --force
docker exec remontas-app php artisan optimize:clear
docker exec remontas-app php artisan queue:restart
docker compose restart scheduler
PHP-FPM работает от пользователя контейнера, поэтому исходные файлы должны
быть доступны ему для чтения. umask 022 задаёт обычные права новым файлам
и каталогам при git pull; следующая команда восстанавливает чтение только
для файлов приложения, отслеживаемых Git. Она не затрагивает игнорируемые
.env, загруженные файлы, резервные копии и данные PostgreSQL. Git не
сохраняет полный набор Unix-прав, поэтому режим 100644 в репозитории сам
по себе не гарантирует чтение файла пользователем PHP-FPM на сервере.
Если менялись Dockerfile, PHP-расширения или состав образа, после пересборки
нужно дождаться app и затем перезапустить web:
docker compose up -d --build app queue scheduler
until docker exec remontas-app php -r '$s = @fsockopen("127.0.0.1", 9000); exit($s ? 0 : 1);'; do sleep 2; done
docker compose up -d web
docker compose restart web
Принудительный запуск настроенного backup:
docker exec remontas-app php artisan backups:run-auto --force
Применить лимиты хранения к локальным и SMB-копиям и синхронизировать историю запусков с реально существующими файлами:
docker exec remontas-app php artisan backups:cleanup
Хранилище
Закрытые файлы находятся в:
app/storage/app/private/
Основные каталоги:
repair-files/
repair-note-files/
recurring-service-images/
recurring-service-files/
invoices/
backups/database/
backups/files/
Пароли, .env, PostgreSQL data и реальные backup-файлы не должны добавляться в Git.
Документация проекта
AI_CONTEXT.md— контекст и правила для AI-чата;PROJECT_MAP.md— карта основных каталогов и классов;docs/PERFORMANCE_BASELINES.md— эталонные замеры скорости;app/README.md— краткая памятка по Laravel-приложению.
Санитизированные HAR-файлы хранятся в отдельной ветке
performance-baselines и не входят в production-ветку main.