chore: reorganize project structure and prepare for deployment
- Organize files into logical directories (docs/, scripts/, tests/) - Add comprehensive documentation (README, CONTRIBUTING, CHANGELOG) - Create deployment automation scripts - Add Docker production configuration - Update .gitignore and add .dockerignore - Remove temporary and test files from root - Improve settings.py with DEBUG from env variable Added: - README.md with project overview - CONTRIBUTING.md for contributors - CHANGELOG.md for version tracking - PROJECT_STATUS.md with current state - docker-compose.prod.yml for production - nginx.conf for production web server - scripts/deploy.sh for automated deployment - scripts/check-config.sh for configuration validation - scripts/setup-ssl.sh for SSL certificate setup - docs/DEPLOYMENT.md with detailed deployment guide - docs/ENV_VARIABLES.md with all environment variables Moved: - Documentation to docs/ - Scripts to scripts/ - Test files to tests/ Removed: - .history/ directory - Test response JSON files from root - settings_production.py (merged into settings.py) This commit prepares the project for: - Production deployment - Team collaboration - Docker containerization - Proper documentation
This commit is contained in:
76
.dockerignore
Normal file
76
.dockerignore
Normal file
@@ -0,0 +1,76 @@
|
||||
# Git
|
||||
.git
|
||||
.gitignore
|
||||
.history
|
||||
|
||||
# Python
|
||||
__pycache__
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
.pytest_cache
|
||||
.coverage
|
||||
htmlcov
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
||||
venv
|
||||
env
|
||||
ENV
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# IDEs
|
||||
.vscode
|
||||
.idea
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Documentation (not needed in container)
|
||||
docs/
|
||||
tests/
|
||||
*.md
|
||||
!requirements.txt
|
||||
|
||||
# Docker files
|
||||
docker-compose*.yml
|
||||
Dockerfile
|
||||
.dockerignore
|
||||
|
||||
# Nginx config (copied separately in production)
|
||||
nginx*.conf
|
||||
|
||||
# SSL certificates (mounted as volumes)
|
||||
certbot/
|
||||
|
||||
# Backups
|
||||
*.sql
|
||||
*.dump
|
||||
backup/
|
||||
|
||||
# Logs (generated in container)
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
*.bak
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Scripts (not all needed in container)
|
||||
scripts/setup-ssl.sh
|
||||
scripts/check-config.sh
|
||||
|
||||
# Test files
|
||||
tests/response_*.json
|
||||
88
.gitignore
vendored
88
.gitignore
vendored
@@ -1,5 +1,85 @@
|
||||
# SmartSolTech .gitignore
|
||||
|
||||
# Python
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
__pycache__/
|
||||
*.egg-info/
|
||||
dist/
|
||||
build/
|
||||
*.egg
|
||||
|
||||
# Virtual Environment
|
||||
.venv/
|
||||
venv/
|
||||
env/
|
||||
ENV/
|
||||
|
||||
# Django
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
/media
|
||||
/staticfiles
|
||||
*.pot
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
__pycache__
|
||||
.venv
|
||||
.history
|
||||
static/qr_codes
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# IDEs
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
.history/
|
||||
|
||||
# Docker
|
||||
docker-compose.override.yml
|
||||
|
||||
# Certificates
|
||||
certbot/
|
||||
|
||||
# Backups
|
||||
*.sql
|
||||
*.dump
|
||||
backup/
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
*.bak
|
||||
|
||||
# Test responses
|
||||
tests/response_*.json
|
||||
|
||||
# QR Codes (generated)
|
||||
static/qr_codes/
|
||||
smartsoltech/static/qr_codes/
|
||||
smartsoltech/staticfiles/qr_codes/
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Cache
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
.tox/
|
||||
.mypy_cache/
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
80
CHANGELOG.md
Normal file
80
CHANGELOG.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# Changelog
|
||||
|
||||
Все значимые изменения в проекте SmartSolTech документируются в этом файле.
|
||||
|
||||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/),
|
||||
и проект следует [Semantic Versioning](https://semver.org/lang/ru/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Добавлено
|
||||
- 🐳 Docker контейнеризация приложения
|
||||
- 📋 Docker Compose конфигурация для development и production
|
||||
- 🔒 Nginx конфигурация для production
|
||||
- 📱 Интеграция Telegram бота для уведомлений
|
||||
- 📧 Система email уведомлений
|
||||
- 🎨 Django Jazzmin админ-панель
|
||||
- 📊 PostgreSQL база данных
|
||||
- 🔐 QR код для подтверждения заявок
|
||||
- 📈 Интеграция Zabbix Agent для мониторинга
|
||||
- 🚀 Скрипты автоматического деплоя
|
||||
- 🔍 Скрипт проверки конфигурации
|
||||
- 🔒 Скрипт настройки SSL сертификатов
|
||||
- 📝 Подробная документация по деплою
|
||||
- 📚 README с инструкциями
|
||||
- 🤝 CONTRIBUTING руководство
|
||||
|
||||
### Изменено
|
||||
- ⚙️ Настройки Django оптимизированы для production
|
||||
- 🔧 Переменные окружения вынесены в .env файл
|
||||
- 📁 Структура проекта реорганизована
|
||||
- Документация перенесена в `docs/`
|
||||
- Скрипты перенесены в `scripts/`
|
||||
- Тестовые файлы перенесены в `tests/`
|
||||
|
||||
### Безопасность
|
||||
- 🔐 SECRET_KEY вынесен в переменные окружения
|
||||
- 🔒 DEBUG режим управляется через .env
|
||||
- 🛡️ Добавлены security headers в Nginx
|
||||
- 🔑 Поддержка HTTPS с Let's Encrypt
|
||||
|
||||
### Инфраструктура
|
||||
- 🐘 PostgreSQL 17
|
||||
- 🐍 Python 3.10
|
||||
- 🎯 Django 5.1.1
|
||||
- 🤖 python-telegram-bot 21.6
|
||||
- 🌐 Nginx для production
|
||||
- 🐳 Docker & Docker Compose
|
||||
|
||||
---
|
||||
|
||||
## Формат записей
|
||||
|
||||
### [Версия] - ГГГГ-ММ-ДД
|
||||
|
||||
#### Добавлено (Added)
|
||||
- Новые функции
|
||||
|
||||
#### Изменено (Changed)
|
||||
- Изменения в существующем функционале
|
||||
|
||||
#### Устарело (Deprecated)
|
||||
- Функции, которые скоро будут удалены
|
||||
|
||||
#### Удалено (Removed)
|
||||
- Удаленные функции
|
||||
|
||||
#### Исправлено (Fixed)
|
||||
- Исправления багов
|
||||
|
||||
#### Безопасность (Security)
|
||||
- Изменения, связанные с безопасностью
|
||||
|
||||
---
|
||||
|
||||
## Предыдущие версии
|
||||
|
||||
### Инициализация проекта
|
||||
- Базовая структура Django приложения
|
||||
- Модели для клиентов, заказов, услуг
|
||||
- Основной функционал веб-приложения
|
||||
255
CONTRIBUTING.md
Normal file
255
CONTRIBUTING.md
Normal file
@@ -0,0 +1,255 @@
|
||||
# Contributing to SmartSolTech
|
||||
|
||||
Спасибо за интерес к проекту SmartSolTech! Это руководство поможет вам начать работу.
|
||||
|
||||
## 🚀 Начало работы
|
||||
|
||||
### Требования для разработки
|
||||
|
||||
- Python 3.10+
|
||||
- Docker & Docker Compose
|
||||
- Git
|
||||
- Базовые знания Django
|
||||
|
||||
### Настройка окружения для разработки
|
||||
|
||||
1. **Клонируйте репозиторий**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd smartsoltech.kr-master
|
||||
```
|
||||
|
||||
2. **Создайте .env файл**
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Отредактируйте .env с вашими настройками
|
||||
```
|
||||
|
||||
3. **Запустите проект**
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
4. **Примените миграции**
|
||||
```bash
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
```
|
||||
|
||||
5. **Создайте суперпользователя**
|
||||
```bash
|
||||
docker-compose exec web python smartsoltech/manage.py createsuperuser
|
||||
```
|
||||
|
||||
## 📝 Соглашения о коде
|
||||
|
||||
### Python / Django
|
||||
|
||||
- Следуйте PEP 8
|
||||
- Используйте type hints где возможно
|
||||
- Документируйте функции и классы docstrings
|
||||
- Максимальная длина строки: 120 символов
|
||||
|
||||
**Пример:**
|
||||
```python
|
||||
def send_telegram_notification(chat_id: str, message: str) -> bool:
|
||||
"""
|
||||
Отправляет уведомление в Telegram.
|
||||
|
||||
Args:
|
||||
chat_id: ID чата Telegram
|
||||
message: Текст сообщения
|
||||
|
||||
Returns:
|
||||
True если сообщение отправлено успешно, False иначе
|
||||
"""
|
||||
pass
|
||||
```
|
||||
|
||||
### Структура коммитов
|
||||
|
||||
Используйте понятные сообщения коммитов:
|
||||
|
||||
```
|
||||
<type>: <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
**Типы:**
|
||||
- `feat`: Новая функция
|
||||
- `fix`: Исправление бага
|
||||
- `docs`: Изменения в документации
|
||||
- `style`: Форматирование кода
|
||||
- `refactor`: Рефакторинг
|
||||
- `test`: Добавление тестов
|
||||
- `chore`: Рутинные задачи
|
||||
|
||||
**Примеры:**
|
||||
```
|
||||
feat: add QR code generation for service requests
|
||||
|
||||
- Implement QR code generation using qrcode library
|
||||
- Add QR code display in frontend
|
||||
- Update ServiceRequest model with token field
|
||||
|
||||
Closes #123
|
||||
```
|
||||
|
||||
## 🔄 Процесс разработки
|
||||
|
||||
### 1. Создайте ветку
|
||||
|
||||
```bash
|
||||
git checkout -b feature/your-feature-name
|
||||
# или
|
||||
git checkout -b fix/bug-description
|
||||
```
|
||||
|
||||
### 2. Внесите изменения
|
||||
|
||||
- Пишите чистый код
|
||||
- Добавляйте комментарии
|
||||
- Обновляйте документацию
|
||||
|
||||
### 3. Протестируйте
|
||||
|
||||
```bash
|
||||
# Запустите тесты (когда будут добавлены)
|
||||
docker-compose exec web python smartsoltech/manage.py test
|
||||
|
||||
# Проверьте миграции
|
||||
docker-compose exec web python smartsoltech/manage.py makemigrations --check --dry-run
|
||||
```
|
||||
|
||||
### 4. Закоммитьте изменения
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "feat: add your feature description"
|
||||
```
|
||||
|
||||
### 5. Создайте Pull Request
|
||||
|
||||
- Опишите изменения подробно
|
||||
- Приложите скриншоты (если применимо)
|
||||
- Упомяните связанные issue
|
||||
|
||||
## 🐛 Отчеты о багах
|
||||
|
||||
При создании issue о баге, пожалуйста, укажите:
|
||||
|
||||
- **Описание**: Что произошло?
|
||||
- **Ожидаемое поведение**: Что должно было произойти?
|
||||
- **Шаги воспроизведения**: Как воспроизвести баг?
|
||||
- **Окружение**: OS, версия Docker, браузер
|
||||
- **Логи**: Если доступны
|
||||
|
||||
**Пример:**
|
||||
```markdown
|
||||
## Описание
|
||||
Telegram бот не отправляет уведомления после создания заявки.
|
||||
|
||||
## Ожидаемое поведение
|
||||
После создания заявки клиент должен получить уведомление в Telegram.
|
||||
|
||||
## Шаги воспроизведения
|
||||
1. Создать заявку через веб-форму
|
||||
2. Подождать 30 секунд
|
||||
3. Проверить Telegram - уведомление не пришло
|
||||
|
||||
## Окружение
|
||||
- OS: Ubuntu 22.04
|
||||
- Docker: 20.10.21
|
||||
- Browser: Chrome 120
|
||||
|
||||
## Логи
|
||||
```
|
||||
[ERROR] Failed to send message: Connection timeout
|
||||
```
|
||||
|
||||
## 💡 Предложения новых функций
|
||||
|
||||
При предложении новой функции:
|
||||
|
||||
- **Описание**: Что вы хотите добавить?
|
||||
- **Обоснование**: Зачем это нужно?
|
||||
- **Примеры использования**: Как это будет работать?
|
||||
- **Альтернативы**: Рассматривали ли другие варианты?
|
||||
|
||||
## 🧪 Тестирование
|
||||
|
||||
### Ручное тестирование
|
||||
|
||||
1. Создайте тестовые данные
|
||||
2. Проверьте все измененные функции
|
||||
3. Проверьте интеграции (Telegram, Email)
|
||||
|
||||
### Автоматическое тестирование
|
||||
|
||||
```bash
|
||||
# Запуск тестов
|
||||
docker-compose exec web python smartsoltech/manage.py test
|
||||
|
||||
# Запуск тестов с покрытием
|
||||
docker-compose exec web coverage run --source='.' manage.py test
|
||||
docker-compose exec web coverage report
|
||||
```
|
||||
|
||||
## 📚 Структура проекта
|
||||
|
||||
```
|
||||
smartsoltech/
|
||||
├── web/ # Основное веб-приложение
|
||||
│ ├── models.py # Модели данных
|
||||
│ ├── views.py # Представления
|
||||
│ ├── urls.py # URL маршруты
|
||||
│ ├── forms.py # Формы
|
||||
│ └── admin.py # Настройки админки
|
||||
├── comunication/ # Telegram бот и коммуникации
|
||||
│ ├── telegram_bot.py
|
||||
│ └── models.py
|
||||
└── smartsoltech/ # Настройки проекта
|
||||
├── settings.py
|
||||
└── urls.py
|
||||
```
|
||||
|
||||
## 🔍 Полезные команды
|
||||
|
||||
```bash
|
||||
# Просмотр логов
|
||||
docker-compose logs -f web
|
||||
docker-compose logs -f bot
|
||||
|
||||
# Доступ к shell
|
||||
docker-compose exec web python smartsoltech/manage.py shell
|
||||
|
||||
# Создание миграций
|
||||
docker-compose exec web python smartsoltech/manage.py makemigrations
|
||||
|
||||
# Применение миграций
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
|
||||
# Сбор статики
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput
|
||||
|
||||
# Проверка кода
|
||||
docker-compose exec web python -m flake8 .
|
||||
```
|
||||
|
||||
## ❓ Вопросы?
|
||||
|
||||
Если у вас есть вопросы:
|
||||
|
||||
- Создайте issue с меткой `question`
|
||||
- Проверьте [документацию](docs/)
|
||||
- Свяжитесь с командой
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
Внося вклад в проект, вы соглашаетесь, что ваши изменения будут лицензированы под той же лицензией, что и проект.
|
||||
|
||||
---
|
||||
|
||||
Спасибо за ваш вклад в SmartSolTech! 🎉
|
||||
158
PROJECT_STATUS.md
Normal file
158
PROJECT_STATUS.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# 📦 Проект готов к деплою!
|
||||
|
||||
## ✅ Что было сделано
|
||||
|
||||
### 🧹 Организация файлов
|
||||
- ✅ Создана структура папок:
|
||||
- `docs/` - вся документация
|
||||
- `scripts/` - скрипты управления
|
||||
- `tests/` - тестовые файлы
|
||||
- ✅ Удалены временные файлы и мусор из корня
|
||||
- ✅ Удалена папка `.history`
|
||||
|
||||
### 📝 Документация
|
||||
- ✅ `README.md` - главный файл с описанием проекта
|
||||
- ✅ `CONTRIBUTING.md` - руководство для контрибьюторов
|
||||
- ✅ `CHANGELOG.md` - история изменений
|
||||
- ✅ `docs/DEPLOYMENT.md` - подробное руководство по деплою
|
||||
- ✅ `docs/ENV_VARIABLES.md` - все переменные окружения
|
||||
- ✅ `docs/QR_CODE_FEATURE_SUMMARY.md` - описание QR функционала
|
||||
|
||||
### 🐳 Docker конфигурация
|
||||
- ✅ `Dockerfile` - оптимизирован для production
|
||||
- ✅ `docker-compose.yml` - для development
|
||||
- ✅ `docker-compose.prod.yml` - для production с Nginx
|
||||
- ✅ `.dockerignore` - исключение ненужных файлов
|
||||
- ✅ `nginx.conf` - конфигурация веб-сервера
|
||||
|
||||
### 🔧 Скрипты автоматизации
|
||||
- ✅ `scripts/deploy.sh` - автоматический деплой
|
||||
- ✅ `scripts/check-config.sh` - проверка конфигурации
|
||||
- ✅ `scripts/setup-ssl.sh` - настройка SSL
|
||||
- ✅ `scripts/update_telegram_token.py` - обновление токена бота
|
||||
- ✅ `scripts/README.md` - описание всех скриптов
|
||||
|
||||
### ⚙️ Конфигурация
|
||||
- ✅ `.env.example` - пример переменных окружения
|
||||
- ✅ `.gitignore` - обновлен для проекта
|
||||
- ✅ `requirements.txt` - Python зависимости
|
||||
- ✅ `settings.py` - DEBUG вынесен в .env
|
||||
|
||||
### 🗂️ Итоговая структура
|
||||
|
||||
```
|
||||
smartsoltech.kr-master/
|
||||
├── 📄 README.md # Главный файл проекта
|
||||
├── 📄 CONTRIBUTING.md # Руководство для разработчиков
|
||||
├── 📄 CHANGELOG.md # История изменений
|
||||
├── 🐳 Dockerfile # Docker образ
|
||||
├── 🐳 docker-compose.yml # Development
|
||||
├── 🐳 docker-compose.prod.yml # Production
|
||||
├── 🔧 .dockerignore # Docker исключения
|
||||
├── 🔧 .gitignore # Git исключения
|
||||
├── 🔧 .env.example # Пример переменных
|
||||
├── 🌐 nginx.conf # Nginx конфигурация
|
||||
├── 📦 requirements.txt # Python зависимости
|
||||
├── 🔧 wait-for-it.sh # Утилита ожидания БД
|
||||
│
|
||||
├── 📁 docs/ # 📚 Документация
|
||||
│ ├── DEPLOYMENT.md # Руководство по деплою
|
||||
│ ├── ENV_VARIABLES.md # Переменные окружения
|
||||
│ └── QR_CODE_FEATURE_SUMMARY.md # QR код функционал
|
||||
│
|
||||
├── 📁 scripts/ # 🔧 Скрипты
|
||||
│ ├── README.md # Описание скриптов
|
||||
│ ├── deploy.sh # Автоматический деплой
|
||||
│ ├── check-config.sh # Проверка конфигурации
|
||||
│ ├── setup-ssl.sh # Настройка SSL
|
||||
│ ├── update_bot_token.sh # Shell обертка
|
||||
│ └── update_telegram_token.py # Обновление токена
|
||||
│
|
||||
├── 📁 tests/ # 🧪 Тесты
|
||||
│ ├── README.md # Описание тестов
|
||||
│ ├── endpoint_test.sh # Тестирование API
|
||||
│ └── real_confirmation_process.html
|
||||
│
|
||||
├── 📁 smartsoltech/ # 🐍 Django приложение
|
||||
│ ├── manage.py
|
||||
│ ├── web/ # Веб-приложение
|
||||
│ ├── comunication/ # Telegram бот
|
||||
│ ├── smartsoltech/ # Настройки
|
||||
│ ├── static/ # Статика
|
||||
│ └── media/ # Медиа
|
||||
│
|
||||
├── 📁 frontend/ # 🎨 Frontend ресурсы
|
||||
├── 📁 bin/ # 🔧 Утилиты
|
||||
└── 📁 patch/ # 🩹 Патчи
|
||||
|
||||
```
|
||||
|
||||
## 🚀 Следующие шаги
|
||||
|
||||
### 1. Проверьте конфигурацию
|
||||
```bash
|
||||
chmod +x scripts/*.sh
|
||||
./scripts/check-config.sh
|
||||
```
|
||||
|
||||
### 2. Создайте .env файл
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 3. Сгенерируйте SECRET_KEY
|
||||
```bash
|
||||
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||||
```
|
||||
|
||||
### 4. Запустите деплой
|
||||
```bash
|
||||
./scripts/deploy.sh
|
||||
```
|
||||
|
||||
## 📊 Переменные окружения
|
||||
|
||||
### Обязательные:
|
||||
- ✅ `SECRET_KEY` - Секретный ключ Django
|
||||
- ✅ `DEBUG` - Режим отладки (False для production)
|
||||
- ✅ `ALLOWED_HOSTS` - Разрешенные хосты
|
||||
- ✅ `POSTGRES_DB` - База данных
|
||||
- ✅ `POSTGRES_USER` - Пользователь БД
|
||||
- ✅ `POSTGRES_PASSWORD` - Пароль БД
|
||||
- ✅ `POSTGRES_HOST` - Хост БД (postgres_db для Docker)
|
||||
- ✅ `PGADMIN_DEFAULT_EMAIL` - Email для PgAdmin
|
||||
- ✅ `PGADMIN_DEFAULT_PASSWORD` - Пароль для PgAdmin
|
||||
|
||||
### Опциональные:
|
||||
- `CSRF_TRUSTED_ORIGINS` - Доверенные источники
|
||||
- `ZBX_SERVER_HOST` - Zabbix сервер
|
||||
|
||||
Подробнее: `docs/ENV_VARIABLES.md`
|
||||
|
||||
## 🔐 Безопасность
|
||||
|
||||
- ⚠️ `.env` файл в `.gitignore` - НЕ коммитьте его!
|
||||
- ⚠️ Используйте сильные пароли
|
||||
- ⚠️ `DEBUG=False` в production
|
||||
- ⚠️ Настройте HTTPS в production
|
||||
|
||||
## 📚 Полезные ссылки
|
||||
|
||||
- [Документация по деплою](docs/DEPLOYMENT.md)
|
||||
- [Переменные окружения](docs/ENV_VARIABLES.md)
|
||||
- [Руководство контрибьютора](CONTRIBUTING.md)
|
||||
- [История изменений](CHANGELOG.md)
|
||||
|
||||
## 🎉 Готово!
|
||||
|
||||
Проект полностью организован и готов к:
|
||||
- ✅ Коммиту в Git
|
||||
- ✅ Деплою в Docker
|
||||
- ✅ Production запуску
|
||||
- ✅ Совместной разработке
|
||||
|
||||
---
|
||||
|
||||
**Создано:** 24 ноября 2025
|
||||
**Версия:** 1.0.0
|
||||
279
README.md
Normal file
279
README.md
Normal file
@@ -0,0 +1,279 @@
|
||||
# SmartSolTech - Business Management System
|
||||
|
||||
Система управления бизнесом с интеграцией Telegram бота для автоматизации обработки заявок и заказов.
|
||||
|
||||
## 🚀 Возможности
|
||||
|
||||
- 📋 Управление клиентами и заявками на услуги
|
||||
- 🛒 Система заказов и проектов
|
||||
- 📱 Интеграция с Telegram ботом
|
||||
- 🔔 Уведомления по Email и Telegram
|
||||
- 🎨 Современная админ-панель (Django Jazzmin)
|
||||
- 📊 База данных PostgreSQL
|
||||
- 🐳 Docker контейнеризация
|
||||
- 📈 Мониторинг Zabbix
|
||||
|
||||
## 📁 Структура проекта
|
||||
|
||||
```
|
||||
smartsoltech.kr-master/
|
||||
├── smartsoltech/ # Основное Django приложение
|
||||
│ ├── web/ # Веб-приложение (клиенты, заказы, услуги)
|
||||
│ ├── comunication/ # Telegram бот и коммуникации
|
||||
│ ├── static/ # Статические файлы
|
||||
│ └── media/ # Медиа файлы
|
||||
├── frontend/ # Frontend ресурсы
|
||||
├── docs/ # Документация
|
||||
│ ├── DEPLOYMENT.md # Руководство по деплою
|
||||
│ ├── ENV_VARIABLES.md # Описание переменных окружения
|
||||
│ └── QR_CODE_FEATURE_SUMMARY.md
|
||||
├── scripts/ # Скрипты для управления
|
||||
│ ├── deploy.sh # Скрипт автоматического деплоя
|
||||
│ ├── check-config.sh # Проверка конфигурации
|
||||
│ ├── setup-ssl.sh # Настройка SSL сертификатов
|
||||
│ └── update_telegram_token.py # Обновление токена бота
|
||||
├── tests/ # Тестовые файлы
|
||||
├── bin/ # Вспомогательные скрипты
|
||||
├── patch/ # Патчи для библиотек
|
||||
├── docker-compose.yml # Development конфигурация
|
||||
├── docker-compose.prod.yml # Production конфигурация
|
||||
├── Dockerfile # Docker образ приложения
|
||||
├── nginx.conf # Конфигурация Nginx
|
||||
└── requirements.txt # Python зависимости
|
||||
```
|
||||
|
||||
## 🔧 Технологический стек
|
||||
|
||||
- **Backend**: Django 5.1.1
|
||||
- **Database**: PostgreSQL 17
|
||||
- **Bot**: python-telegram-bot 21.6
|
||||
- **Frontend**: Bootstrap 5
|
||||
- **Containerization**: Docker & Docker Compose
|
||||
- **Web Server**: Nginx (production)
|
||||
- **Admin**: Django Jazzmin
|
||||
- **Monitoring**: Zabbix Agent
|
||||
|
||||
## 📋 Требования
|
||||
|
||||
- Docker 20.10+
|
||||
- Docker Compose 1.29+
|
||||
- Git
|
||||
|
||||
## ⚡ Быстрый старт
|
||||
|
||||
### 1. Клонирование репозитория
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd smartsoltech.kr-master
|
||||
```
|
||||
|
||||
### 2. Настройка переменных окружения
|
||||
|
||||
```bash
|
||||
# Создайте .env файл
|
||||
cp .env.example .env
|
||||
|
||||
# Сгенерируйте SECRET_KEY
|
||||
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||||
|
||||
# Отредактируйте .env файл
|
||||
nano .env
|
||||
```
|
||||
|
||||
**Обязательные переменные:**
|
||||
- `SECRET_KEY` - Секретный ключ Django
|
||||
- `DEBUG` - Режим отладки (False для production)
|
||||
- `ALLOWED_HOSTS` - Разрешенные хосты
|
||||
- `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` - Настройки БД
|
||||
- `PGADMIN_DEFAULT_EMAIL`, `PGADMIN_DEFAULT_PASSWORD` - Доступ к PgAdmin
|
||||
|
||||
Подробнее см. [docs/ENV_VARIABLES.md](docs/ENV_VARIABLES.md)
|
||||
|
||||
### 3. Проверка конфигурации
|
||||
|
||||
```bash
|
||||
chmod +x scripts/*.sh
|
||||
./scripts/check-config.sh
|
||||
```
|
||||
|
||||
### 4. Запуск приложения
|
||||
|
||||
**Development режим:**
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
**Production режим:**
|
||||
```bash
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
**Или используйте скрипт автоматического деплоя:**
|
||||
```bash
|
||||
./scripts/deploy.sh
|
||||
```
|
||||
|
||||
### 5. Применение миграций и создание суперпользователя
|
||||
|
||||
```bash
|
||||
# Применить миграции
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
|
||||
# Создать суперпользователя
|
||||
docker-compose exec web python smartsoltech/manage.py createsuperuser
|
||||
```
|
||||
|
||||
## 🌐 Доступ к сервисам
|
||||
|
||||
После запуска сервисы доступны по адресам:
|
||||
|
||||
- **Django App**: http://localhost:8000
|
||||
- **Admin Panel**: http://localhost:8000/admin
|
||||
- **PgAdmin**: http://localhost:8080
|
||||
- **Telegram Bot**: Работает в фоновом режиме
|
||||
|
||||
## 📱 Настройка Telegram бота
|
||||
|
||||
1. Создайте бота через [@BotFather](https://t.me/BotFather)
|
||||
2. Получите токен бота
|
||||
3. Обновите токен через скрипт или админ-панель:
|
||||
|
||||
```bash
|
||||
docker-compose exec web python scripts/update_telegram_token.py
|
||||
```
|
||||
|
||||
Или через админ-панель: **Admin → Comunication → Telegram Settings**
|
||||
|
||||
## 📧 Настройка Email
|
||||
|
||||
Настройте SMTP через админ-панель:
|
||||
**Admin → Comunication → Email Settings**
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
- ✅ Не храните .env в репозитории (добавлен в .gitignore)
|
||||
- ✅ Используйте сильные пароли
|
||||
- ✅ Установите `DEBUG=False` в production
|
||||
- ✅ Настройте HTTPS (см. scripts/setup-ssl.sh)
|
||||
- ✅ Регулярно обновляйте зависимости
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
- [DEPLOYMENT.md](docs/DEPLOYMENT.md) - Подробное руководство по деплою
|
||||
- [ENV_VARIABLES.md](docs/ENV_VARIABLES.md) - Описание переменных окружения
|
||||
- [QR_CODE_FEATURE_SUMMARY.md](docs/QR_CODE_FEATURE_SUMMARY.md) - Описание функции QR-кодов
|
||||
|
||||
## 🛠️ Полезные команды
|
||||
|
||||
### Управление контейнерами
|
||||
|
||||
```bash
|
||||
# Просмотр логов
|
||||
docker-compose logs -f
|
||||
|
||||
# Просмотр логов конкретного сервиса
|
||||
docker-compose logs -f web
|
||||
docker-compose logs -f bot
|
||||
|
||||
# Перезапуск сервисов
|
||||
docker-compose restart
|
||||
|
||||
# Остановка всех сервисов
|
||||
docker-compose down
|
||||
|
||||
# Остановка с удалением volumes (осторожно!)
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### Django команды
|
||||
|
||||
```bash
|
||||
# Применить миграции
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
|
||||
# Создать миграции
|
||||
docker-compose exec web python smartsoltech/manage.py makemigrations
|
||||
|
||||
# Собрать статику
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput
|
||||
|
||||
# Создать суперпользователя
|
||||
docker-compose exec web python smartsoltech/manage.py createsuperuser
|
||||
|
||||
# Django shell
|
||||
docker-compose exec web python smartsoltech/manage.py shell
|
||||
```
|
||||
|
||||
### Backup и восстановление БД
|
||||
|
||||
```bash
|
||||
# Создание backup
|
||||
docker-compose exec postgres_db pg_dump -U smartsoltech_user smartsoltech_db > backup.sql
|
||||
|
||||
# Восстановление из backup
|
||||
cat backup.sql | docker-compose exec -T postgres_db psql -U smartsoltech_user smartsoltech_db
|
||||
```
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### База данных не готова
|
||||
```bash
|
||||
# Проверьте логи PostgreSQL
|
||||
docker-compose logs postgres_db
|
||||
|
||||
# Проверьте health check
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### Telegram бот не работает
|
||||
```bash
|
||||
# Проверьте логи бота
|
||||
docker-compose logs bot
|
||||
|
||||
# Обновите токен
|
||||
docker-compose exec web python scripts/update_telegram_token.py
|
||||
```
|
||||
|
||||
### Проблемы со статикой
|
||||
```bash
|
||||
# Пересоберите статику
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput --clear
|
||||
```
|
||||
|
||||
Подробнее см. [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)
|
||||
|
||||
## 🔄 Обновление приложения
|
||||
|
||||
```bash
|
||||
# 1. Остановите сервисы
|
||||
docker-compose down
|
||||
|
||||
# 2. Получите обновления
|
||||
git pull origin main
|
||||
|
||||
# 3. Пересоберите образы
|
||||
docker-compose build --no-cache
|
||||
|
||||
# 4. Запустите сервисы
|
||||
docker-compose up -d
|
||||
|
||||
# 5. Примените миграции
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
|
||||
# 6. Соберите статику
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput
|
||||
```
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
Proprietary - Все права защищены
|
||||
|
||||
## 👥 Контакты
|
||||
|
||||
- Website: https://smartsoltech.kr
|
||||
- Email: support@smartsoltech.kr
|
||||
|
||||
---
|
||||
|
||||
Made with ❤️ by SmartSolTech Team
|
||||
127
docker-compose.prod.yml
Normal file
127
docker-compose.prod.yml
Normal file
@@ -0,0 +1,127 @@
|
||||
# Production docker-compose with Nginx
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
|
||||
postgres_db:
|
||||
image: postgres:17
|
||||
container_name: postgres_db
|
||||
env_file: .env
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
networks:
|
||||
- backend
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
restart: unless-stopped
|
||||
|
||||
pgadmin:
|
||||
image: dpage/pgadmin4
|
||||
container_name: pgadmin
|
||||
env_file: .env
|
||||
depends_on:
|
||||
postgres_db:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
|
||||
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
|
||||
networks:
|
||||
- backend
|
||||
volumes:
|
||||
- pgadmin:/var/lib/pgadmin
|
||||
restart: unless-stopped
|
||||
|
||||
web:
|
||||
build: .
|
||||
container_name: django_app
|
||||
env_file: .env
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- static_volume:/app/smartsoltech/staticfiles
|
||||
- media_volume:/app/smartsoltech/media
|
||||
expose:
|
||||
- "8000"
|
||||
depends_on:
|
||||
postgres_db:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- backend
|
||||
healthcheck:
|
||||
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000').read()"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
bot:
|
||||
build: .
|
||||
container_name: telegram_bot
|
||||
command: sh -c "./wait-for-it.sh postgres_db:5432 -- python smartsoltech/manage.py start_telegram_bot"
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
depends_on:
|
||||
web:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- backend
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: nginx
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
- static_volume:/app/smartsoltech/staticfiles:ro
|
||||
- media_volume:/app/smartsoltech/media:ro
|
||||
- ./certbot/conf:/etc/letsencrypt:ro
|
||||
- ./certbot/www:/var/www/certbot:ro
|
||||
depends_on:
|
||||
web:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- backend
|
||||
|
||||
certbot:
|
||||
image: certbot/certbot
|
||||
container_name: certbot
|
||||
volumes:
|
||||
- ./certbot/conf:/etc/letsencrypt
|
||||
- ./certbot/www:/var/www/certbot
|
||||
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
|
||||
|
||||
zabbix-agent:
|
||||
image: zabbix/zabbix-agent:latest
|
||||
container_name: zabbix_agent
|
||||
env_file: .env
|
||||
environment:
|
||||
ZBX_SERVER_HOST: ${ZBX_SERVER_HOST}
|
||||
volumes:
|
||||
- /proc:/host/proc
|
||||
- /sys:/host/sys
|
||||
- /etc:/host/etc
|
||||
privileged: true
|
||||
networks:
|
||||
- backend
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
pgdata:
|
||||
pgadmin:
|
||||
static_volume:
|
||||
media_volume:
|
||||
|
||||
networks:
|
||||
backend:
|
||||
driver: bridge
|
||||
267
docs/DEPLOYMENT.md
Normal file
267
docs/DEPLOYMENT.md
Normal file
@@ -0,0 +1,267 @@
|
||||
# SmartSolTech Deployment Guide
|
||||
|
||||
## Переменные окружения (.env)
|
||||
|
||||
Проект использует следующие переменные окружения:
|
||||
|
||||
### Django Settings
|
||||
- `SECRET_KEY` - Секретный ключ Django (генерируется случайно)
|
||||
- `DEBUG` - Режим отладки (False для production)
|
||||
- `ALLOWED_HOSTS` - Разрешенные хосты (через запятую)
|
||||
- `CSRF_TRUSTED_ORIGINS` - Доверенные источники для CSRF (через запятую)
|
||||
|
||||
### PostgreSQL Database
|
||||
- `POSTGRES_DB` - Имя базы данных
|
||||
- `POSTGRES_USER` - Пользователь базы данных
|
||||
- `POSTGRES_PASSWORD` - Пароль базы данных
|
||||
- `POSTGRES_HOST` - Хост базы данных (postgres_db для Docker)
|
||||
|
||||
### PgAdmin
|
||||
- `PGADMIN_DEFAULT_EMAIL` - Email для входа в PgAdmin
|
||||
- `PGADMIN_DEFAULT_PASSWORD` - Пароль для входа в PgAdmin
|
||||
|
||||
### Zabbix Agent
|
||||
- `ZBX_SERVER_HOST` - IP адрес Zabbix сервера
|
||||
|
||||
### Telegram Bot (настраивается через админку Django)
|
||||
- Токен и настройки бота хранятся в базе данных
|
||||
- Используйте скрипт `update_telegram_token.py` для обновления
|
||||
|
||||
### Email Settings (настраивается через админку Django)
|
||||
- SMTP настройки хранятся в базе данных
|
||||
- Настраиваются через админ-панель Django
|
||||
|
||||
## Подготовка к деплою
|
||||
|
||||
### 1. Создайте .env файл
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 2. Сгенерируйте SECRET_KEY
|
||||
|
||||
```python
|
||||
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||||
```
|
||||
|
||||
### 3. Обновите переменные в .env
|
||||
|
||||
Обязательно измените:
|
||||
- `SECRET_KEY` - используйте сгенерированный ключ
|
||||
- `DEBUG=False` - для production
|
||||
- `ALLOWED_HOSTS` - ваш домен
|
||||
- `CSRF_TRUSTED_ORIGINS` - ваш домен с протоколом
|
||||
- `POSTGRES_PASSWORD` - сильный пароль
|
||||
- `PGADMIN_DEFAULT_PASSWORD` - сильный пароль
|
||||
|
||||
## Деплой в Docker
|
||||
|
||||
### Режим разработки
|
||||
|
||||
```bash
|
||||
# Запуск всех сервисов
|
||||
docker-compose up -d
|
||||
|
||||
# Просмотр логов
|
||||
docker-compose logs -f
|
||||
|
||||
# Остановка
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Production деплой
|
||||
|
||||
```bash
|
||||
# Использование production конфигурации
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# Или используйте скрипт деплоя
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
## Управление контейнерами
|
||||
|
||||
### Применение миграций
|
||||
|
||||
```bash
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
```
|
||||
|
||||
### Сбор статических файлов
|
||||
|
||||
```bash
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput
|
||||
```
|
||||
|
||||
### Создание суперпользователя
|
||||
|
||||
```bash
|
||||
docker-compose exec web python smartsoltech/manage.py createsuperuser
|
||||
```
|
||||
|
||||
### Обновление токена Telegram бота
|
||||
|
||||
```bash
|
||||
docker-compose exec web python update_telegram_token.py
|
||||
```
|
||||
|
||||
### Просмотр логов
|
||||
|
||||
```bash
|
||||
# Все сервисы
|
||||
docker-compose logs -f
|
||||
|
||||
# Конкретный сервис
|
||||
docker-compose logs -f web
|
||||
docker-compose logs -f bot
|
||||
docker-compose logs -f postgres_db
|
||||
```
|
||||
|
||||
### Перезапуск сервисов
|
||||
|
||||
```bash
|
||||
# Все сервисы
|
||||
docker-compose restart
|
||||
|
||||
# Конкретный сервис
|
||||
docker-compose restart web
|
||||
docker-compose restart bot
|
||||
```
|
||||
|
||||
## Структура сервисов
|
||||
|
||||
- **postgres_db** (порт 5432) - PostgreSQL база данных
|
||||
- **web** (порт 8000) - Django приложение
|
||||
- **bot** - Telegram бот
|
||||
- **pgadmin** (порт 8080) - PgAdmin для управления БД
|
||||
- **zabbix-agent** - Мониторинг Zabbix
|
||||
- **nginx** (порты 80, 443) - Веб-сервер (только в production)
|
||||
|
||||
## Безопасность
|
||||
|
||||
1. **Никогда не коммитьте .env файл** - он в .gitignore
|
||||
2. Используйте сильные пароли для всех сервисов
|
||||
3. Установите `DEBUG=False` в production
|
||||
4. Настройте firewall для ограничения доступа к портам
|
||||
5. Используйте HTTPS в production (настройте SSL сертификаты)
|
||||
6. Регулярно обновляйте зависимости
|
||||
|
||||
## SSL сертификаты (для production с Nginx)
|
||||
|
||||
```bash
|
||||
# Получение сертификата Let's Encrypt
|
||||
docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot \
|
||||
--email your-email@example.com \
|
||||
--agree-tos \
|
||||
--no-eff-email \
|
||||
-d your-domain.com \
|
||||
-d www.your-domain.com
|
||||
```
|
||||
|
||||
## Backup базы данных
|
||||
|
||||
```bash
|
||||
# Создание backup
|
||||
docker-compose exec postgres_db pg_dump -U smartsoltech_user smartsoltech_db > backup.sql
|
||||
|
||||
# Восстановление из backup
|
||||
cat backup.sql | docker-compose exec -T postgres_db psql -U smartsoltech_user smartsoltech_db
|
||||
```
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Проверка статуса сервисов
|
||||
|
||||
```bash
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### Проверка использования ресурсов
|
||||
|
||||
```bash
|
||||
docker stats
|
||||
```
|
||||
|
||||
### Health checks
|
||||
|
||||
Все сервисы имеют health checks для автоматического мониторинга:
|
||||
- PostgreSQL: проверка готовности через pg_isready
|
||||
- Django Web: HTTP запрос к порту 8000
|
||||
- Nginx: проверка процесса
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### База данных не готова
|
||||
|
||||
```bash
|
||||
# Проверьте логи PostgreSQL
|
||||
docker-compose logs postgres_db
|
||||
|
||||
# Проверьте health check
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### Миграции не применяются
|
||||
|
||||
```bash
|
||||
# Проверьте подключение к БД
|
||||
docker-compose exec web python smartsoltech/manage.py dbshell
|
||||
|
||||
# Примените миграции вручную
|
||||
docker-compose exec web python smartsoltech/manage.py migrate --verbosity 3
|
||||
```
|
||||
|
||||
### Telegram бот не запускается
|
||||
|
||||
```bash
|
||||
# Проверьте логи бота
|
||||
docker-compose logs bot
|
||||
|
||||
# Обновите токен через админку или скрипт
|
||||
docker-compose exec web python update_telegram_token.py
|
||||
```
|
||||
|
||||
## Обновление приложения
|
||||
|
||||
```bash
|
||||
# 1. Остановите сервисы
|
||||
docker-compose down
|
||||
|
||||
# 2. Получите обновления
|
||||
git pull origin main
|
||||
|
||||
# 3. Пересоберите образы
|
||||
docker-compose build --no-cache
|
||||
|
||||
# 4. Запустите сервисы
|
||||
docker-compose up -d
|
||||
|
||||
# 5. Примените миграции
|
||||
docker-compose exec web python smartsoltech/manage.py migrate
|
||||
|
||||
# 6. Соберите статику
|
||||
docker-compose exec web python smartsoltech/manage.py collectstatic --noinput
|
||||
```
|
||||
|
||||
## Полезные команды
|
||||
|
||||
```bash
|
||||
# Очистка неиспользуемых образов и контейнеров
|
||||
docker system prune -a
|
||||
|
||||
# Просмотр всех volume
|
||||
docker volume ls
|
||||
|
||||
# Удаление конкретного volume (осторожно!)
|
||||
docker volume rm smartsoltech_pgdata
|
||||
|
||||
# Вход в контейнер
|
||||
docker-compose exec web bash
|
||||
docker-compose exec postgres_db bash
|
||||
|
||||
# Выполнение команды Django
|
||||
docker-compose exec web python smartsoltech/manage.py <command>
|
||||
```
|
||||
134
docs/ENV_VARIABLES.md
Normal file
134
docs/ENV_VARIABLES.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# SmartSolTech - Environment Variables Summary
|
||||
|
||||
## ✅ Все переменные окружения для .env файла
|
||||
|
||||
### 🔐 Django Settings (обязательные)
|
||||
```env
|
||||
SECRET_KEY=your-secret-key-here-change-this-in-production
|
||||
DEBUG=False
|
||||
ALLOWED_HOSTS=localhost,127.0.0.1,your-domain.com
|
||||
CSRF_TRUSTED_ORIGINS=http://localhost:8000,https://your-domain.com
|
||||
```
|
||||
|
||||
### 🗄️ PostgreSQL Database (обязательные)
|
||||
```env
|
||||
POSTGRES_DB=smartsoltech_db
|
||||
POSTGRES_USER=smartsoltech_user
|
||||
POSTGRES_PASSWORD=your-strong-password-here
|
||||
POSTGRES_HOST=postgres_db
|
||||
```
|
||||
|
||||
### 🔧 PgAdmin (обязательные)
|
||||
```env
|
||||
PGADMIN_DEFAULT_EMAIL=admin@smartsoltech.kr
|
||||
PGADMIN_DEFAULT_PASSWORD=your-pgadmin-password
|
||||
```
|
||||
|
||||
### 📊 Zabbix Agent (опционально)
|
||||
```env
|
||||
ZBX_SERVER_HOST=your-zabbix-server-ip
|
||||
```
|
||||
|
||||
### 🔒 Security Settings для Production (опционально)
|
||||
```env
|
||||
SECURE_SSL_REDIRECT=True
|
||||
SESSION_COOKIE_SECURE=True
|
||||
CSRF_COOKIE_SECURE=True
|
||||
```
|
||||
|
||||
## 📝 Настройки через админ-панель Django
|
||||
|
||||
Следующие настройки **НЕ** хранятся в .env, а настраиваются через админ-панель Django:
|
||||
|
||||
### 📱 Telegram Bot Settings
|
||||
- Токен бота (от @BotFather)
|
||||
- Имя бота
|
||||
- Webhook URL (опционально)
|
||||
- Используется скрипт `update_telegram_token.py` для обновления
|
||||
|
||||
### 📧 Email Settings
|
||||
- SMTP сервер
|
||||
- SMTP порт
|
||||
- Отправитель email
|
||||
- Пароль
|
||||
- TLS/SSL настройки
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
1. **Создайте .env файл:**
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. **Сгенерируйте SECRET_KEY:**
|
||||
```bash
|
||||
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||||
```
|
||||
|
||||
3. **Отредактируйте .env:**
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
4. **Проверьте конфигурацию:**
|
||||
```bash
|
||||
./check-config.sh
|
||||
```
|
||||
|
||||
5. **Запустите деплой:**
|
||||
```bash
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
## 📂 Созданные файлы
|
||||
|
||||
### Конфигурационные файлы:
|
||||
- ✅ `.env.example` - Пример переменных окружения
|
||||
- ✅ `docker-compose.yml` - Обновлён для development
|
||||
- ✅ `docker-compose.prod.yml` - Production конфигурация с Nginx
|
||||
- ✅ `Dockerfile` - Обновлён с улучшениями
|
||||
- ✅ `nginx.conf` - Конфигурация Nginx для production
|
||||
|
||||
### Скрипты:
|
||||
- ✅ `deploy.sh` - Автоматический деплой
|
||||
- ✅ `check-config.sh` - Проверка конфигурации
|
||||
- ✅ `setup-ssl.sh` - Настройка SSL сертификатов
|
||||
|
||||
### Документация:
|
||||
- ✅ `DEPLOYMENT.md` - Подробная документация по деплою
|
||||
- ✅ `ENV_VARIABLES.md` - Этот файл
|
||||
- ✅ `settings_production.py` - Дополнительные настройки для production
|
||||
|
||||
## 🔍 Изменения в коде
|
||||
|
||||
### smartsoltech/settings.py:
|
||||
- ✅ Добавлена поддержка `DEBUG` из .env (с приведением к bool)
|
||||
- ✅ Используется `python-decouple` для управления переменными
|
||||
|
||||
### docker-compose.yml:
|
||||
- ✅ Добавлены health checks для всех сервисов
|
||||
- ✅ Добавлены volumes для persistent storage
|
||||
- ✅ Улучшены зависимости между сервисами
|
||||
- ✅ Добавлены restart policies
|
||||
|
||||
### Dockerfile:
|
||||
- ✅ Установка системных зависимостей (postgresql-client, netcat)
|
||||
- ✅ Улучшенная обработка статики
|
||||
- ✅ Health check для контейнера
|
||||
- ✅ Использование wait-for-it.sh для ожидания БД
|
||||
|
||||
## ⚠️ Важные замечания
|
||||
|
||||
1. **Никогда не коммитьте .env файл в git!** Он в .gitignore
|
||||
2. В production обязательно установите `DEBUG=False`
|
||||
3. Используйте сильные пароли для всех сервисов
|
||||
4. Регулярно обновляйте зависимости
|
||||
5. Настройте backup базы данных
|
||||
6. Используйте HTTPS в production
|
||||
|
||||
## 🆘 Поддержка
|
||||
|
||||
Для получения помощи:
|
||||
1. Проверьте логи: `docker-compose logs -f`
|
||||
2. Смотрите DEPLOYMENT.md для troubleshooting
|
||||
3. Используйте `check-config.sh` для диагностики
|
||||
@@ -1 +0,0 @@
|
||||
{"detail":"User 4 deleted"}
|
||||
@@ -1 +0,0 @@
|
||||
{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0Iiwicm9sZSI6InVzZXIiLCJleHAiOjE3NTI0OTc2NDV9.S_tquLFIPnyG6XlfwIw97hJv0l9oKpTcYw_XG0mDd6w","token_type":"bearer"}
|
||||
@@ -1 +0,0 @@
|
||||
{"id":4,"email":"testuser@example.com","role":"user"}
|
||||
@@ -1 +0,0 @@
|
||||
{"id":4,"email":"testuser@example.com","role":"user"}
|
||||
@@ -1 +0,0 @@
|
||||
{"id":4,"email":"updated_testuser@example.com","role":"admin"}
|
||||
@@ -1 +0,0 @@
|
||||
{"id":4,"email":"testuser@example.com","role":"user"}
|
||||
@@ -1 +0,0 @@
|
||||
[{"id":1,"email":"user1@example.com","role":"user"},{"id":4,"email":"testuser@example.com","role":"user"}]
|
||||
154
scripts/README.md
Normal file
154
scripts/README.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# Scripts
|
||||
|
||||
Скрипты для управления и деплоя SmartSolTech.
|
||||
|
||||
## Доступные скрипты
|
||||
|
||||
### 🚀 deploy.sh
|
||||
Автоматический деплой приложения в Docker.
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
**Что делает:**
|
||||
- Проверяет наличие .env файла
|
||||
- Останавливает существующие контейнеры
|
||||
- Собирает Docker образы
|
||||
- Запускает PostgreSQL
|
||||
- Применяет миграции БД
|
||||
- Собирает статику
|
||||
- Запускает все сервисы
|
||||
|
||||
---
|
||||
|
||||
### 🔍 check-config.sh
|
||||
Проверка конфигурации проекта перед деплоем.
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
chmod +x check-config.sh
|
||||
./check-config.sh
|
||||
```
|
||||
|
||||
**Проверяет:**
|
||||
- Наличие .env файла и обязательных переменных
|
||||
- Установку Docker и Docker Compose
|
||||
- Наличие необходимых файлов
|
||||
- Права доступа к скриптам
|
||||
|
||||
---
|
||||
|
||||
### 🔒 setup-ssl.sh
|
||||
Настройка SSL сертификатов Let's Encrypt для production.
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
chmod +x setup-ssl.sh
|
||||
./setup-ssl.sh your-domain.com admin@your-domain.com
|
||||
```
|
||||
|
||||
**Параметры:**
|
||||
- `domain` - Ваш домен (например, smartsoltech.kr)
|
||||
- `email` - Email для уведомлений Let's Encrypt
|
||||
|
||||
**Что делает:**
|
||||
- Создает директории для сертификатов
|
||||
- Запрашивает SSL сертификат через Certbot
|
||||
- Генерирует конфигурацию Nginx с HTTPS
|
||||
- Настраивает автоматическое обновление сертификатов
|
||||
|
||||
---
|
||||
|
||||
### 📱 update_telegram_token.py
|
||||
Обновление токена Telegram бота в базе данных.
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
# Внутри Docker контейнера
|
||||
docker-compose exec web python scripts/update_telegram_token.py
|
||||
|
||||
# Или напрямую с Python
|
||||
python scripts/update_telegram_token.py
|
||||
```
|
||||
|
||||
**Что делает:**
|
||||
- Проверяет валидность нового токена
|
||||
- Обновляет токен в базе данных
|
||||
- Сохраняет информацию о боте
|
||||
|
||||
**Получение токена:**
|
||||
1. Откройте [@BotFather](https://t.me/BotFather) в Telegram
|
||||
2. Отправьте `/mybots`
|
||||
3. Выберите своего бота
|
||||
4. Нажмите "API Token"
|
||||
|
||||
---
|
||||
|
||||
### 🔄 update_bot_token.sh
|
||||
Shell скрипт для обновления токена бота (обертка для Python скрипта).
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
chmod +x update_bot_token.sh
|
||||
./update_bot_token.sh "YOUR_BOT_TOKEN"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Общие рекомендации
|
||||
|
||||
### Права доступа
|
||||
Все скрипты должны быть исполняемыми:
|
||||
```bash
|
||||
chmod +x scripts/*.sh
|
||||
```
|
||||
|
||||
### Production деплой
|
||||
Для production используйте:
|
||||
```bash
|
||||
# 1. Проверьте конфигурацию
|
||||
./scripts/check-config.sh
|
||||
|
||||
# 2. Настройте SSL (опционально)
|
||||
./scripts/setup-ssl.sh your-domain.com your-email@example.com
|
||||
|
||||
# 3. Запустите деплой с production конфигурацией
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
### Development
|
||||
Для разработки:
|
||||
```bash
|
||||
# Используйте обычный docker-compose.yml
|
||||
./scripts/deploy.sh
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Скрипт не запускается
|
||||
```bash
|
||||
# Проверьте права доступа
|
||||
ls -la scripts/
|
||||
|
||||
# Добавьте права на выполнение
|
||||
chmod +x scripts/*.sh
|
||||
```
|
||||
|
||||
### Ошибка "command not found"
|
||||
```bash
|
||||
# Запускайте скрипты с ./
|
||||
./scripts/deploy.sh
|
||||
|
||||
# Или из корня проекта
|
||||
bash scripts/deploy.sh
|
||||
```
|
||||
|
||||
### Docker команды не работают
|
||||
Убедитесь, что Docker и Docker Compose установлены:
|
||||
```bash
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
102
scripts/check-config.sh
Executable file
102
scripts/check-config.sh
Executable file
@@ -0,0 +1,102 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Configuration check script for SmartSolTech
|
||||
|
||||
echo "🔍 Checking SmartSolTech configuration..."
|
||||
echo ""
|
||||
|
||||
# Color codes
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Check if .env file exists
|
||||
if [ -f .env ]; then
|
||||
echo -e "${GREEN}✓${NC} .env file found"
|
||||
|
||||
# Check required variables
|
||||
required_vars=("SECRET_KEY" "POSTGRES_DB" "POSTGRES_USER" "POSTGRES_PASSWORD" "POSTGRES_HOST" "PGADMIN_DEFAULT_EMAIL" "PGADMIN_DEFAULT_PASSWORD")
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if grep -q "^${var}=" .env; then
|
||||
value=$(grep "^${var}=" .env | cut -d '=' -f2)
|
||||
if [ -n "$value" ] && [ "$value" != "your-" ] && [[ ! "$value" =~ ^your- ]]; then
|
||||
echo -e "${GREEN}✓${NC} $var is set"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} $var needs to be configured"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}✗${NC} $var is missing"
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo -e "${RED}✗${NC} .env file not found"
|
||||
echo -e "${YELLOW}→${NC} Copy .env.example to .env and configure it"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Check Docker
|
||||
if command -v docker &> /dev/null; then
|
||||
echo -e "${GREEN}✓${NC} Docker is installed"
|
||||
docker --version
|
||||
else
|
||||
echo -e "${RED}✗${NC} Docker is not installed"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Check Docker Compose
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
echo -e "${GREEN}✓${NC} Docker Compose is installed"
|
||||
docker-compose --version
|
||||
else
|
||||
echo -e "${RED}✗${NC} Docker Compose is not installed"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Check required files
|
||||
required_files=("Dockerfile" "docker-compose.yml" "requirements.txt" "wait-for-it.sh")
|
||||
|
||||
for file in "${required_files[@]}"; do
|
||||
if [ -f "$file" ]; then
|
||||
echo -e "${GREEN}✓${NC} $file exists"
|
||||
else
|
||||
echo -e "${RED}✗${NC} $file is missing"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# Check wait-for-it.sh is executable
|
||||
if [ -f "wait-for-it.sh" ] && [ -x "wait-for-it.sh" ]; then
|
||||
echo -e "${GREEN}✓${NC} wait-for-it.sh is executable"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} wait-for-it.sh is not executable (will be set in Docker)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Check Python version in requirements
|
||||
if [ -f "requirements.txt" ]; then
|
||||
echo -e "${GREEN}✓${NC} Python dependencies:"
|
||||
grep -E "^Django==|^psycopg2|^python-telegram-bot==" requirements.txt
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Summary
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📋 Next steps:"
|
||||
echo ""
|
||||
if [ ! -f .env ]; then
|
||||
echo "1. Create .env file: cp .env.example .env"
|
||||
echo "2. Edit .env with your configuration: nano .env"
|
||||
fi
|
||||
echo "3. Generate SECRET_KEY:"
|
||||
echo ' python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"'
|
||||
echo "4. Update ALLOWED_HOSTS and CSRF_TRUSTED_ORIGINS in .env"
|
||||
echo "5. Run deployment: ./deploy.sh"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
0
deploy.sh → scripts/deploy.sh
Normal file → Executable file
0
deploy.sh → scripts/deploy.sh
Normal file → Executable file
131
scripts/setup-ssl.sh
Executable file
131
scripts/setup-ssl.sh
Executable file
@@ -0,0 +1,131 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SSL Setup script using Let's Encrypt for SmartSolTech
|
||||
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
echo "Usage: ./setup-ssl.sh <domain> <email>"
|
||||
echo "Example: ./setup-ssl.sh smartsoltech.kr admin@smartsoltech.kr"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOMAIN=$1
|
||||
EMAIL=$2
|
||||
|
||||
echo "🔒 Setting up SSL for $DOMAIN..."
|
||||
|
||||
# Create directories
|
||||
mkdir -p certbot/conf
|
||||
mkdir -p certbot/www
|
||||
|
||||
# Stop nginx if running
|
||||
docker-compose -f docker-compose.prod.yml stop nginx 2>/dev/null || true
|
||||
|
||||
# Get certificate
|
||||
echo "📝 Requesting SSL certificate..."
|
||||
docker-compose -f docker-compose.prod.yml run --rm certbot certonly \
|
||||
--webroot \
|
||||
--webroot-path=/var/www/certbot \
|
||||
--email $EMAIL \
|
||||
--agree-tos \
|
||||
--no-eff-email \
|
||||
--force-renewal \
|
||||
-d $DOMAIN \
|
||||
-d www.$DOMAIN
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ SSL certificate obtained successfully!"
|
||||
|
||||
# Update nginx configuration for HTTPS
|
||||
cat > nginx-ssl.conf << 'EOF'
|
||||
upstream django_app {
|
||||
server web:8000;
|
||||
}
|
||||
|
||||
# HTTP redirect to HTTPS
|
||||
server {
|
||||
listen 80;
|
||||
server_name DOMAIN_PLACEHOLDER www.DOMAIN_PLACEHOLDER;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/certbot;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
# HTTPS server
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name DOMAIN_PLACEHOLDER www.DOMAIN_PLACEHOLDER;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/DOMAIN_PLACEHOLDER/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_PLACEHOLDER/privkey.pem;
|
||||
|
||||
# SSL settings
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_session_cache shared:SSL:10m;
|
||||
ssl_session_timeout 10m;
|
||||
|
||||
client_max_body_size 20M;
|
||||
|
||||
# Security headers
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
location / {
|
||||
proxy_pass http://django_app;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $host;
|
||||
proxy_redirect off;
|
||||
proxy_buffering off;
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
alias /app/smartsoltech/staticfiles/;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
location /media/ {
|
||||
alias /app/smartsoltech/media/;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# Deny access to sensitive files
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Replace domain placeholder
|
||||
sed -i "s/DOMAIN_PLACEHOLDER/$DOMAIN/g" nginx-ssl.conf
|
||||
|
||||
echo ""
|
||||
echo "📋 SSL certificate installed!"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Replace nginx.conf with nginx-ssl.conf:"
|
||||
echo " mv nginx-ssl.conf nginx.conf"
|
||||
echo ""
|
||||
echo "2. Update .env file with your domain:"
|
||||
echo " ALLOWED_HOSTS=localhost,127.0.0.1,$DOMAIN,www.$DOMAIN"
|
||||
echo " CSRF_TRUSTED_ORIGINS=https://$DOMAIN,https://www.$DOMAIN"
|
||||
echo ""
|
||||
echo "3. Restart services:"
|
||||
echo " docker-compose -f docker-compose.prod.yml restart"
|
||||
|
||||
else
|
||||
echo "❌ Failed to obtain SSL certificate"
|
||||
exit 1
|
||||
fi
|
||||
22
tests/README.md
Normal file
22
tests/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Test Files
|
||||
|
||||
Эта папка содержит тестовые и отладочные файлы.
|
||||
|
||||
## Файлы
|
||||
|
||||
- `endpoint_test.sh` - Скрипт для тестирования API эндпоинтов
|
||||
- `real_confirmation_process.html` - Документация процесса подтверждения заявок
|
||||
- `response_*.json` - Примеры ответов API (генерируются автоматически)
|
||||
|
||||
## Использование
|
||||
|
||||
### Тестирование API
|
||||
|
||||
```bash
|
||||
chmod +x endpoint_test.sh
|
||||
./endpoint_test.sh
|
||||
```
|
||||
|
||||
## Примечание
|
||||
|
||||
Файлы `response_*.json` игнорируются git и генерируются автоматически при запуске тестов.
|
||||
Reference in New Issue
Block a user