# Astro + PocketBase Monorepo — Minivan Berlin

Монорепозиторий для веб-сайта **Minivan Berlin** — сервиса аренды автомобилей в Берлине. Проект сочетает современный SSR-фронтенд на Astro с backend-ом на PocketBase в качестве headless CMS и системы аутентификации.

## 🚀 Технологический стек

### Frontend
- **Astro 6** — SSR-фреймворк с поддержкой островной архитектуры
- **SolidJS** — реактивные компоненты для интерактивных элементов
- **Tailwind CSS 4** — утилитарные стили
- **TypeScript** — типизация всего проекта
- **PocketBase JS SDK** — клиент для взаимодействия с backend
- **astro-icon** — иконки в проекте
- **@astrojs/sitemap** — генерация sitemap для SEO
- **@astrojs/mdx** — поддержка MDX для контента

### Backend
- **PocketBase** — легковесный backend с SQLite, аутентификацией и админ-панелью
- **Миграции** — управление схемой данных через JS-миграции

### Инфраструктура
- **Bun** — пакетный менеджер и рантайм
- **Maildev** — локальный SMTP-сервер для тестирования email
- **Concurrently** — параллельный запуск нескольких серверов
- **Docker** — контейнеризация (Dockerfile в frontend и backend)

## 📁 Структура проекта

```
astro_minivan/
├── frontend/                 # Astro-приложение
│   ├── src/
│   │   ├── components/      # SolidJS и Astro компоненты
│   │   │   ├── auth/        # Компоненты аутентификации
│   │   │   ├── booking/     # Компоненты бронирования
│   │   │   ├── home/        # Компоненты главной страницы
│   │   │   ├── blog/        # Компоненты блога
│   │   │   └── ...          # Другие секции сайта
│   │   ├── pages/           # Страницы Astro
│   │   │   ├── api/         # API endpoints
│   │   │   ├── auth/        # Страницы аутентификации
│   │   │   └── *.astro      # Основные страницы сайта
│   │   ├── lib/             # Утилиты и сервисы
│   │   │   ├── authService.ts    # Сервис аутентификации
│   │   │   ├── emailService.ts   # Отправка email через Nodemailer
│   │   │   ├── pocketbase.js     # Клиент PocketBase
│   │   │   └── ...
│   │   ├── layouts/         # Layouts Astro
│   │   ├── styles/          # Глобальные стили
│   │   ├── types/           # TypeScript типы
│   │   ├── constants/       # Константы приложения
│   │   ├── emails/          # Шаблоны email-писем
│   │   └── middleware.js    # Middleware для аутентификации
│   ├── astro.config.mjs     # Конфигурация Astro
│   ├── tsconfig.json        # TypeScript конфигурация
│   └── Dockerfile
│
├── backend/                  # PocketBase backend
│   ├── pb_migrations/       # Миграции базы данных
│   ├── pb_data/             # Данные PocketBase (игнорируется в git)
│   ├── pocketbase.exe       # Бинарник PocketBase
│   └── start.sh / start.bat # Скрипты запуска
│
├── bunfig.toml              # Конфигурация Bun (workspaces)
├── package.json             # Корневой package.json
└── .gitignore
```

## ⚙️ Установка

### Требования
- **Bun** (рекомендуемая версия указывается в `.nvmrc`)
- **Node.js** (совместимая версия)

### Установка зависимостей

```bash
bun install
```

## 🛠️ Разработка

### Запуск всех сервисов одновременно

```bash
# Фронтенд + бэкенд
bun run dev

# Фронтенд + бэкенд + почтовый сервер (для тестирования email)
bun run dev:all
```

### Запуск отдельных сервисов

```bash
# Только фронтенд (Astro на порту 4321)
bun run frontend:dev

# Только бэкенд (PocketBase на порту 8090)
bun run backend:dev

# Только почтовый сервер (Maildev)
bun run maildev
```

### Доступные адреса

| Сервис | URL | Описание |
|--------|-----|----------|
| Frontend | http://localhost:4321 | Astro приложение (SSR) |
| Backend | http://localhost:8090 | PocketBase API и админ-панель |
| Maildev | http://localhost:1080 | Веб-интерфейс почтового сервера |
| Maildev SMTP | localhost:1025 | SMTP сервер для отправки писем |

## 📦 Сборка и продакшен

### Сборка проекта

```bash
# Сборка фронтенда
bun run build

# Или напрямую
cd frontend && bun run build
```

### Запуск продакшен-версии

```bash
bun run start
```

## 🔐 Аутентификация

Проект использует встроенную систему аутентификации PocketBase:

- **OAuth2 провайдеры** — поддержка входа через Google, Apple и другие
- **Email/пароль** — классическая аутентификация
- **JWT токены** — хранятся в cookies
- **Middleware** — автоматическая проверка сессии на каждом запросе

Файлы аутентификации:
- `frontend/src/lib/authService.ts` — сервис управления сессиями
- `frontend/src/middleware.js` — middleware для проверки авторизации
- `frontend/src/components/auth/` — UI компоненты входа/регистрации

## 📧 Email-рассылка

Для отправки уведомлений используется **Nodemailer**:

- Подтверждение бронирования
- Уведомления администратору
- Верификация email

### Локальное тестирование почты

```bash
bun run maildev
```

Веб-интерфейс: http://localhost:1080

### API endpoints для отправки писем

- `POST /api/send-email` — произвольное письмо
- `POST /api/send-booking-confirmation` — подтверждение бронирования
- `POST /api/send-admin-notification` — уведомление администратора

## 🗄️ База данных и миграции

PocketBase использует SQLite. Миграции хранятся в `backend/pb_migrations/`.

### Применение миграций

```bash
bun run backend:migrate
```

### Основные коллекции

- `users` — пользователи
- `posts` — статьи блога
- `faq_items` — FAQ
- `slider_cars` — слайдер автомобилей
- `premium_fleet` — премиум автопарк
- `vip_services` — VIP услуги
- `reviews` — отзывы
- `pages` — статические страницы
- `site_settings` — настройки сайта

## 🔧 Переменные окружения

### Frontend (.env)

```env
# PocketBase
POCKETBASE_URL=http://localhost:8090

# Почта (SMTP)
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_FROM=no-reply@minv-berlin.de
ADMIN_EMAIL=admin@minivan-berlin.de
```

> ⚠️ **Важно:** В продакшене замените `localhost` на реальные адреса и используйте безопасные SMTP-настройки.

## 🌐 Сайт

Основной домен: **https://minivan-berlin.de**

### Страницы сайта

- Главная (`/`)
- О нас (`/ueber-uns`)
- Цены (`/preise`)
- Премиум флот (`/premium-flotte`)
- VIP услуги (`/vip-services`)
- Блог (`/blog`)
- Отзывы (`/bewertungen`)
- Партнёры (`/partner`)
- Карьера (`/karriere`)
- Контакты (`/kontakt`)
- Помощь (`/hilfe`)
- AGB, Datenschutz, Impressum

## 📝 Скрипты npm

| Команда | Описание |
|---------|----------|
| `bun run dev` | Запуск фронтенда и бэкенда |
| `bun run dev:all` | Запуск всех сервисов (включая maildev) |
| `bun run frontend:dev` | Только фронтенд |
| `bun run frontend:build` | Сборка фронтенда |
| `bun run frontend:start` | Preview собранного фронтенда |
| `bun run backend:dev` | Только бэкенд (PocketBase) |
| `bun run backend:migrate` | Применение миграций БД |
| `bun run maildev` | Запуск почтового сервера |
| `bun run build` | Сборка проекта |
| `bun run start` | Запуск продакшен-версии |

## 🐳 Docker

Проект включает Dockerfile для контейнеризации:

- `frontend/Dockerfile` — образ для Astro приложения
- `backend/Dockerfile` — образ для PocketBase

## 📚 Документация

- [Astro](https://docs.astro.build/en/getting-started/)
- [SolidJS](https://docs.solidjs.com/solid-start/getting-started)
- [PocketBase](https://pocketbase.io/docs/)
- [Tailwind CSS](https://tailwindcss.com/docs)
- [astro-icon](https://www.astroicon.dev/getting-started/)

## 📄 Лицензия

ISC
