refactored docker-compose

This commit is contained in:
nikili0n 2023-11-29 16:15:48 +03:00
parent 35b6ff8546
commit d86e95093d
6 changed files with 80 additions and 9 deletions

17
Dockerfile Normal file
View File

@ -0,0 +1,17 @@
FROM python:3.11.4
WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y ffmpeg
RUN pip install poetry
RUN poetry install --no-root
COPY .. /app
CMD poetry run python main.py

View File

@ -1,19 +1,60 @@
version: "2.1" version: "2.1"
networks:
network:
services: services:
web_service:
container_name: web_service
build:
context: .
dockerfile: web.Dockerfile
ports:
- "8000:8000"
depends_on:
redis:
condition: service_started
rabbitmq:
condition: service_healthy
restart: always
networks:
- network
download_service:
container_name: download_service
build:
context: .
dockerfile: Dockerfile
depends_on:
redis:
condition: service_started
rabbitmq:
condition: service_healthy
restart: always
networks:
- network
rabbitmq: rabbitmq:
container_name: rabbitmq
image: rabbitmq:3.10.7-management image: rabbitmq:3.10.7-management
hostname: rabbitmq hostname: rabbitmq
restart: always restart: always
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 30s
timeout: 30s
retries: 3
environment: environment:
- RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest - RABBITMQ_DEFAULT_PASS=guest
volumes: volumes:
- ./rabbitmq:/var/lib/rabbitmq - ./rabbitmq:/var/lib/rabbitmq
ports: ports:
- 15672:15672 - "15672:15672"
- 5672:5672 - "5672:5672"
networks:
- network
redis: redis:
container_name: redis_video_downloader container_name: redis_video_downloader
image: redis:latest image: redis:latest
ports: ports:
- "6379:6379" - "6379:6379"
networks:
- network

View File

@ -14,7 +14,7 @@ async def on_message(message: AbstractIncomingMessage, queue) -> None:
async def get_messages(inner_queue) -> None: async def get_messages(inner_queue) -> None:
async with await connect("amqp://guest:guest@localhost/") as connection: async with await connect("amqp://guest:guest@rabbitmq/") as connection:
channel = await connection.channel() channel = await connection.channel()
await channel.set_qos(prefetch_count=1) await channel.set_qos(prefetch_count=1)
@ -30,7 +30,7 @@ async def get_messages(inner_queue) -> None:
async def publish_message_with_task_done(task: dict | list) -> None: async def publish_message_with_task_done(task: dict | list) -> None:
queue_name = "tasks_done" queue_name = "tasks_done"
async with await connect("amqp://guest:guest@localhost/") as connection: async with await connect("amqp://guest:guest@rabbitmq/") as connection:
# Creating channel # Creating channel
channel = await connection.channel() channel = await connection.channel()

View File

@ -9,7 +9,7 @@ class RedisClient:
TASKS_DONE_NAME = "tasks_done" TASKS_DONE_NAME = "tasks_done"
def __init__(self): def __init__(self):
self.connection = redis.Redis(host="localhost", port=6379, db=0) self.connection = redis.Redis(host="redis_video_downloader", port=6379, db=0)
async def _set_task(self, queue_name: str, link: str, task: dict | list, ) -> int: async def _set_task(self, queue_name: str, link: str, task: dict | list, ) -> int:
async with self.connection as connection: async with self.connection as connection:

View File

@ -1,4 +1,5 @@
import json import json
import os
import uvicorn import uvicorn
import logging import logging
@ -15,8 +16,7 @@ from src.web.schemes.submit import SubmitIn, CheckIn, DeleteFromS3, CopyToAnothe
app = FastAPI( app = FastAPI(
title="video_downloader", openapi_url=f"/api/v1/openapi.json" title="video_downloader", openapi_url=f"/api/v1/openapi.json"
) )
templates = Jinja2Templates(directory=f"{os.path.dirname(os.path.dirname(os.path.abspath(__file__)))}/web/templates")
templates = Jinja2Templates(directory="templates")
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
@ -102,7 +102,7 @@ async def get_url_for_download_video(request: Request, data: SubmitIn = Depends(
return JSONResponse({"result": links_to_download_video}) return JSONResponse({"result": links_to_download_video})
# TODO: учесть, что если делать запрос CURL\urllib3\etc, в теле может быть несколько ссылок -> должно быть создано несколько задач # TODO: учесть, что если делать запрос CURL\urllib3\etc, в теле может быть несколько ссылок -> должно быть создано несколько задач
async with await connect("amqp://guest:guest@localhost/") as connection: async with await connect("amqp://guest:guest@rabbitmq/") as connection:
# Creating a channel # Creating a channel
channel = await connection.channel() channel = await connection.channel()
body = [ body = [
@ -204,4 +204,4 @@ async def delete_video_from_s3(data: CopyToAnotherBucketS3):
) )
uvicorn.run("src.web.main:app", host="0.0.0.0", log_level="info") uvicorn.run("src.web.main:app", host="0.0.0.0", port=8000, log_level="info")

13
web.Dockerfile Normal file
View File

@ -0,0 +1,13 @@
FROM python:3.11.4
WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN pip install poetry
RUN poetry install --no-root
COPY .. /app
CMD poetry run python main_web.py