- django
- wikipedia
- scipy
- scikit-learn
- bs4
- requests
- pandas
- psycopg2-binary
- sqlalchemy
- celery
- gunicorn
From the directory containing manage.py (root of the repository), run:
python manage.py runserver<URL provided by manage.py when starting>/ - opens an input field. Enter a link to an English Wikipedia article about a movie and select the number of similar movies.
Press enter and wait for the system to redirect to the results page (showing a list of similar movies with links and descriptions).
<URL provided by manage.py when starting>/train - train the model. The repository already includes a model pre-trained on 20,000 English movies.
Training is time-consuming (reducing to 10,000 movies speeds up the process. 20,000 was chosen as optimal for resource/quality balance).
-
Build the Docker image:
docker build -t django-movie-service . -
Run the container:
docker run -p 8000:8000 django-movie-service
-
Service will be available at: http://localhost:8000
-
Start services:
docker-compose up --build
-
Web service will be available at: http://localhost
-
Nginx will proxy requests to the service on port 8000. Access via:
- Main interface: http://localhost/app
- Admin panel: http://localhost/admin
- Health Check: http://localhost/health
-
On the main page enter:
- Link to an English Wikipedia movie article (e.g., https://en.wikipedia.org/wiki/Gladiator_(2000_film))
- Number of recommendations (1-10)
-
Click "Search" to submit. This creates an async task to process the request.
-
Check task status and results:
- Task status: http://localhost/task_status/{task_id}
- Successful tasks return a list of similar movies.
-
If model isn't trained, you'll be prompted to visit the training page.
Nginx config proxies requests to the service running on port 8000 (in the web container).
Apply configurations:
kubectl apply -f k8s/ --recursiveDirectory structure:
├── celery/ # Celery worker resources
│ └── deployment.yaml # Celery Deployment
├── db/ # PostgreSQL resources
│ ├── deployment.yaml # DB Deployment
│ ├── pvc.yaml # Persistent Volume Claim
│ └── service.yaml # DB Service
├── nginx/ # Nginx resources
│ ├── configmap.yaml # Nginx Config
│ ├── deployment.yaml # Nginx Deployment
│ └── service.yaml # Nginx Service
├── rabbitmq/ # RabbitMQ resources
│ ├── deployment.yaml # RabbitMQ Deployment
│ └── service.yaml # RabbitMQ Service
└── web/ # Django app resources
├── deployment.yaml # Web app Deployment
├── pvc.yaml # Persistent Volume
└── service.yaml # Web Service
After deployment, access via Nginx:
minikube tunnelCheck assigned external IP:
kubectl get svc nginx -n highload-project -o wideExample output:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.96.45.217 127.0.0.1 80:32456/TCP 2mAccess points:
- Main interface: http://localhost/app
- Django admin: http://localhost/admin
- Health Check: http://localhost/health
-
On main page enter:
- English Wikipedia movie link (e.g., Gladiator)
- Number of recommendations (1-10)
-
Click "Search" to create async task.
-
Check results:
- Task status: http://localhost/app/task_status/{task_id}
- Returns list of similar movies when complete.
-
Untrained models prompt to visit training page.
- django
- wikipedia
- scipy
- scikit-learn
- bs4
- requests
- pandas
- psycopg2-binary
- sqlalchemy
- celery
- gunicorn
Из папки с manage.py (корень репозитория):
python manage.py runserver<ссылка, которую даст вам manage.py при запуске>/ - откроет окно с полем ввода. Туда вводим ссылку на статью(английскую) на википедии о фильме и выбираем число похожих. Жмем энтер и ждем, пока система перенаправит на страницу с результатами (там будет список похожих фильмов с ссылкой и описанием) <ссылка, которую даст вам manage.py при запуске>/train - тренировать модель. В репозитории модель уже тренирована на 20000 фильмах с описанием на английском. Процесс тренировки достаточно длительный(если сократить число фильмов до 10000, то процесс ускорится. Решил использовать 20000, так как это оптимальное число с точки зрения ресурсов и качества).
-
Сборка образа:
docker build -t django-movie-service . -
Запуск контейнера:
docker run -p 8000:8000 django-movie-service
-
Сервис доступен по: http://localhost:8000
-
Запуск сервисов:
docker-compose up --build
-
Веб-сервис доступен по: http://localhost
-
Nginx проксирует запросы на порт 8000. Доступ:
- Основной интерфейс: http://localhost/app
- Админка: http://localhost/admin
- Health Check: http://localhost/health
-
На главной странице:
- Ссылка на англоязычную статью (напр., https://en.wikipedia.org/wiki/Gladiator_(2000_film))
- Количество рекомендаций (1-10)
-
Нажать "Search" для создания асинхронной задачи.
-
Проверка статуса:
- Статус задачи: http://localhost/task_status/{task_id}
- Результат - список похожих фильмов.
-
Если модель не обучена - предложение перейти на страницу обучения.
Nginx проксирует запросы к сервису на порту 8000 (контейнер web).
Применить конфигурации:
kubectl apply -f k8s/ --recursiveСтруктура директории с k8s:
├── celery/ # Ресурсы Celery
│ └── deployment.yaml # Деплоймент Celery
├── db/ # Ресурсы PostgreSQL
│ ├── deployment.yaml # Деплоймент БД
│ ├── pvc.yaml # Том
│ └── service.yaml # Сервис БД
├── nginx/ # Ресурсы Nginx
│ ├── configmap.yaml # Конфиг Nginx
│ ├── deployment.yaml # Деплоймент Nginx
│ └── service.yaml # Сервис Nginx
├── rabbitmq/ # Ресурсы RabbitMQ
│ ├── deployment.yaml # Деплоймент RabbitMQ
│ └── service.yaml # Сервис RabbitMQ
└── web/ # Ресурсы Django
├── deployment.yaml # Деплоймент
├── pvc.yaml # Том
└── service.yaml # Сервис
После развертывания:
minikube tunnelПроверка IP:
kubectl get svc nginx -n highload-project -o wideПример вывода:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.96.45.217 127.0.0.1 80:32456/TCP 2mТочки доступа:
- Основной интерфейс: http://localhost/app
- Админка: http://localhost/admin
- Health Check: http://localhost/health
-
На главной странице:
- Ссылка на статью (напр., Gladiator)
- Количество рекомендаций (1-10)
-
Нажать "Search" для создания задачи.
-
Проверка результатов:
- Статус: http://localhost/app/task_status/{task_id}
- Список похожих фильмов по завершении.
-
Если модель не обучена - предложение перейти на страницу обучения.