173 lines
3.9 KiB
Markdown
173 lines
3.9 KiB
Markdown
# AirService
|
||
|
||
Система управления заявками на техническое обслуживание (Service Desk).
|
||
|
||
**Стек:** Laravel 10, Livewire, Tailwind CSS, SQLite, Vite
|
||
|
||
---
|
||
|
||
## Локальная разработка
|
||
|
||
**Требования:** PHP >= 8.2, Composer, Node.js >= 18
|
||
|
||
```bash
|
||
git clone <repo-url>
|
||
cd AirService
|
||
|
||
composer install
|
||
npm install
|
||
|
||
cp .env.example .env
|
||
# Поменять APP_ENV=local, APP_DEBUG=true, APP_URL=http://localhost:8000
|
||
php artisan key:generate
|
||
|
||
touch database/sqlite/database.sqlite
|
||
php artisan migrate --seed
|
||
```
|
||
|
||
Запустить в двух терминалах:
|
||
|
||
```bash
|
||
# Терминал 1
|
||
php artisan serve
|
||
|
||
# Терминал 2
|
||
npm run dev
|
||
```
|
||
|
||
Приложение: http://127.0.0.1:8000
|
||
|
||
**Тестовые аккаунты** (пароль у всех: `password`):
|
||
|
||
| Email | Роль |
|
||
|---|---|
|
||
| admin@service.local | Администратор |
|
||
| manager@service.local | Менеджер |
|
||
| tech1@service.local | Техник |
|
||
| client1@service.local | Клиент |
|
||
|
||
---
|
||
|
||
## Деплой на сервер (Docker)
|
||
|
||
**Требования:** Docker, Docker Compose на сервере `10.20.0.20`.
|
||
|
||
### 1. Скопировать проект на сервер
|
||
|
||
```bash
|
||
ssh -i /root/.ssh/docker_vm_ed25519 crimson@10.20.0.20
|
||
sudo mkdir -p /opt/docker-apps/airservice
|
||
```
|
||
|
||
С локальной машины:
|
||
|
||
```bash
|
||
rsync -avz --exclude='.git' --exclude='node_modules' --exclude='vendor' \
|
||
./ crimson@10.20.0.20:/opt/docker-apps/airservice/
|
||
```
|
||
|
||
### 2. Создать `.env` на сервере
|
||
|
||
```bash
|
||
cd /opt/docker-apps/airservice
|
||
cp .env.example .env
|
||
nano .env
|
||
```
|
||
|
||
Обязательно заполнить:
|
||
|
||
```env
|
||
APP_KEY= # сгенерировать ниже
|
||
APP_URL=https://your-domain.ru
|
||
```
|
||
|
||
Сгенерировать ключ:
|
||
|
||
```bash
|
||
docker compose run --rm app php artisan key:generate --show
|
||
# Скопировать результат в APP_KEY= в .env
|
||
```
|
||
|
||
### 3. Собрать и запустить
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
### 4. Наполнить базу начальными данными (один раз)
|
||
|
||
```bash
|
||
docker compose exec app php artisan db:seed
|
||
```
|
||
|
||
После этого доступны тестовые аккаунты из таблицы выше.
|
||
|
||
### 5. Проверить
|
||
|
||
```bash
|
||
docker compose ps
|
||
docker compose logs app --tail=50
|
||
curl -I http://10.20.0.20:18201
|
||
```
|
||
|
||
### Пересборка после обновления кода
|
||
|
||
```bash
|
||
rsync -avz --exclude='.git' --exclude='node_modules' --exclude='vendor' \
|
||
./ crimson@10.20.0.20:/opt/docker-apps/airservice/
|
||
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Миграции накатываются автоматически при старте контейнера. База данных (SQLite файл) хранится в Docker volume `airservice_sqlite_data` и не теряется при пересборке.
|
||
|
||
### Если нужно сбросить базу и накатить заново
|
||
|
||
```bash
|
||
docker compose down
|
||
docker volume rm airservice_sqlite_data
|
||
docker compose up -d --build
|
||
docker compose exec app php artisan db:seed
|
||
```
|
||
|
||
---
|
||
|
||
### Открыть домен через Caddy (edge-proxy)
|
||
|
||
```bash
|
||
ssh -i /root/.ssh/edge_vm_ed25519 crimson@192.168.0.80
|
||
sudo nano /etc/caddy/Caddyfile
|
||
```
|
||
|
||
Добавить блок:
|
||
|
||
```caddyfile
|
||
http://www.your-domain.ru, https://www.your-domain.ru {
|
||
redir https://your-domain.ru{uri} 308
|
||
}
|
||
|
||
your-domain.ru {
|
||
encode zstd gzip
|
||
|
||
reverse_proxy 10.20.0.20:18201 {
|
||
header_up Host {host}
|
||
header_up X-Real-IP {remote_host}
|
||
}
|
||
}
|
||
```
|
||
|
||
```bash
|
||
sudo caddy validate --config /etc/caddy/Caddyfile
|
||
sudo systemctl reload caddy
|
||
```
|
||
|
||
---
|
||
|
||
## Структура Docker-сервисов
|
||
|
||
| Сервис | Описание |
|
||
|---|---|
|
||
| `airservice_app` | PHP-FPM (Laravel) |
|
||
| `airservice_nginx` | nginx, порт `18201` |
|
||
| `airservice_queue` | Queue worker |
|