Pre-merge edit
This commit is contained in:
@@ -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
|
||||||
+4
-2
@@ -29,7 +29,7 @@ logger.add(sys.stdout,
|
|||||||
disable_docs = os.getenv("DISABLE_DOCS", "true").lower() == "true"
|
disable_docs = os.getenv("DISABLE_DOCS", "true").lower() == "true"
|
||||||
app: FastAPI = FastAPI(title="DropMeFiles analog",
|
app: FastAPI = FastAPI(title="DropMeFiles analog",
|
||||||
summary="OpenAPI schema for \"DropMeFiles analog\" project!",
|
summary="OpenAPI schema for \"DropMeFiles analog\" project!",
|
||||||
version="0.1",
|
version="1.0",
|
||||||
contact={"GitHub": "https://github.com/IgorVolochay/Drop-me-files-analog"},
|
contact={"GitHub": "https://github.com/IgorVolochay/Drop-me-files-analog"},
|
||||||
docs_url=None if disable_docs else "/docs",
|
docs_url=None if disable_docs else "/docs",
|
||||||
redoc_url=None if disable_docs else "/redoc",
|
redoc_url=None if disable_docs else "/redoc",
|
||||||
@@ -38,6 +38,8 @@ app: FastAPI = FastAPI(title="DropMeFiles analog",
|
|||||||
s3_worker = S3Worker()
|
s3_worker = S3Worker()
|
||||||
redis_worker = RedisWorker()
|
redis_worker = RedisWorker()
|
||||||
|
|
||||||
|
max_file_size = int(os.getenv('MAX_FILES_SIZE', 1048576)) # 1 MB if None
|
||||||
|
|
||||||
class RealIPMiddleware(BaseHTTPMiddleware):
|
class RealIPMiddleware(BaseHTTPMiddleware):
|
||||||
async def dispatch(self, request: Request, call_next):
|
async def dispatch(self, request: Request, call_next):
|
||||||
forwarded = request.headers.get("X-Forwarded-For", "")
|
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:
|
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
|
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}")
|
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
|
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")
|
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)
|
return BaseResponse(result="The uploaded file is too large", error=True)
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ dependencies = [
|
|||||||
"dotenv>=0.9.9",
|
"dotenv>=0.9.9",
|
||||||
"fastapi>=0.121.1",
|
"fastapi>=0.121.1",
|
||||||
"loguru>=0.7.3",
|
"loguru>=0.7.3",
|
||||||
"minio>=7.2.20",
|
|
||||||
"pydantic>=2.12.5",
|
"pydantic>=2.12.5",
|
||||||
"python-multipart>=0.0.20",
|
"python-multipart>=0.0.20",
|
||||||
"redis>=7.1.0",
|
"redis>=7.1.0",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import os
|
import os
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import redis
|
import redis
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@@ -34,9 +33,3 @@ class RedisWorker:
|
|||||||
|
|
||||||
def get_record(self, file_uuid:str):
|
def get_record(self, file_uuid:str):
|
||||||
return self.client.hgetall(file_uuid)
|
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"))
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import asyncio
|
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@@ -43,7 +42,6 @@ class S3Worker:
|
|||||||
ExpiresIn=expires_in,
|
ExpiresIn=expires_in,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def generate_download_url(self, key: str, filename: str, expires_in: int = 300) -> str:
|
async def generate_download_url(self, key: str, filename: str, expires_in: int = 300) -> str:
|
||||||
async with self.get_client() as client:
|
async with self.get_client() as client:
|
||||||
return await client.generate_presigned_url("get_object",
|
return await client.generate_presigned_url("get_object",
|
||||||
@@ -56,18 +54,3 @@ class S3Worker:
|
|||||||
},
|
},
|
||||||
ExpiresIn=expires_in,
|
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())
|
|
||||||
@@ -2,7 +2,7 @@ version: "3.9"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
minio:
|
minio:
|
||||||
image: minio/minio:latest
|
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
|
||||||
container_name: dmf-minio-server
|
container_name: dmf-minio-server
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
@@ -21,7 +21,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
minio-init:
|
minio-init:
|
||||||
image: minio/mc:latest
|
image: minio/mc:RELEASE.2025-09-07T16-13-09Z
|
||||||
depends_on:
|
depends_on:
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
@@ -64,6 +64,6 @@ services:
|
|||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
restart: unless-stopped
|
restart: always
|
||||||
tty: true
|
tty: true
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
|
|||||||
Reference in New Issue
Block a user