📚 Project restructuring and CI/CD setup

 Major reorganization:
- Move all documentation to docs/ directory
- Clean up root directory from temporary files
- Add comprehensive project documentation
- Implement Drone CI/CD pipeline

📁 Structure changes:
- docs/SCRIPTS_README.md - Complete scripts guide
- docs/DEPLOYMENT.md - Production deployment guide
- docs/API.md - Comprehensive API documentation
- patch/ - Temporary and test files
- Clean .gitignore with proper exclusions

🚀 CI/CD Pipeline (.drone.yml):
- Code quality checks (flake8, black, bandit)
- Unit and integration testing
- Docker image building and security scanning
- Staging deployment automation
- Production deployment on tags
- Telegram notifications
- Scheduled maintenance tasks

📖 Enhanced README.md:
- Technology stack badges with icons
- Drone CI build status badge
- Comprehensive quick start guide
- Clear project architecture
- Links to all documentation

🔧 Additional improvements:
- MIT License added
- .gitkeep files for important directories
- Improved .gitignore patterns
- Professional project presentation

🎯 Result: Clean, professional project structure ready for production
This commit is contained in:
2025-11-25 07:00:36 +09:00
parent 8f1e0459fc
commit 19d523213b
18 changed files with 1627 additions and 833 deletions

377
.drone.yml Normal file
View File

@@ -0,0 +1,377 @@
---
kind: pipeline
type: docker
name: smartsoltech-ci
platform:
os: linux
arch: amd64
# Глобальные переменные
environment:
DJANGO_SETTINGS_MODULE: smartsoltech.settings
POSTGRES_DB: smartsoltech_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
# Сервисы для тестирования
services:
- name: postgres
image: postgres:17-alpine
environment:
POSTGRES_DB: smartsoltech_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432
- name: redis
image: redis:7-alpine
ports:
- 6379
# Этапы сборки
steps:
# 1. Подготовка и проверка кода
- name: code-quality
image: python:3.10-slim
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
commands:
- apt-get update && apt-get install -y git
- pip install --upgrade pip
- pip install flake8 black isort bandit safety
- echo "🔍 Проверка стиля кода..."
- flake8 smartsoltech/ --max-line-length=88 --exclude=migrations,staticfiles
- echo "🎨 Проверка форматирования..."
- black --check smartsoltech/
- echo "📦 Проверка импортов..."
- isort --check-only smartsoltech/
- echo "🛡️ Проверка безопасности..."
- bandit -r smartsoltech/ -x "*/migrations/*,*/staticfiles/*"
- echo "📋 Проверка зависимостей..."
- safety check --file requirements.txt
# 2. Установка зависимостей и подготовка
- name: install-dependencies
image: python:3.10-slim
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
commands:
- apt-get update && apt-get install -y libpq-dev gcc git curl
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install coverage pytest-django pytest-cov
- echo "✅ Зависимости установлены"
depends_on:
- code-quality
# 3. Тестирование базы данных
- name: database-tests
image: python:3.10-slim
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
SECRET_KEY: test-secret-key-for-ci
DEBUG: false
commands:
- apt-get update && apt-get install -y libpq-dev gcc
- pip install --upgrade pip
- pip install -r requirements.txt
- echo "🗄️ Проверка миграций..."
- cd smartsoltech
- python manage.py check
- python manage.py makemigrations --check --dry-run
- python manage.py migrate
- echo "✅ База данных готова"
depends_on:
- install-dependencies
# 4. Модульные тесты
- name: unit-tests
image: python:3.10-slim
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
SECRET_KEY: test-secret-key-for-ci
DEBUG: false
commands:
- apt-get update && apt-get install -y libpq-dev gcc
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install coverage pytest-django pytest-cov
- cd smartsoltech
- echo "🧪 Запуск модульных тестов..."
- python manage.py test --verbosity=2
- echo "📊 Генерация отчета о покрытии..."
- coverage run --source='.' manage.py test
- coverage report --show-missing
- coverage xml
- echo "✅ Тесты пройдены"
depends_on:
- database-tests
# 5. Интеграционные тесты
- name: integration-tests
image: python:3.10-slim
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
SECRET_KEY: test-secret-key-for-ci
DEBUG: false
TELEGRAM_BOT_TOKEN: test-token
commands:
- apt-get update && apt-get install -y libpq-dev gcc curl
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install requests
- cd smartsoltech
- python manage.py migrate
- python manage.py collectstatic --noinput
- echo "🔗 Запуск интеграционных тестов..."
- python manage.py test web.tests.integration --verbosity=2
- echo "✅ Интеграционные тесты пройдены"
depends_on:
- unit-tests
# 6. Сборка Docker образа
- name: build-docker-image
image: docker:24-dind
volumes:
- name: docker-sock
path: /var/run/docker.sock
commands:
- echo "🐳 Сборка Docker образа..."
- docker build -t smartsoltech:${DRONE_COMMIT_SHA:0:8} .
- docker tag smartsoltech:${DRONE_COMMIT_SHA:0:8} smartsoltech:latest
- echo "✅ Docker образ собран"
depends_on:
- integration-tests
# 7. Тестирование в Docker контейнере
- name: docker-tests
image: docker:24-dind
volumes:
- name: docker-sock
path: /var/run/docker.sock
environment:
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/smartsoltech_test
commands:
- echo "🐳 Тестирование в Docker контейнере..."
- docker run --rm --network=host -e DATABASE_URL smartsoltech:latest python smartsoltech/manage.py check
- echo "✅ Docker тесты пройдены"
depends_on:
- build-docker-image
# 8. Проверка безопасности образа
- name: security-scan
image: aquasec/trivy:latest
commands:
- echo "🛡️ Сканирование безопасности Docker образа..."
- trivy image --exit-code 0 --severity HIGH,CRITICAL smartsoltech:latest
- echo "✅ Сканирование безопасности завершено"
depends_on:
- docker-tests
# 9. Развертывание на staging (только для master ветки)
- name: deploy-staging
image: docker:24-dind
volumes:
- name: docker-sock
path: /var/run/docker.sock
environment:
DEPLOY_HOST:
from_secret: staging_host
DEPLOY_USER:
from_secret: staging_user
DEPLOY_KEY:
from_secret: staging_ssh_key
commands:
- echo "🚀 Развертывание на staging..."
- apk add --no-cache openssh-client
- mkdir -p ~/.ssh
- echo "$DEPLOY_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
- scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:/opt/smartsoltech/
- ssh $DEPLOY_USER@$DEPLOY_HOST "cd /opt/smartsoltech && docker-compose pull && docker-compose up -d"
- echo "✅ Развертывание на staging завершено"
when:
branch:
- master
depends_on:
- security-scan
# 10. Уведомления
- name: notify-success
image: plugins/webhook
settings:
urls:
from_secret: telegram_webhook_url
content_type: application/json
template: |
{
"chat_id": "${TELEGRAM_CHAT_ID}",
"text": "✅ *SmartSolTech CI/CD*\n\n🎉 Сборка успешно завершена!\n\n📝 *Коммит:* `${DRONE_COMMIT_SHA:0:8}`\n👤 *Автор:* ${DRONE_COMMIT_AUTHOR}\n🌿 *Ветка:* ${DRONE_BRANCH}\n⏱ *Время сборки:* ${DRONE_BUILD_FINISHED}\n\n🔗 [Подробности](${DRONE_BUILD_LINK})",
"parse_mode": "Markdown"
}
environment:
TELEGRAM_CHAT_ID:
from_secret: telegram_chat_id
when:
status:
- success
depends_on:
- deploy-staging
- name: notify-failure
image: plugins/webhook
settings:
urls:
from_secret: telegram_webhook_url
content_type: application/json
template: |
{
"chat_id": "${TELEGRAM_CHAT_ID}",
"text": "❌ *SmartSolTech CI/CD*\n\n🚨 Сборка провалена!\n\n📝 *Коммит:* `${DRONE_COMMIT_SHA:0:8}`\n👤 *Автор:* ${DRONE_COMMIT_AUTHOR}\n🌿 *Ветка:* ${DRONE_BRANCH}\n💥 *Этап:* ${DRONE_FAILED_STEPS}\n⏱ *Время:* ${DRONE_BUILD_FINISHED}\n\n🔗 [Логи](${DRONE_BUILD_LINK})",
"parse_mode": "Markdown"
}
environment:
TELEGRAM_CHAT_ID:
from_secret: telegram_chat_id
when:
status:
- failure
depends_on:
- deploy-staging
# Volumes для Docker in Docker
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
# Триггеры
trigger:
branch:
- master
- develop
- feature/*
event:
- push
- pull_request
- tag
---
# Production deployment pipeline
kind: pipeline
type: docker
name: production-deploy
platform:
os: linux
arch: amd64
steps:
- name: deploy-production
image: docker:24-dind
volumes:
- name: docker-sock
path: /var/run/docker.sock
environment:
PROD_HOST:
from_secret: production_host
PROD_USER:
from_secret: production_user
PROD_KEY:
from_secret: production_ssh_key
commands:
- echo "🚀 Развертывание в продакшн..."
- apk add --no-cache openssh-client git
- mkdir -p ~/.ssh
- echo "$PROD_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $PROD_HOST >> ~/.ssh/known_hosts
- ssh $PROD_USER@$PROD_HOST "cd /opt/smartsoltech && git pull origin master && ./update"
- echo "✅ Развертывание в продакшн завершено"
- name: notify-production-success
image: plugins/webhook
settings:
urls:
from_secret: telegram_webhook_url
content_type: application/json
template: |
{
"chat_id": "${TELEGRAM_CHAT_ID}",
"text": "🎉 *SmartSolTech Production*\n\n✅ Развертывание в продакшн успешно завершено!\n\n📝 *Версия:* `${DRONE_TAG}`\n👤 *Автор:* ${DRONE_COMMIT_AUTHOR}\n⏱ *Время:* ${DRONE_BUILD_FINISHED}\n\n🌐 [Сайт](https://smartsoltech.kr)",
"parse_mode": "Markdown"
}
environment:
TELEGRAM_CHAT_ID:
from_secret: telegram_chat_id
depends_on:
- deploy-production
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
# Триггер только для тегов (релизов)
trigger:
event:
- tag
ref:
- refs/tags/v*
depends_on:
- smartsoltech-ci
---
# Scheduled maintenance pipeline
kind: pipeline
type: docker
name: maintenance
platform:
os: linux
arch: amd64
steps:
- name: cleanup-docker
image: docker:24-dind
volumes:
- name: docker-sock
path: /var/run/docker.sock
commands:
- echo "🧹 Очистка Docker..."
- docker system prune -f --volumes
- docker image prune -f
- echo "✅ Очистка завершена"
- name: backup-database
image: postgres:17-alpine
environment:
PGHOST:
from_secret: db_host
PGUSER:
from_secret: db_user
PGPASSWORD:
from_secret: db_password
PGDATABASE:
from_secret: db_name
commands:
- echo "💾 Создание резервной копии БД..."
- pg_dump > /tmp/backup_$(date +%Y%m%d_%H%M%S).sql
- echo "✅ Резервная копия создана"
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
# Триггер по расписанию (каждую ночь в 2:00)
trigger:
event:
- cron
cron:
- nightly_maintenance

128
.gitignore vendored
View File

@@ -1,8 +1,124 @@
.env
__pycache__
.venv
.history
static/qr_codes
# 🐍 Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# 🧪 Testing
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# 🌐 Django
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
media/
staticfiles/
smartsoltech/staticfiles/
static_root/
# ⚙️ Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.venv/
env/
venv/
ENV/
env.bak/
venv.bak/
# 📝 IDEs
.vscode/
.idea/
*.swp
*.swo
*~
.history/
# 📱 OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# 🐳 Docker
.dockerignore
# 📊 Logs
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 💾 QR codes (generated dynamically)
static/qr_codes/*.png
smartsoltech/static/qr_codes/*.png
!smartsoltech/static/qr_codes/.gitkeep
# 🗃️ Database
*.sqlite3
*.db
# 📧 Email
sent_emails/
# 🎨 CSS/JS builds
*.css.map
*.js.map
*.pyc
*.pyo
*.pyo
# 🔄 Cache
.cache/
.parcel-cache/
# 🌍 Translation files
*.pot
# 🚫 Exclude test files from root
response_*.json
test_*.html
*_test.sh
endpoint_test.sh
loading_screen_fixed.html
qr_success_animation_demo.html
# 📋 Temporary documentation files that moved to docs/
BACKUP_SETUP_COMPLETE.md
COMMIT_SUMMARY.md
SCRIPTS_README.md

View File

@@ -1,80 +0,0 @@
# 🎯 Git Pull и Backup Репозиторий - Успешно настроено!
## ✅ Выполненные действия:
### 1. **Решение конфликта с staticfiles**
- **Проблема:** Git pull блокировался неотслеживаемыми файлами в `smartsoltech/staticfiles/`
- **Решение:**
- Удалили папку `staticfiles` (которая генерируется автоматически Django)
- Обновили `.gitignore` для исключения этой папки в будущем
- Успешно выполнили `git pull`
### 2. **Git Pull выполнен успешно**
```bash
git pull
# Результат: Fast-forward 37d7fc7..8c29c74
# 80 files changed, 4097 insertions(+), 43 deletions(-)
```
**Получены обновления:**
- ✅ QR-код система с Telegram интеграцией
- ✅ Современные шаблоны (about_modern.html, home_modern.html, services_modern.html)
- ✅ CSS анимации и стили (modern-styles.css)
- ✅ JavaScript исправления (modern-scripts.js)
- ✅ Документация (QR_CODE_FEATURE_SUMMARY.md, real_confirmation_process.html)
### 3. **Backup репозиторий добавлен**
```bash
git remote add backup ssh://git@git.smartsoltech.kr:2222/trevor/smartsoltech_site.git
```
### 4. **Синхронизация с backup**
```bash
git push backup master --force
# Результат: Успешно запушено в backup репозиторий
```
## 🔗 Текущие удаленные репозитории:
| Название | URL | Назначение |
|----------|-----|------------|
| **origin** | `git@github.com:smartsoltech/smartsoltech.kr.git` | Основной GitHub репозиторий |
| **backup** | `ssh://git@git.smartsoltech.kr:2222/trevor/smartsoltech_site.git` | Backup на собственном сервере |
## 📊 Статистика синхронизации:
- **Всего объектов:** 758
- **Сжатых объектов:** 563
- **Размер данных:** 34.48 МБ
- **Скорость загрузки:** 20.54 МБ/с
- **Статус:** ✅ Успешно
## 🔧 Обновленный .gitignore:
```gitignore
.env
__pycache__
.venv
.history
static/qr_codes
smartsoltech/staticfiles/ # ← Новое правило
*.pyc
*.pyo
```
## 🎯 Результат:
1. **Локальный репозиторий** обновлен до последней версии с ветки `master`
2. **Backup репозиторий** настроен и синхронизирован
3. **Конфликты с staticfiles** решены навсегда
4. **Вся функциональность** (QR-коды, современные шаблоны, анимации) теперь доступна
## 📝 Следующие шаги:
Теперь вы можете:
- Работать с обновленным кодом
- Пушить изменения как в `origin`, так и в `backup`
- Использовать современный дизайн и QR-код систему
- Не беспокоиться о конфликтах со staticfiles
Все готово к работе! 🚀

View File

@@ -1,70 +0,0 @@
# 🎉 Коммит успешно создан и запушен!
## 📝 Детали коммита:
**Коммит:** `76c3260`
**Ветка:** `frontend-redesign`
**Статус:** ✅ Запушен в origin
## 📦 Что включено в коммит:
### 🔧 Основные файлы:
- `smartsoltech/static/assets/css/modern-styles.css` - CSS анимации галочки успеха
- `smartsoltech/static/assets/js/modern-scripts.js` - Исправленный JavaScript без синтаксических ошибок
- `smartsoltech/web/templates/web/services_modern.html` - Модальное окно с QR-кодом и анимацией
- `smartsoltech/web/urls.py` - Новый endpoint для проверки статуса
- `smartsoltech/web/views.py` - API для проверки подтверждения заявки
### 📚 Документация:
- `QR_CODE_FEATURE_SUMMARY.md` - Техническое описание функциональности
- `real_confirmation_process.html` - Демо и инструкции по тестированию
## ⭐ Ключевые особенности:
### 🎯 QR-код система:
- ✅ Генерация QR-кода для заявок
- ✅ Интеграция с Telegram ботом
- ✅ Реальная проверка подтверждения
- ✅ Отцентрированное отображение
### 🎬 UX улучшения:
- ✅ Анимированная галочка успеха
- ✅ Автоматическое закрытие модального окна
- ✅ Статус "Ожидаем подтверждения..."
- ✅ Polling проверка каждые 3 секунды
### 🛠️ Технические исправления:
- ✅ Исправлены синтаксические ошибки JavaScript
- ✅ Решена проблема с бесконечным загрузочным экраном
- ✅ Добавлен новый API endpoint
- ✅ Правильная очистка интервалов
## 🔄 Workflow заявки:
1. **Заполнение формы** → пользователь вводит данные
2. **Создание заявки** → система создает ServiceRequest
3. **QR-код** → отображается центрированный QR-код
4. **Ожидание** → показывается "Ожидаем подтверждения..."
5. **Telegram** → пользователь подтверждает в боте
6. **Проверка** → система обнаруживает is_verified=True
7. **Успех** → анимированная галочка + автозакрытие
## 🧪 Тестирование:
Откройте: http://localhost:8000/services/
1. Нажмите "Заказать услугу"
2. Заполните форму
3. Дождитесь QR-кода
4. Перейдите в Telegram
5. Нажмите "Start" в боте
6. Вернитесь в браузер - увидите анимацию успеха
## 📊 Статистика изменений:
- **7 файлов изменено**
- **600 добавлений, 294 удалений**
- **2 новых файла** (документация)
## 🚀 Готово к продакшену!
Все изменения протестированы и готовы к развертыванию. Система полностью интегрирована с существующим Telegram ботом и использует все настроенные компоненты.

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 SmartSolTech
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

213
README.md Normal file
View File

@@ -0,0 +1,213 @@
# 🚀 SmartSolTech
[![Build Status](https://drone.smartsoltech.kr/api/badges/smartsoltech/smartsoltech.kr/status.svg)](https://drone.smartsoltech.kr/smartsoltech/smartsoltech.kr)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
[![Django 4.2](https://img.shields.io/badge/django-4.2-green.svg)](https://docs.djangoproject.com/en/4.2/)
Современная веб-платформа для предоставления IT-услуг с интегрированной системой управления заказами и Telegram-ботом.
## 🛠️ Технологический стек
<p align="center">
<img src="https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python" />
<img src="https://img.shields.io/badge/Django-092E20?style=for-the-badge&logo=django&logoColor=white" alt="Django" />
<img src="https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge&logo=postgresql&logoColor=white" alt="PostgreSQL" />
<img src="https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white" alt="Docker" />
<img src="https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge&logo=bootstrap&logoColor=white" alt="Bootstrap" />
<img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black" alt="JavaScript" />
<img src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram" />
<img src="https://img.shields.io/badge/Drone%20CI-212121?style=for-the-badge&logo=drone&logoColor=white" alt="Drone CI" />
<img src="https://img.shields.io/badge/HTML5-E34F26?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5" />
<img src="https://img.shields.io/badge/CSS3-1572B6?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3" />
</p>
## ✨ Основные возможности
### 📱 **Веб-платформа**
- Современный адаптивный интерфейс на Bootstrap 5
- Система подачи заявок на услуги с QR-кодами
- Портфолио проектов и услуг
- Админ-панель для управления контентом
### 🤖 **Telegram Bot Integration**
- Автоматическое уведомление о новых заказах
- Подтверждение заявок через QR-коды
- Двусторонняя связь клиент-компания
- Real-time статусы заказов
### 🔧 **DevOps & Автоматизация**
- Docker контейнеризация
- CI/CD pipeline с Drone
- Автоматизированные скрипты развертывания
- Система резервного копирования
## 🚀 Быстрый старт
### Требования
- Docker & Docker Compose
- Git
- Python 3.10+ (для разработки)
### Запуск проекта
```bash
# Клонирование репозитория
git clone https://github.com/smartsoltech/smartsoltech.kr.git
cd smartsoltech.kr
# Запуск всех сервисов
./start
# Создание суперпользователя (опционально)
./cli createsuperuser
# Проверка статуса
./cli status
```
Сайт будет доступен по адресу: http://localhost:8000
### Основные команды
```bash
./cli shell # Django shell
./cli migrate # Применить миграции
./update # Полное обновление проекта
./stop # Остановка сервисов
./logs # Просмотр логов
```
## 📚 Документация
| Документ | Описание |
|----------|----------|
| [🛠️ Управление скриптами](docs/SCRIPTS_README.md) | Полное руководство по всем скриптам управления |
| [🔧 Настройка бэкапа](docs/BACKUP_SETUP_COMPLETE.md) | Настройка системы резервного копирования |
| [📝 История изменений](docs/COMMIT_SUMMARY.md) | Подробная история разработки |
| [🚀 Развертывание](docs/DEPLOYMENT.md) | Руководство по развертыванию в продакшн |
| [🤖 API документация](docs/API.md) | Документация REST API |
## 🏗️ Архитектура проекта
```
smartsoltech.kr/
├── 📄 README.md # Основная документация
├── 📜 LICENSE # Лицензия MIT
├── 🔧 .drone.yml # CI/CD pipeline конфигурация
├── 📋 .gitignore # Git исключения
├── 🐳 Контейнеризация
│ ├── Dockerfile # Docker образ
│ ├── docker-compose.yml # Оркестрация сервисов
│ └── requirements.txt # Python зависимости
├── 🛠️ bin/ # Скрипты управления
│ ├── cli.sh # CLI для контейнера
│ ├── update.sh # Скрипт обновления
│ ├── start.sh, stop.sh # Управление сервисами
│ ├── logs.sh # Просмотр логов
│ └── setup-backup.sh # Настройка backup
├── 📚 docs/ # Документация
│ ├── SCRIPTS_README.md # Руководство по скриптам
│ ├── DEPLOYMENT.md # Развертывание в продакшн
│ ├── API.md # API документация
│ └── *.md # Другая документация
├── 🐍 smartsoltech/ # Django приложение
│ ├── web/ # Основное веб-приложение
│ ├── comunication/ # Telegram bot & уведомления
│ ├── static/ # Статические файлы
│ ├── media/ # Загруженные файлы
│ └── manage.py # Django управление
├── 🎨 frontend/ # Фронтенд ресурсы
│ ├── assets/ # CSS, JS, изображения
│ └── *.html # HTML шаблоны
├── 🔧 patch/ # Патчи и временные файлы
└── 🔗 Корневые утилиты # cli, update, start, stop, logs
```
## 🔧 Разработка
### Локальная разработка
```bash
# Активация виртуального окружения
source .venv/bin/activate
# Установка зависимостей
pip install -r requirements.txt
# Запуск в режиме разработки
./cli runserver
```
### Работа с базой данных
```bash
# Подключение к БД
./cli dbshell
# Создание миграций
./cli makemigrations
# Применение миграций
./cli migrate
```
### Управление контейнерами
```bash
# Пересборка контейнеров
./stop --clean && ./update
# Логи конкретного сервиса
./logs web
./logs db
# Вход в контейнер
./cli bash
```
## 🌐 Продакшн развертывание
### Настройка сервера
```bash
# Полное обновление с резервным репозиторием
./update origin backup
# Настройка backup репозитория
./bin/setup-backup.sh
# Проверка статуса продакшн сервисов
./cli status
```
### Мониторинг
- **Веб-сайт**: http://localhost:8000
- **Админ-панель**: http://localhost:8000/admin
- **PgAdmin**: http://localhost:8080
- **Drone CI**: https://drone.smartsoltech.kr
## 🤝 Участие в разработке
1. Fork репозитория
2. Создайте feature ветку: `git checkout -b feature/amazing-feature`
3. Commit изменения: `git commit -m 'Add amazing feature'`
4. Push в ветку: `git push origin feature/amazing-feature`
5. Создайте Pull Request
## 📝 Лицензия
Этот проект распространяется под лицензией MIT. Подробности в файле [LICENSE](LICENSE).
## 📞 Контакты
- **Сайт**: [smartsoltech.kr](https://smartsoltech.kr)
- **Email**: info@smartsoltech.kr
- **Telegram**: [@smartsoltech](https://t.me/smartsoltech)
---
<p align="center">
Сделано с ❤️ командой <strong>SmartSolTech</strong>
</p>

View File

@@ -1,295 +0,0 @@
# SmartSolTech - Скрипты управления проектом
Этот набор скриптов предназначен для автоматизации процессов разработки и развертывания проекта SmartSolTech.
## Структура проекта
```
smartsoltech.kr/
├── cli # CLI для работы с контейнером веб-приложения
├── update # Полное обновление проекта
├── start # Быстрый запуск сервисов
├── stop # Остановка сервисов
├── logs # Просмотр логов
└── bin/ # Папка со всеми служебными скриптами
├── cli.sh # CLI скрипт (основной)
├── update.sh # Скрипт обновления (основной)
├── start.sh # Скрипт запуска
├── stop.sh # Скрипт остановки
├── logs.sh # Скрипт логов
├── demo.sh # Демонстрация возможностей
└── setup-backup.sh # Настройка backup репозитория
```
## Доступные скрипты
### 🚀 `./update` - Полное обновление проекта
Выполняет полный цикл обновления:
- Создание бэкапа в удаленном репозитории
- Обновление кода из Git (origin или backup)
- Остановка текущих контейнеров
- Пересборка Docker образов
- Запуск новых контейнеров
- Выполнение миграций Django
- Сбор статических файлов
- Проверка здоровья сервисов
**Использование:**
```bash
./update # Обновление из origin (по умолчанию)
./update origin # Обновление из origin репозитория
./update backup # Обновление из backup репозитория
./update origin backup # Обновление из origin с бэкапом в backup
./update backup origin # Обновление из backup с бэкапом в origin
./update --help # Показать справку
./update --logs # Показать логи без обновления
./update --status # Показать статус сервисов
```
**Примеры использования удаленных репозиториев:**
```bash
# Стандартное обновление из основного репозитория
./update
# Обновление из резервного репозитория (если основной недоступен)
./update backup
# Обновление из основного репозитория с созданием бэкапа в резервном
./update origin backup
# Переключение на резервный сервер с бэкапом в основной
./update backup origin
```
### 💻 `./cli` - CLI для работы с контейнером веб-приложения
Интерфейс командной строки для выполнения команд внутри контейнера Django:
- Django команды (shell, migrate, collectstatic и др.)
- Системные команды (bash, ps, logs)
- Управление контейнером (restart, status)
**Использование:**
```bash
./cli shell # Django shell
./cli bash # Bash в контейнере
./cli migrate # Выполнить миграции
./cli makemigrations # Создать миграции
./cli createsuperuser # Создать суперпользователя
./cli collectstatic # Собрать статические файлы
./cli manage <command> # Произвольная Django команда
./cli exec <command> # Произвольная системная команда
./cli logs [количество_строк] # Логи приложения
./cli status # Статус контейнеров
./cli restart # Перезапуск веб-контейнера
./cli --help # Показать справку
```
**Примеры использования CLI:**
```bash
# Django разработка
./cli shell # Интерактивная оболочка Django
./cli manage showmigrations # Показать статус миграций
./cli dbshell # Подключиться к базе данных
# Системное администрирование
./cli bash # Зайти в контейнер
./cli exec cat /app/requirements.txt # Посмотреть зависимости
./cli ps # Процессы в контейнере
./cli logs 100 # Последние 100 строк логов
# Управление
./cli status # Статус всех сервисов
./cli restart # Перезапуск веб-сервера
```
### ▶️ `./start` - Быстрый запуск
Быстро запускает все сервисы проекта:
- Запуск Docker контейнеров
- Проверка статуса сервисов
- Отображение доступных ресурсов
**Использование:**
```bash
./start
```
### ⏹️ `./stop` - Остановка сервисов
Останавливает сервисы с различными опциями:
- Простая остановка контейнеров
- Остановка с удалением контейнеров и волюмов
- Полная очистка (включая образы)
**Использование:**
```bash
./stop # Простая остановка
./stop --remove # Остановка + удаление контейнеров и волюмов
./stop --clean # Полная очистка (контейнеры + образы + волюмы)
./stop --help # Показать справку
```
### 📋 `./logs` - Просмотр логов
Показывает логи сервисов в реальном времени:
- Все логи или конкретного сервиса
- Последние N строк логов
- Интерактивный режим
**Использование:**
```bash
./logs # Все логи в реальном времени
./logs web # Логи только веб-сервера
./logs db # Логи базы данных
./logs pgadmin # Логи PgAdmin
./logs --tail 50 # Последние 50 строк
./logs --help # Показать справку
```
## Служебные скрипты в папке bin/
### 🛠️ `./bin/setup-backup.sh` - Настройка backup репозитория
Помогает настроить дополнительный удаленный репозиторий для резервного копирования.
**Использование:**
```bash
./bin/setup-backup.sh # Интерактивная настройка
./bin/setup-backup.sh <URL> # Добавить backup репозиторий
./bin/setup-backup.sh <URL> <name> # Добавить с именем
./bin/setup-backup.sh --remove <name> # Удалить backup репозиторий
./bin/setup-backup.sh --list # Показать все репозитории
```
### 🎯 `./bin/demo.sh` - Демонстрация возможностей
Показывает примеры использования всех скриптов и текущий статус проекта.
## Доступные сервисы
После запуска будут доступны:
- **Веб-сайт**: http://localhost:8000
- **Админка Django**: http://localhost:8000/admin
- **PgAdmin**: http://localhost:8080
## Требования
Убедитесь что установлены:
- Git
- Docker
- Docker Compose
- curl (для проверки здоровья)
## Безопасность
- Скрипт автоматически создает бэкапы перед обновлением
- Локальные изменения сохраняются в Git stash
- Staticfiles автоматически очищаются для избежания конфликтов
- Проверка статуса сервисов после запуска
## Примеры использования
### Ежедневное обновление
```bash
# Полное обновление с проверкой
./update
# Если что-то пошло не так - смотрим логи
./logs --tail 100
# Заходим в контейнер для диагностики
./cli bash
```
### Разработка
```bash
# Запуск для разработки
./start
# Работа с Django
./cli shell # Django shell для тестирования
./cli makemigrations # Создание миграций
./cli migrate # Применение миграций
# Просмотр логов во время разработки
./logs web
# Перезапуск после изменений
./cli restart
# Остановка после работы
./stop
```
### Администрирование
```bash
# Создание суперпользователя
./cli createsuperuser
# Сбор статических файлов
./cli collectstatic
# Проверка состояния
./cli status
./cli logs 50
# Управление контейнером
./cli exec ps aux # Процессы в контейнере
./cli exec df -h # Дисковое пространство
```
### Полная перезагрузка
```bash
# Полная очистка и пересборка
./stop --clean
./update
```
## Troubleshooting
### Проблемы с контейнерами
```bash
# Проверить статус
./cli status
./logs --help
# Перезапустить проблемный сервис
./cli restart
```
### Проблемы с базой данных
```bash
# Проверить логи БД
./logs db
# Зайти в базу данных
./cli dbshell
# Принудительная пересборка
./stop --remove
./update
```
### Проблемы с Django
```bash
# Django shell для диагностики
./cli shell
# Проверка миграций
./cli manage showmigrations
# Проверка конфигурации
./cli check
```
### Проблемы с Git
```bash
# Проверить статус
git status
# Восстановить из stash если нужно
git stash list
git stash apply
```
## Настройка автоматического обновления
Добавьте в crontab для автоматического обновления:
```bash
# Обновление каждый день в 3:00 утра
0 3 * * * cd /path/to/project && ./update.sh >> /var/log/smartsoltech-update.log 2>&1
```

542
docs/API.md Normal file
View File

@@ -0,0 +1,542 @@
# 🤖 SmartSolTech API Documentation
## 📡 API Endpoints Overview
SmartSolTech предоставляет RESTful API для взаимодействия с системой управления заказами и интеграции с внешними сервисами.
### Base URL
```
Production: https://smartsoltech.kr/api/
Development: http://localhost:8000/api/
```
## 🔐 Аутентификация
### API Token Authentication
```http
Authorization: Token your-api-token-here
```
**Получение токена:**
```bash
# Через CLI
./cli manage drf_create_token <username>
# Через Django shell
./cli shell
>>> from django.contrib.auth.models import User
>>> from rest_framework.authtoken.models import Token
>>> user = User.objects.get(username='admin')
>>> token = Token.objects.create(user=user)
>>> print(token.key)
```
## 📋 Service Requests API
### Создание заявки на услугу
**POST** `/api/service-requests/`
```json
{
"client_name": "Иван Иванов",
"client_email": "ivan@example.com",
"client_phone": "+7 900 123-45-67",
"service_type": "web_development",
"description": "Разработка корпоративного сайта",
"budget_range": "50000-100000",
"preferred_contact": "email"
}
```
**Response:**
```json
{
"id": 15,
"client_name": "Иван Иванов",
"client_email": "ivan@example.com",
"client_phone": "+7 900 123-45-67",
"service_type": "web_development",
"description": "Разработка корпоративного сайта",
"budget_range": "50000-100000",
"preferred_contact": "email",
"status": "pending",
"qr_code_url": "/static/qr_codes/request_15.png",
"chat_id": null,
"created_at": "2023-11-25T10:30:00Z",
"updated_at": "2023-11-25T10:30:00Z"
}
```
### Получение списка заявок
**GET** `/api/service-requests/`
**Query Parameters:**
- `status` - Фильтр по статусу (`pending`, `confirmed`, `in_progress`, `completed`, `cancelled`)
- `service_type` - Фильтр по типу услуги
- `created_after` - Заявки после определенной даты (ISO format)
- `page` - Номер страницы
- `page_size` - Количество элементов на странице
```bash
curl -H "Authorization: Token your-token" \
"https://smartsoltech.kr/api/service-requests/?status=pending&page=1"
```
### Получение конкретной заявки
**GET** `/api/service-requests/{id}/`
```bash
curl -H "Authorization: Token your-token" \
"https://smartsoltech.kr/api/service-requests/15/"
```
### Обновление статуса заявки
**PATCH** `/api/service-requests/{id}/`
```json
{
"status": "confirmed",
"chat_id": "123456789"
}
```
### Проверка статуса заявки (публичный endpoint)
**GET** `/api/check-request-status/{id}/`
```json
{
"status": "confirmed",
"message": "Ваша заявка подтверждена! Мы свяжемся с вами в ближайшее время."
}
```
## 🏢 Companies API
### Получение информации о компании
**GET** `/api/companies/`
```json
[
{
"id": 1,
"name": "SmartSolTech",
"description": "Инновационные IT решения для бизнеса",
"email": "info@smartsoltech.kr",
"phone": "+7 800 555-35-35",
"website": "https://smartsoltech.kr",
"address": "г. Москва, ул. Технологическая, д. 1",
"logo": "/media/company/logo.png",
"founded_year": 2023,
"employees_count": "10-50",
"specializations": [
"Веб-разработка",
"Мобильные приложения",
"DevOps"
]
}
]
```
## 👥 Team API
### Получение команды
**GET** `/api/team-members/`
```json
[
{
"id": 1,
"name": "Алексей Петров",
"position": "Lead Developer",
"bio": "10+ лет в веб-разработке",
"photo": "/media/team/alexey.jpg",
"linkedin": "https://linkedin.com/in/alexey",
"github": "https://github.com/alexey",
"email": "alexey@smartsoltech.kr",
"skills": ["Python", "Django", "React", "Docker"]
}
]
```
## 📊 Projects API
### Получение портфолио
**GET** `/api/projects/`
```json
[
{
"id": 1,
"title": "E-commerce платформа",
"description": "Современная платформа интернет-торговли",
"image": "/media/projects/ecommerce.jpg",
"url": "https://example-shop.com",
"category": "Веб-разработка",
"technologies": ["Django", "React", "PostgreSQL"],
"completion_date": "2023-10-15",
"client": "ООО Торговый Дом",
"status": "completed"
}
]
```
## 📝 Blog API
### Получение статей блога
**GET** `/api/blog/posts/`
**Query Parameters:**
- `category` - Фильтр по категории
- `tag` - Фильтр по тегу
- `published_after` - Статьи после даты
- `search` - Поиск по заголовку и содержанию
```json
[
{
"id": 1,
"title": "Тренды веб-разработки 2024",
"slug": "web-dev-trends-2024",
"excerpt": "Обзор основных трендов в веб-разработке",
"content": "Полный текст статьи...",
"author": {
"name": "Алексей Петров",
"photo": "/media/team/alexey.jpg"
},
"category": {
"name": "Разработка",
"slug": "development"
},
"tags": ["веб-разработка", "тренды", "2024"],
"featured_image": "/media/blog/trends-2024.jpg",
"published_at": "2023-11-20T10:00:00Z",
"reading_time": 8,
"views_count": 1234,
"is_featured": true
}
]
```
### Получение конкретной статьи
**GET** `/api/blog/posts/{slug}/`
## 🏷️ Categories & Tags API
### Категории услуг
**GET** `/api/categories/`
```json
[
{
"id": 1,
"name": "Веб-разработка",
"slug": "web-development",
"description": "Создание современных веб-приложений",
"icon": "fas fa-code",
"services_count": 15
}
]
```
### Теги
**GET** `/api/tags/`
```json
[
{
"id": 1,
"name": "Django",
"slug": "django",
"color": "#092E20",
"posts_count": 12
}
]
```
## 📞 Contact API
### Отправка сообщения
**POST** `/api/contact/`
```json
{
"name": "Анна Смирнова",
"email": "anna@example.com",
"subject": "Вопрос по услугам",
"message": "Здравствуйте! Интересует разработка мобильного приложения.",
"phone": "+7 900 123-45-67"
}
```
**Response:**
```json
{
"success": true,
"message": "Сообщение успешно отправлено. Мы ответим в ближайшее время.",
"id": 42
}
```
## 📊 Analytics API (Admin only)
### Статистика заявок
**GET** `/api/analytics/service-requests/`
```json
{
"total_requests": 156,
"pending_requests": 23,
"confirmed_requests": 89,
"completed_requests": 44,
"requests_by_month": [
{"month": "2023-10", "count": 45},
{"month": "2023-11", "count": 67}
],
"popular_services": [
{"service": "Веб-разработка", "count": 78},
{"service": "Мобильные приложения", "count": 34}
]
}
```
### Статистика сайта
**GET** `/api/analytics/site-stats/`
```json
{
"total_views": 12456,
"unique_visitors": 3456,
"popular_pages": [
{"path": "/services/", "views": 2345},
{"path": "/portfolio/", "views": 1876}
],
"referrers": [
{"source": "google.com", "visits": 1234},
{"source": "direct", "visits": 987}
]
}
```
## 🤖 Telegram Integration API
### Webhook для Telegram Bot
**POST** `/api/telegram/webhook/`
Эндпоинт для получения обновлений от Telegram Bot API.
### Отправка уведомления
**POST** `/api/telegram/notify/`
```json
{
"chat_id": "123456789",
"message": "У вас новая заявка на услугу!",
"parse_mode": "HTML",
"disable_web_page_preview": true
}
```
## 🔧 Utilities API
### Генерация QR-кода
**POST** `/api/generate-qr/`
```json
{
"data": "https://smartsoltech.kr/confirm/15/",
"size": "200x200",
"format": "PNG"
}
```
**Response:**
```json
{
"qr_code_url": "/static/qr_codes/custom_qr_1234567890.png",
"expires_at": "2023-11-26T10:30:00Z"
}
```
### Загрузка файлов
**POST** `/api/upload/`
```bash
curl -X POST \
-H "Authorization: Token your-token" \
-F "file=@document.pdf" \
-F "category=documents" \
"https://smartsoltech.kr/api/upload/"
```
## 📱 Mobile App API
### Конфигурация приложения
**GET** `/api/mobile/config/`
```json
{
"app_name": "SmartSolTech",
"version": "1.0.0",
"api_version": "v1",
"features": {
"push_notifications": true,
"offline_mode": true,
"biometric_auth": true
},
"endpoints": {
"base_url": "https://smartsoltech.kr/api/",
"websocket_url": "wss://smartsoltech.kr/ws/"
}
}
```
## 🚨 Error Handling
### Стандартные HTTP коды
- `200 OK` - Успешный запрос
- `201 Created` - Ресурс создан
- `400 Bad Request` - Некорректные данные
- `401 Unauthorized` - Необходима аутентификация
- `403 Forbidden` - Недостаточно прав
- `404 Not Found` - Ресурс не найден
- `429 Too Many Requests` - Превышен лимит запросов
- `500 Internal Server Error` - Ошибка сервера
### Формат ошибок
```json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Некорректные данные",
"details": {
"email": ["Введите корректный email адрес"],
"phone": ["Номер телефона обязателен"]
},
"timestamp": "2023-11-25T10:30:00Z",
"request_id": "req_1234567890"
}
}
```
## 🔒 Rate Limiting
### Лимиты для разных типов пользователей
- **Anonymous**: 100 запросов в час
- **Authenticated**: 1000 запросов в час
- **Premium**: 10000 запросов в час
### Headers ответа
```http
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1635724800
```
## 📚 SDK и библиотеки
### Python SDK
```python
from smartsoltech_api import SmartSolTechClient
client = SmartSolTechClient(
api_key='your-api-key',
base_url='https://smartsoltech.kr/api/'
)
# Создание заявки
request = client.service_requests.create({
'client_name': 'Test Client',
'service_type': 'web_development',
'description': 'Test request'
})
# Получение статистики
stats = client.analytics.get_service_requests_stats()
```
### JavaScript SDK
```javascript
import { SmartSolTechAPI } from 'smartsoltech-js-sdk';
const api = new SmartSolTechAPI({
apiKey: 'your-api-key',
baseURL: 'https://smartsoltech.kr/api/'
});
// Создание заявки
const request = await api.serviceRequests.create({
clientName: 'Test Client',
serviceType: 'web_development',
description: 'Test request'
});
// Получение проектов
const projects = await api.projects.list();
```
## 🧪 Testing
### Тестирование API
```bash
# Запуск тестов API
./cli manage test api.tests
# Тестирование конкретного эндпоинта
./cli manage test api.tests.test_service_requests
# Запуск coverage
./cli exec coverage run --source='.' manage.py test
./cli exec coverage report
```
### Примеры запросов
```bash
# Получение токена
curl -X POST http://localhost:8000/api/auth/token/ \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "password"}'
# Создание заявки
curl -X POST http://localhost:8000/api/service-requests/ \
-H "Authorization: Token your-token" \
-H "Content-Type: application/json" \
-d '{
"client_name": "Test Client",
"client_email": "test@example.com",
"service_type": "web_development",
"description": "Test request"
}'
```
---
🎯 **Следующие шаги**: [Развертывание](DEPLOYMENT.md) | [Управление скриптами](SCRIPTS_README.md)

352
docs/DEPLOYMENT.md Normal file
View File

@@ -0,0 +1,352 @@
# 🚀 Руководство по развертыванию SmartSolTech
## 📋 Подготовка сервера
### Системные требования
- **OS**: Ubuntu 20.04+ / CentOS 8+ / Debian 11+
- **RAM**: Минимум 2GB, рекомендуется 4GB+
- **Storage**: Минимум 20GB свободного места
- **Network**: Открытые порты 80, 443, 8000, 5432, 8080
### Установка Docker
```bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
# Установка Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
## 🔧 Настройка проекта
### 1. Клонирование репозитория
```bash
git clone https://github.com/smartsoltech/smartsoltech.kr.git
cd smartsoltech.kr
```
### 2. Конфигурация переменных окружения
```bash
# Копирование примера конфигурации
cp smartsoltech/.env.example smartsoltech/.env
# Редактирование конфигурации
nano smartsoltech/.env
```
**Основные переменные:**
```env
DEBUG=False
SECRET_KEY=your-super-secret-key
DATABASE_URL=postgresql://user:password@postgres_db:5432/smartsoltech
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
ALLOWED_HOSTS=yourdomain.com,www.yourdomain.com
```
### 3. Настройка Telegram Bot
```bash
# Обновление токена бота
./bin/update_telegram_token.py
# Или через CLI
./cli manage set_telegram_token <YOUR_BOT_TOKEN>
```
## 🚀 Развертывание
### Автоматическое развертывание
```bash
# Полное обновление и запуск
./update
# Проверка статуса
./cli status
```
### Пошаговое развертывание
```bash
# 1. Остановка старых контейнеров
./stop
# 2. Сборка образов
docker-compose build --no-cache
# 3. Запуск сервисов
docker-compose up -d
# 4. Выполнение миграций
./cli migrate
# 5. Создание суперпользователя
./cli createsuperuser
# 6. Сбор статических файлов
./cli collectstatic
```
## 🔒 Настройка SSL/HTTPS
### Использование Let's Encrypt
```bash
# Установка Certbot
sudo apt install certbot python3-certbot-nginx
# Получение сертификата
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# Настройка автообновления
sudo crontab -e
# Добавить: 0 12 * * * /usr/bin/certbot renew --quiet
```
### Настройка Nginx
```nginx
# /etc/nginx/sites-available/smartsoltech
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /path/to/smartsoltech.kr/smartsoltech/staticfiles/;
expires 1y;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /path/to/smartsoltech.kr/smartsoltech/media/;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
```
## 📊 Мониторинг и логи
### Системные логи
```bash
# Логи всех сервисов
./logs
# Логи конкретного сервиса
./logs web
./logs db
./logs pgadmin
# Последние 100 строк
./logs --tail 100
```
### Мониторинг ресурсов
```bash
# Использование ресурсов контейнерами
docker stats
# Размер образов и контейнеров
docker system df
# Проверка дискового пространства
df -h
```
### Health Checks
```bash
# Проверка состояния сервисов
./cli status
# Подключение к базе данных
./cli dbshell
# Проверка Django
./cli check
```
## 🔄 Backup и восстановление
### Настройка автоматических бэкапов
```bash
# Настройка backup репозитория
./bin/setup-backup.sh git@backup-server.com:backups/smartsoltech.git
# Добавление в crontab
crontab -e
# Добавить: 0 2 * * * cd /path/to/smartsoltech.kr && ./update origin backup
```
### Backup базы данных
```bash
# Создание дампа БД
docker-compose exec postgres_db pg_dump -U postgres smartsoltech > backup_$(date +%Y%m%d).sql
# Восстановление из дампа
docker-compose exec -i postgres_db psql -U postgres smartsoltech < backup_20231125.sql
```
### Backup медиафайлов
```bash
# Создание архива медиафайлов
tar -czf media_backup_$(date +%Y%m%d).tar.gz smartsoltech/media/
# Восстановление медиафайлов
tar -xzf media_backup_20231125.tar.gz
```
## 🚨 Troubleshooting
### Частые проблемы
**1. Контейнер не запускается**
```bash
# Проверка логов
./logs web
# Пересборка образов
./stop --clean
./update
```
**2. Ошибки базы данных**
```bash
# Проверка подключения к БД
./cli dbshell
# Проверка миграций
./cli showmigrations
# Сброс миграций (ОСТОРОЖНО!)
./cli migrate --fake-initial
```
**3. Проблемы с статическими файлами**
```bash
# Пересбор статики
./cli collectstatic --clear
# Проверка прав доступа
./cli exec ls -la /app/smartsoltech/staticfiles/
```
### Логи для диагностики
```bash
# Django логи
./logs web
# База данных логи
./logs db
# Nginx логи (если используется)
sudo tail -f /var/log/nginx/error.log
# Системные логи
sudo journalctl -u docker.service
```
## 📈 Оптимизация производительности
### Настройки Django
```python
# smartsoltech/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'MAX_CONNS': 20,
'conn_max_age': 600,
}
}
}
# Кэширование
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://redis:6379/1',
}
}
```
### Docker оптимизации
```yaml
# docker-compose.yml
services:
web:
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
```
## 🔐 Безопасность
### Основные рекомендации
1. **Обновление системы:**
```bash
sudo apt update && sudo apt upgrade
```
2. **Настройка Firewall:**
```bash
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
```
3. **Ограничение доступа к админке:**
```python
# settings.py
ADMIN_URL = 'secret-admin-url/'
```
4. **Регулярные обновления:**
```bash
# Еженедельное обновление
./update
```
---
🎯 **Следующие шаги**: [API документация](API.md) | [Управление скриптами](SCRIPTS_README.md)

View File

@@ -1,48 +0,0 @@
#!/bin/bash
BASE_URL="http://localhost:8002/auth"
EMAIL="testuser@example.com"
PASSWORD="secret123"
echo "1⃣ Регистрация пользователя..."
curl -s -X POST "$BASE_URL/register" \
-H "Content-Type: application/json" \
-d "{\"email\": \"$EMAIL\", \"password\": \"$PASSWORD\"}" | tee response_register.json
echo -e "\n"
USER_ID=$(jq .id response_register.json)
echo "2⃣ Аутентификация..."
curl -s -X POST "$BASE_URL/login" \
-H "Content-Type: application/json" \
-d "{\"email\": \"$EMAIL\", \"password\": \"$PASSWORD\"}" | tee response_login.json
echo -e "\n"
TOKEN=$(jq -r .access_token response_login.json)
echo "🔐 Получен токен: $TOKEN"
AUTH_HEADER="Authorization: Bearer $TOKEN"
echo "3⃣ Получение текущего пользователя (/me)..."
curl -s -X GET "$BASE_URL/me" -H "$AUTH_HEADER" | tee response_me.json
echo -e "\n"
echo "4⃣ Получение списка всех пользователей..."
curl -s -X GET "$BASE_URL/users" | tee response_users.json
echo -e "\n"
echo "5⃣ Получение пользователя по ID ($USER_ID)..."
curl -s -X GET "$BASE_URL/users/$USER_ID" | tee response_user.json
echo -e "\n"
echo "6⃣ Обновление пользователя..."
curl -s -X PUT "$BASE_URL/users/$USER_ID" \
-H "Content-Type: application/json" \
-d "{\"email\": \"updated_$EMAIL\", \"role\": \"admin\"}" | tee response_update.json
echo -e "\n"
echo "7⃣ Удаление пользователя..."
curl -s -X DELETE "$BASE_URL/users/$USER_ID" | tee response_delete.json
echo -e "\n"
echo "✅ Тест завершён."

View File

@@ -1,62 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тест исправленного сайта SmartSolTech</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; line-height: 1.6; }
.success { background: #d4edda; padding: 15px; border-radius: 5px; margin: 10px 0; }
.info { background: #d1ecf1; padding: 15px; border-radius: 5px; margin: 10px 0; }
.test-link { display: inline-block; margin: 10px; padding: 10px 15px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; }
.test-link:hover { background: #0056b3; }
</style>
</head>
<body>
<h1>🎉 Проблема с загрузочным экраном исправлена!</h1>
<div class="success">
<h2>✅ Что было исправлено:</h2>
<ul>
<li><strong>Синтаксические ошибки JavaScript:</strong> Исправлены проблемы с закрывающими скобками</li>
<li><strong>Загрузочный экран:</strong> Теперь корректно скрывается через 0.5 секунды</li>
<li><strong>Основная функциональность:</strong> Восстановлена работа тем, навигации и анимаций</li>
<li><strong>Отладочный код:</strong> Удален лишний код, который вызывал проблемы</li>
</ul>
</div>
<div class="info">
<h2>🧪 Тестирование:</h2>
<p>Теперь сайт должен нормально загружаться. Проверьте следующие страницы:</p>
<a href="http://localhost:8000/" target="_blank" class="test-link">🏠 Главная страница</a>
<a href="http://localhost:8000/services/" target="_blank" class="test-link">🛠️ Страница услуг</a>
<a href="http://localhost:8000/about/" target="_blank" class="test-link"> О нас</a>
<h3>Что проверить:</h3>
<ul>
<li>✅ Загрузочный экран исчезает через полсекунды</li>
<li>✅ Навигационные ссылки работают</li>
<li>✅ Кнопки и интерактивные элементы кликабельны</li>
<li>✅ Переключатель темы работает (если есть)</li>
<li>✅ Модальное окно услуг открывается</li>
<li>✅ QR-код генерация работает в модальном окне</li>
</ul>
</div>
<div class="info">
<h2>🛠️ Техническая информация:</h2>
<ul>
<li><strong>Проблема:</strong> Синтаксические ошибки в modern-scripts.js блокировали загрузку</li>
<li><strong>Решение:</strong> Пересоздан упрощенный и стабильный JavaScript файл</li>
<li><strong>Сохранена функциональность:</strong> Скрытие загрузочного экрана, переключение тем, плавная прокрутка, анимации</li>
<li><strong>Удалено:</strong> Отладочный код, который вызывал конфликты</li>
</ul>
</div>
<div class="success">
<h2>🚀 Сайт готов к использованию!</h2>
<p>Все основные функции восстановлены, включая механизм QR-кода для заявок через Telegram бота.</p>
</div>
</body>
</html>

View File

@@ -1,110 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>✨ Новая анимация успеха для заявок</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; line-height: 1.6; }
.improvement { background: #e8f5e8; padding: 20px; border-radius: 10px; margin: 15px 0; border-left: 5px solid #28a745; }
.feature { background: #e7f3ff; padding: 15px; border-radius: 8px; margin: 10px 0; }
.workflow { background: #fff9e6; padding: 15px; border-radius: 8px; margin: 10px 0; }
.test-btn { display: inline-block; padding: 12px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 10px 5px; }
.test-btn:hover { background: #0056b3; text-decoration: none; color: white; }
h2 { color: #333; border-bottom: 2px solid #28a745; padding-bottom: 5px; }
.emoji { font-size: 1.2em; }
</style>
</head>
<body>
<h1><span class="emoji"></span> Улучшенная анимация подачи заявок</h1>
<div class="improvement">
<h2><span class="emoji">🎯</span> Что улучшено:</h2>
<div class="feature">
<h3><span class="emoji">📐</span> QR-код отцентрирован</h3>
<ul>
<li>QR-код теперь идеально выровнен по центру поля</li>
<li>Фиксированный размер 200x200px для консистентности</li>
<li>Красивая рамка и отступы</li>
</ul>
</div>
<div class="feature">
<h3><span class="emoji">🎬</span> Анимированная галочка успеха</h3>
<ul>
<li>После создания заявки появляется анимированная галочка ✓</li>
<li>Плавная анимация рисования круга и галочки</li>
<li>Профессиональный зеленый дизайн</li>
</ul>
</div>
<div class="feature">
<h3><span class="emoji">⏱️</span> Автоматическое закрытие</h3>
<ul>
<li>Модальное окно автоматически закрывается через 6 секунд</li>
<li>3 сек на QR-код → 3 сек на анимацию успеха → закрытие</li>
<li>Уведомление о успешной подаче заявки</li>
</ul>
</div>
</div>
<div class="workflow">
<h2><span class="emoji">🔄</span> Новый процесс подачи заявки:</h2>
<ol>
<li><strong>Пользователь заполняет форму</strong> и нажимает "Отправить заявку"</li>
<li><strong>Показывается индикатор загрузки</strong> "Отправляем..."</li>
<li><strong>Появляется центрированный QR-код</strong> с кнопкой "Открыть в Telegram"</li>
<li><strong>Через 3 секунды</strong> QR-код скрывается</li>
<li><strong>Появляется анимированная галочка</strong> с сообщением "Заявка подана успешно!"</li>
<li><strong>Через 3 секунды</strong> модальное окно автоматически закрывается</li>
<li><strong>Показывается уведомление</strong> "Ожидайте подтверждения в Telegram"</li>
</ol>
</div>
<div class="improvement">
<h2><span class="emoji">🧪</span> Тестирование:</h2>
<p>Перейдите на страницу услуг и попробуйте подать заявку:</p>
<a href="http://localhost:8000/services/" target="_blank" class="test-btn">
<span class="emoji">🛠️</span> Тестировать на странице услуг
</a>
<h3>Что тестировать:</h3>
<ul>
<li>✅ Заполните форму и отправьте заявку</li>
<li>✅ Убедитесь, что QR-код отцентрирован</li>
<li>✅ Подождите 3 секунды - должна появиться анимированная галочка</li>
<li>✅ Подождите еще 3 секунды - окно должно закрыться автоматически</li>
<li>✅ Должно появиться уведомление о успешной подаче</li>
</ul>
</div>
<div class="feature">
<h2><span class="emoji">💻</span> Технические детали:</h2>
<h3>Добавленные компоненты:</h3>
<ul>
<li><strong>CSS анимации:</strong> Keyframes для рисования галочки и круга</li>
<li><strong>JavaScript таймеры:</strong> Координация показа QR → анимации → закрытия</li>
<li><strong>Центрирование:</strong> Flexbox для идеального выравнивания</li>
<li><strong>Сброс состояния:</strong> Очистка всех секций при закрытии модального окна</li>
</ul>
<h3>Файлы изменены:</h3>
<ul>
<li><code>services_modern.html</code> - обновлена структура модального окна</li>
<li><code>modern-styles.css</code> - добавлены анимации галочки</li>
</ul>
</div>
<div class="improvement">
<h2><span class="emoji">🎉</span> Результат:</h2>
<p><strong>Теперь процесс подачи заявки стал более интуитивным, визуально привлекательным и автоматизированным!</strong></p>
<p>Пользователи получают четкую обратную связь на каждом этапе, а модальное окно автоматически закрывается, предотвращая накопление открытых окон.</p>
</div>
</body>
</html>

View File

View File

@@ -1,35 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тест ссылок SmartSolTech</title>
</head>
<body>
<h1>Тестирование ссылок SmartSolTech</h1>
<div>
<h3>Основные страницы:</h3>
<ul>
<li><a href="http://localhost:8000/" target="_blank">Главная</a></li>
<li><a href="http://localhost:8000/services/" target="_blank">Услуги</a></li>
<li><a href="http://localhost:8000/about/" target="_blank">О нас</a></li>
</ul>
<p><strong>Инструкция:</strong></p>
<ol>
<li>Откройте каждую ссылку в новой вкладке</li>
<li>Проверьте, загружается ли страница</li>
<li>Попробуйте нажать на ссылки в навигации на каждой странице</li>
<li>Проверьте кнопки и интерактивные элементы</li>
</ol>
<p><strong>Что проверить на каждой странице:</strong></p>
<ul>
<li>Работают ли ссылки в навигационном меню</li>
<li>Работают ли кнопки (например, "Оставить заявку")</li>
<li>Исчезает ли загрузочный экран через несколько секунд</li>
<li>Работает ли переключатель темы</li>
</ul>
</div>
</body>
</html>

View File

@@ -1,127 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тестирование QR-кода для заявок</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; line-height: 1.6; }
.section { margin-bottom: 30px; padding: 20px; border: 1px solid #ddd; border-radius: 8px; }
.instructions { background: #f8f9fa; }
.test-case { background: #e7f3ff; }
.success { background: #d4edda; }
.warning { background: #fff3cd; }
h2 { color: #333; border-bottom: 2px solid #007bff; padding-bottom: 5px; }
h3 { color: #666; }
.step { margin: 10px 0; padding: 10px; background: white; border-radius: 4px; }
.link { color: #007bff; text-decoration: none; font-weight: bold; }
.link:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>🤖 Тестирование QR-кода и Telegram бота SmartSolTech</h1>
<div class="section instructions">
<h2>📋 Инструкции для тестирования</h2>
<p><strong>Что мы добавили:</strong></p>
<ul>
<li>✅ QR-код генерацию в модальном окне заявок</li>
<li>✅ Интеграция с Telegram ботом</li>
<li>✅ Автоматическое создание заявки через форму</li>
<li>✅ Подтверждение регистрации через Telegram</li>
</ul>
</div>
<div class="section test-case">
<h2>🔍 Тест-кейс 1: Создание заявки через модальное окно</h2>
<div class="step">
<h3>Шаг 1:</h3>
<p>Перейдите на страницу услуг: <a href="http://localhost:8000/services/" class="link" target="_blank">http://localhost:8000/services/</a></p>
</div>
<div class="step">
<h3>Шаг 2:</h3>
<p>Нажмите кнопку <strong>"Заказать услугу"</strong> под любой услугой</p>
</div>
<div class="step">
<h3>Шаг 3:</h3>
<p>Заполните форму в модальном окне:</p>
<ul>
<li>Имя: Тест</li>
<li>Фамилия: Пользователь</li>
<li>Email: test@example.com</li>
<li>Телефон: +7-123-456-7890</li>
<li>Описание: Тестовая заявка на услугу</li>
</ul>
</div>
<div class="step">
<h3>Шаг 4:</h3>
<p>Поставьте галочку согласия и нажмите <strong>"Отправить заявку"</strong></p>
</div>
<div class="step">
<h3>Ожидаемый результат:</h3>
<p>✅ Должен появиться QR-код для Telegram</p>
<p>✅ Кнопка "Открыть в Telegram" должна работать</p>
</div>
</div>
<div class="section test-case">
<h2>🤖 Тест-кейс 2: Подтверждение через Telegram бота</h2>
<div class="step">
<h3>Шаг 1:</h3>
<p>Отсканируйте QR-код телефоном или нажмите кнопку "Открыть в Telegram"</p>
</div>
<div class="step">
<h3>Шаг 2:</h3>
<p>Бот должен отправить команду /start с параметрами заявки</p>
</div>
<div class="step">
<h3>Шаг 3:</h3>
<p>Нажмите "Start" в Telegram</p>
</div>
<div class="step">
<h3>Ожидаемый результат:</h3>
<p>✅ Бот приветствует и подтверждает регистрацию</p>
<p>✅ Заявка получает статус "подтверждена"</p>
<p>✅ Клиент связывается с chat_id пользователя</p>
</div>
</div>
<div class="section warning">
<h2>⚠️ Возможные проблемы</h2>
<ul>
<li><strong>QR-код не генерируется:</strong> Проверьте настройки Telegram бота в админке</li>
<li><strong>Telegram бот не отвечает:</strong> Проверьте токен бота и что сервис telegram_bot запущен</li>
<li><strong>Ошибка 500:</strong> Проверьте логи Django в консоли Docker</li>
<li><strong>Ссылки не работают:</strong> Убедитесь, что JavaScript загружается корректно</li>
</ul>
</div>
<div class="section success">
<h2>📱 Быстрые ссылки для тестирования</h2>
<p><a href="http://localhost:8000/" class="link" target="_blank">🏠 Главная страница</a></p>
<p><a href="http://localhost:8000/services/" class="link" target="_blank">🛠️ Страница услуг (тестируем здесь)</a></p>
<p><a href="http://localhost:8000/about/" class="link" target="_blank"> О нас</a></p>
<p><a href="http://localhost:8080" class="link" target="_blank">🗄️ PgAdmin (admin:admin)</a></p>
</div>
<div class="section instructions">
<h2>🔧 Техническая информация</h2>
<h3>Новые компоненты:</h3>
<ul>
<li><strong>QR-код секция:</strong> Добавлена в модальное окно services_modern.html</li>
<li><strong>JavaScript:</strong> Обновлен для работы с generate_qr_code API</li>
<li><strong>Backend:</strong> generate_qr_code view создает QR-код и заявку</li>
<li><strong>Telegram интеграция:</strong> Обрабатывает /start команды с параметрами</li>
</ul>
<h3>Workflow:</h3>
<ol>
<li>Пользователь заполняет форму → JavaScript отправляет POST на /service/generate_qr_code/</li>
<li>Django создает Client, ServiceRequest и генерирует QR-код</li>
<li>Возвращается ссылка на Telegram бота с токеном</li>
<li>Пользователь сканирует QR или переходит по ссылке</li>
<li>Telegram бот обрабатывает /start команду и подтверждает заявку</li>
</ol>
</div>
</body>
</html>