From e92ade6c94dd20984f00aa42d6e6432c38543d61 Mon Sep 17 00:00:00 2001 From: IgorVolochay Date: Sat, 10 Jan 2026 13:48:18 +0300 Subject: [PATCH] Pre-merge edit --- app/.env-example | 18 ++++++++++++++++++ app/main.py | 6 ++++-- app/pyproject.toml | 1 - app/redis_worker.py | 9 +-------- app/s3_worker.py | 19 +------------------ docker/docker-compose.yml | 6 +++--- 6 files changed, 27 insertions(+), 32 deletions(-) create mode 100644 app/.env-example diff --git a/app/.env-example b/app/.env-example new file mode 100644 index 0000000..9216b31 --- /dev/null +++ b/app/.env-example @@ -0,0 +1,18 @@ +DISABLE_DOCS=false +BACKEND_PORT=5000 + +LOGS_PATH=./logs + +FILES_TTL=86400 # 1 Day +MAX_FILES_SIZE=1073741824 # 1GB + +S3_ACCESS_KEY_ID=Some_username +S3_SECRET_ACCESS_KEY=Some_password +S3_ENDPOINT_URL=Some_url + +BUCKET_NAME=drop-me-files + +REDIS_ADDRESS=Some_url +REDIS_PORT=6379 +REDIS_USERNAME=Some_username +REDIS_PASSWORD=Some_password \ No newline at end of file diff --git a/app/main.py b/app/main.py index 7afb63b..2255a60 100644 --- a/app/main.py +++ b/app/main.py @@ -29,7 +29,7 @@ logger.add(sys.stdout, disable_docs = os.getenv("DISABLE_DOCS", "true").lower() == "true" app: FastAPI = FastAPI(title="DropMeFiles analog", summary="OpenAPI schema for \"DropMeFiles analog\" project!", - version="0.1", + version="1.0", contact={"GitHub": "https://github.com/IgorVolochay/Drop-me-files-analog"}, docs_url=None if disable_docs else "/docs", redoc_url=None if disable_docs else "/redoc", @@ -38,6 +38,8 @@ app: FastAPI = FastAPI(title="DropMeFiles analog", s3_worker = S3Worker() redis_worker = RedisWorker() +max_file_size = int(os.getenv('MAX_FILES_SIZE', 1048576)) # 1 MB if None + class RealIPMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): forwarded = request.headers.get("X-Forwarded-For", "") @@ -55,7 +57,7 @@ app.add_middleware(RealIPMiddleware) async def get_upload_token(file_name: str, file_type: str, file_size: int, response: Response, request: Request) -> BaseResponse: user_ip = request.state.client_ip logger.debug(f"User IP: {user_ip}; Endpoint: /upload_token; File Name: {file_name}; File Type: {file_type}; File Size: {file_size}") - if file_size > int(os.getenv('MAX_FILES_SIZE')): + if file_size > max_file_size: response.status_code = status.HTTP_413_CONTENT_TOO_LARGE logger.warning(f"User IP: {user_ip}; File Name: {file_name}; Exception: The file is too large") return BaseResponse(result="The uploaded file is too large", error=True) diff --git a/app/pyproject.toml b/app/pyproject.toml index 697363f..8013285 100644 --- a/app/pyproject.toml +++ b/app/pyproject.toml @@ -9,7 +9,6 @@ dependencies = [ "dotenv>=0.9.9", "fastapi>=0.121.1", "loguru>=0.7.3", - "minio>=7.2.20", "pydantic>=2.12.5", "python-multipart>=0.0.20", "redis>=7.1.0", diff --git a/app/redis_worker.py b/app/redis_worker.py index 8c30ae3..d74a615 100644 --- a/app/redis_worker.py +++ b/app/redis_worker.py @@ -1,5 +1,4 @@ import os -from datetime import datetime import redis from dotenv import load_dotenv @@ -33,10 +32,4 @@ class RedisWorker: def get_record(self, file_uuid:str): - return self.client.hgetall(file_uuid) - - -if __name__ == "__main__": - worker = RedisWorker() - worker.create_record("127.0.0.1", "some.jpg", "QWERTY", "image/jpeg", datetime.now().isoformat(), file_size=1024) - print(worker.get_record("QWERTY")) + return self.client.hgetall(file_uuid) \ No newline at end of file diff --git a/app/s3_worker.py b/app/s3_worker.py index 43cf67a..79024b8 100644 --- a/app/s3_worker.py +++ b/app/s3_worker.py @@ -1,6 +1,5 @@ import os -import asyncio from contextlib import asynccontextmanager from dotenv import load_dotenv @@ -43,7 +42,6 @@ class S3Worker: ExpiresIn=expires_in, ) - async def generate_download_url(self, key: str, filename: str, expires_in: int = 300) -> str: async with self.get_client() as client: return await client.generate_presigned_url("get_object", @@ -55,19 +53,4 @@ class S3Worker: ), }, ExpiresIn=expires_in, - ) - - -async def test_run(): - worker = S3Worker() - - url = await worker.generate_download_url("test.txt", "hello.txt") - print(url) - url = await worker.generate_upload_post("some.jpg", content_type="image/jpeg") - print(url) - url = await worker.generate_download_url("some.jpg", "image.jpg") - print(url) - - -if __name__ == "__main__": - asyncio.run(test_run()) \ No newline at end of file + ) \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 893ae04..58cf880 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.9" services: minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-09-07T16-13-09Z container_name: dmf-minio-server restart: always ports: @@ -21,7 +21,7 @@ services: retries: 5 minio-init: - image: minio/mc:latest + image: minio/mc:RELEASE.2025-09-07T16-13-09Z depends_on: minio: condition: service_healthy @@ -64,6 +64,6 @@ services: interval: 30s timeout: 10s retries: 5 - restart: unless-stopped + restart: always tty: true stdin_open: true