# Docker Setup для Django + PostGIS + TileServer GL

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

```
.
├── dbapp/                      # Django приложение
│   ├── Dockerfile             # Универсальный Dockerfile
│   ├── entrypoint.sh          # Скрипт запуска
│   └── ...
├── nginx/                      # Конфигурация Nginx (только для prod)
│   └── conf.d/
│       └── default.conf
├── tiles/                      # Тайлы для TileServer GL
├── docker-compose.yaml         # Development окружение
├── docker-compose.prod.yaml    # Production окружение
├── .env.dev                    # Переменные для development
└── .env.prod                   # Переменные для production
```

## Быстрый старт

### Development

1. Скопируйте файл окружения:
```bash
cp .env.dev .env
```

2. Запустите контейнеры:
```bash
docker-compose up -d --build
```

3. Создайте суперпользователя:
```bash
docker-compose exec web python manage.py createsuperuser
```

4. Приложение доступно:
   - Django: http://localhost:8000
   - TileServer GL: http://localhost:8080
   - PostgreSQL: localhost:5432

### Production

1. Скопируйте и настройте файл окружения:
```bash
cp .env.prod .env
# Отредактируйте .env и измените SECRET_KEY, пароли и ALLOWED_HOSTS
```

2. Запустите контейнеры:
```bash
docker-compose -f docker-compose.prod.yaml up -d --build
```

3. Создайте суперпользователя:
```bash
docker-compose -f docker-compose.prod.yaml exec web python manage.py createsuperuser
```

4. Приложение доступно:
   - Nginx: http://localhost (порт 80)
   - Django (напрямую): http://localhost:8000
   - TileServer GL: http://localhost:8080
   - PostgreSQL: localhost:5432

## Основные команды

### Development

```bash
# Запуск
docker-compose up -d

# Остановка
docker-compose down

# Просмотр логов
docker-compose logs -f web

# Выполнение команд Django
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
docker-compose exec web python manage.py shell

# Пересборка после изменений в Dockerfile
docker-compose up -d --build

# Полная очистка (включая volumes)
docker-compose down -v
```

### Production

```bash
# Запуск
docker-compose -f docker-compose.prod.yaml up -d

# Остановка
docker-compose -f docker-compose.prod.yaml down

# Просмотр логов
docker-compose -f docker-compose.prod.yaml logs -f web

# Выполнение команд Django
docker-compose -f docker-compose.prod.yaml exec web python manage.py migrate
docker-compose -f docker-compose.prod.yaml exec web python manage.py createsuperuser

# Пересборка
docker-compose -f docker-compose.prod.yaml up -d --build
```

## Различия между Dev и Prod

### Development
- Django development server (runserver)
- DEBUG=True
- Код монтируется как volume (изменения применяются сразу)
- Без Nginx
- Простые пароли (для локальной разработки)

### Production
- Gunicorn WSGI server
- DEBUG=False
- Код копируется в образ (не монтируется)
- Nginx как reverse proxy
- Сильные пароли и SECRET_KEY
- Сбор статики (collectstatic)
- Оптимизированные настройки безопасности

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

### Основные переменные (.env)

```bash
# Django
DEBUG=True/False
ENVIRONMENT=development/production
DJANGO_SETTINGS_MODULE=dbapp.settings.development/production
SECRET_KEY=your-secret-key

# Database
DB_NAME=geodb
DB_USER=geralt
DB_PASSWORD=your-password
DB_HOST=db
DB_PORT=5432

# Allowed Hosts
ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com

# Gunicorn (только для production)
GUNICORN_WORKERS=3
GUNICORN_TIMEOUT=120
```

## Volumes

### Development
- `postgres_data_dev` - данные PostgreSQL
- `static_volume_dev` - статические файлы
- `media_volume_dev` - медиа файлы
- `logs_volume_dev` - логи
- `./dbapp:/app` - код приложения (live reload)

### Production
- `postgres_data_prod` - данные PostgreSQL
- `static_volume_prod` - статические файлы
- `media_volume_prod` - медиа файлы
- `logs_volume_prod` - логи

## TileServer GL

Для работы TileServer GL поместите ваши тайлы в директорию `./tiles/`.

Пример структуры:
```
tiles/
├── config.json
└── your-tiles.mbtiles
```

## Backup и восстановление БД

### Backup
```bash
# Development
docker-compose exec db pg_dump -U geralt geodb > backup.sql

# Production
docker-compose -f docker-compose.prod.yaml exec db pg_dump -U geralt geodb > backup.sql
```

### Восстановление
```bash
# Development
docker-compose exec -T db psql -U geralt geodb < backup.sql

# Production
docker-compose -f docker-compose.prod.yaml exec -T db psql -U geralt geodb < backup.sql
```

## Troubleshooting

### Проблемы с миграциями
```bash
docker-compose exec web python manage.py migrate --fake-initial
```

### Проблемы с правами доступа
```bash
docker-compose exec -u root web chown -R app:app /app
```

### Очистка всех данных
```bash
docker-compose down -v
docker system prune -a
```

### Проверка логов
```bash
# Все сервисы
docker-compose logs -f

# Конкретный сервис
docker-compose logs -f web
docker-compose logs -f db
```

## Безопасность для Production

1. **Измените SECRET_KEY** - используйте длинный случайный ключ
2. **Измените пароли БД** - используйте сильные пароли
3. **Настройте ALLOWED_HOSTS** - укажите ваш домен
4. **Настройте SSL** - добавьте сертификаты в `nginx/ssl/`
5. **Ограничьте доступ к портам** - не открывайте порты БД наружу

## Генерация SECRET_KEY

```python
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
```

## Мониторинг

### Проверка статуса контейнеров
```bash
docker-compose ps
```

### Использование ресурсов
```bash
docker stats
```

### Healthcheck
```bash
curl http://localhost:8000/admin/
```
