Replace the Gitea Actions SSH deploy with a Docker image (serversideup/php fpm-nginx) and docker-compose setup. Store the SQLite database inside the persistent storage volume, trust the reverse proxy, and move admin credentials into config so they work with cached configuration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
76 lines
2.9 KiB
Markdown
76 lines
2.9 KiB
Markdown
## 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)
|