first commit

This commit is contained in:
Gourav Kumar 2026-08-08 12:53:00 +05:30
commit 661112e147
7 changed files with 123 additions and 0 deletions

1
.dockerignore Normal file
View File

@ -0,0 +1 @@
uploads

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.env
__pycache__
uploads/*

13
Dockerfile Normal file
View File

@ -0,0 +1,13 @@
FROM python:3.14-alpine
WORKDIR /app
COPY buid_requirements.txt .
RUN pip install --no-cache-dir -r buid_requirements.txt
COPY main.py .
RUN mkdir /uploads
COPY uploads/test.txt /uploads/test.txt
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

5
buid_requirements.txt Normal file
View File

@ -0,0 +1,5 @@
bcrypt==5.0.0
fastapi==0.141.1
python-dotenv==1.2.2
python-multipart==0.0.32
uvicorn==0.52.1

10
compose.yaml Normal file
View File

@ -0,0 +1,10 @@
services:
uploader:
build: .
container_name: file-uploader
ports:
- "8899:8000"
environment:
UPLOAD_HASH: "${UPLOAD_HASH}"
volumes:
- ./uploads:/uploads

47
main.py Normal file
View File

@ -0,0 +1,47 @@
import os
import bcrypt
from fastapi import Depends, FastAPI, HTTPException, UploadFile, Response
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from dotenv import load_dotenv
from pathlib import Path
load_dotenv()
app = FastAPI()
UPLOAD_HASH = os.environ["UPLOAD_HASH"]
UPLOAD_PATH = "uploads"
security = HTTPBearer()
def authenticate(
credentials: HTTPAuthorizationCredentials = Depends(security),
):
token = credentials.credentials.encode()
if not bcrypt.checkpw(token, UPLOAD_HASH.encode()):
raise HTTPException(
status_code=401,
detail="Invalid authentication credentials",
)
@app.get('/test', dependencies=[Depends(authenticate)])
async def file_test():
test_file = f"/{UPLOAD_PATH}/test.txt"
with open(test_file) as f:
content = f.read()
return {'message': content}
@app.post("/upload", dependencies=[Depends(authenticate)])
async def upload(file: UploadFile):
with open(Path(f"/{UPLOAD_PATH}/{file.filename}"), "wb") as f:
while chunk := await file.read(64 * 1024):
f.write(chunk)
await file.close()
return {"status": "success"}

44
requirements.txt Normal file
View File

@ -0,0 +1,44 @@
annotated-doc==0.0.5
annotated-types==0.8.0
anyio==4.14.2
bcrypt==5.0.0
certifi==2026.7.22
click==8.4.2
detect-installer==0.1.0
dnspython==2.8.0
email-validator==2.3.0
fastapi==0.141.1
fastapi-cli==0.0.32
fastapi-cloud-cli==0.23.0
fastar==0.11.0
h11==0.16.0
httpcore==1.0.9
httptools==0.8.0
httpx==0.28.1
idna==3.18
Jinja2==3.1.6
markdown-it-py==4.2.0
MarkupSafe==3.0.3
mdurl==0.1.2
pydantic==2.13.4
pydantic-extra-types==2.11.1
pydantic-settings==2.15.0
pydantic_core==2.46.4
Pygments==2.20.0
python-dotenv==1.2.2
python-multipart==0.0.32
PyYAML==6.0.3
rich==15.0.0
rich-toolkit==0.20.3
rignore==0.8.1
sentry-sdk==2.66.1
shellingham==1.5.4
starlette==1.4.1
typer==0.27.1
typing-inspection==0.4.2
typing_extensions==4.16.0
urllib3==2.7.0
uvicorn==0.52.1
uvloop==0.22.1
watchfiles==1.2.0
websockets==17.0.1