## Repo for site https://back2.iro.kosipov.ru ### Deploy (Dokploy) Проект собирается в Docker-образ на базе `serversideup/php:8.4-fpm-nginx` (nginx + php-fpm, порт `8080`). Файлы: - `Dockerfile` — сборка ассетов Vite, установка composer-зависимостей, итоговый образ - `docker-compose.yml` — сервис `app` с томом для `storage` - `docker/entrypoint.d/10-prepare-storage.sh` — создаёт структуру `storage` и файл SQLite при пустом томе При каждом старте контейнера автоматически выполняются `migrate --force`, `storage:link` и `optimize` (`AUTORUN_ENABLED=true`). #### Вариант 1: Application (Dockerfile) 1. Create Service → Application, источник — этот репозиторий, ветка `main` 2. Build Type: `Dockerfile` 3. Environment: переменные из списка ниже 4. Advanced → Volumes: Volume Mount, имя `iro2-storage`, путь в контейнере `/var/www/html/storage` 5. Domains: `back2.iro.kosipov.ru`, Container Port `8080`, HTTPS + Let's Encrypt #### Вариант 2: Docker Compose 1. Create Service → Compose, источник — этот репозиторий, путь `docker-compose.yml` 2. Environment: переменные из списка ниже (Dokploy запишет их в `.env`) 3. Domains: сервис `app`, порт `8080` #### Переменные окружения Обязательные: ``` APP_KEY=base64:... # php artisan key:generate --show APP_URL=https://back2.iro.kosipov.ru ADMIN_USER=... ADMIN_PASS=... ``` Уже заданы в образе (можно переопределить): `APP_ENV=production`, `APP_DEBUG=false`, `LOG_CHANNEL=stderr`, `DB_CONNECTION=sqlite`, `DB_DATABASE=/var/www/html/storage/database/database.sqlite`. Загрузка файлов: ``` FILE_LINKS_ENABLED=true FILE_LINKS_UPLOAD_USER_1=... FILE_LINKS_UPLOAD_PASSWORD_1=... FILE_LINKS_UPLOAD_USER_2=... FILE_LINKS_UPLOAD_PASSWORD_2=... ``` База SQLite и загруженные файлы хранятся в томе `storage` — не удаляйте его при пересоздании сервиса. Для переноса существующих данных скопируйте старый `database/database.sqlite` в `storage/database/database.sqlite` внутри тома. ### File Upload Basic Auth Upload endpoints and upload page are protected by HTTP Basic Auth with 2 users from `.env`: - `FILE_LINKS_UPLOAD_USER_1` - `FILE_LINKS_UPLOAD_PASSWORD_1` - `FILE_LINKS_UPLOAD_USER_2` - `FILE_LINKS_UPLOAD_PASSWORD_2` Protected routes: - `GET /files` - `POST /files` - `POST /api/files/upload` Download routes stay accessible by signed link: - `GET /files/download/{path}` (signed URL) - `GET /api/files/download/{path}` (signed URL)