263 lines
6.8 KiB
Markdown
263 lines
6.8 KiB
Markdown
# 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/
|
||
```
|