Compare commits

..

5 Commits

Author SHA1 Message Date
4e6f6f5e10
Merge branch 'backend' 2023-11-01 23:49:21 -04:00
181dfb06a2
Feat(Docker): Containerized the application 2023-11-01 23:48:43 -04:00
0688648d75
Merge pull request #14 from minhtrannhat/frontend
Feat(backend): update deps
2023-09-09 00:33:02 -04:00
c8ba1f2676
Merge pull request #13 from minhtrannhat/frontend
Frontend completed
2023-09-04 17:27:13 -04:00
7611c9c2fa
Merge pull request #12 from minhtrannhat/backend
Feat(Backend): Added docs to openAPI
2023-07-26 16:52:09 -04:00
6 changed files with 96 additions and 0 deletions

36
Dockerfile Normal file
View File

@ -0,0 +1,36 @@
FROM node:18-bullseye-slim as frontend
WORKDIR /frontend/
COPY frontend/package.json frontend/package-lock.json /frontend/
RUN npm install
COPY frontend /frontend/
RUN npm run build
FROM python:3.10.1-slim-bullseye
RUN apt-get update && apt install dumb-init
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
EXPOSE 8080
RUN mkdir -p /app
WORKDIR /app
COPY hypercorn.toml /app/
CMD ["pdm", "run", "hypercorn", "--config", "hypercorn.toml", "backend.run:app"]
RUN python -m venv /ve
ENV PATH=/ve/bin:${PATH}
RUN pip install --no-cache-dir pdm
COPY backend/pdm.lock backend/pyproject.toml /app/
RUN pdm install --prod --no-lock --no-editable
COPY --from=frontend /frontend/build/*.js* /app/backend/static/
COPY --from=frontend /frontend/build/*.png /frontend/build/*.svg /app/backend/static/
COPY --from=frontend /frontend/build/index.html \
/app/backend/templates/
COPY --from=frontend /frontend/build/static/. /app/backend/static/
COPY backend/src/ /app/
USER nobody

View File

@ -1,5 +1,9 @@
# Todo API
## To run
`docker-compose up -d`
## Frontend
### Development Workflow

View File

@ -0,0 +1,12 @@
from quart import Blueprint, render_template, ResponseReturnValue
from quart_rate_limiter import rate_exempt
blueprint = Blueprint("serving", __name__)
@blueprint.get("/")
@blueprint.get("/<path:path>")
@rate_exempt
async def index(path: str | None = None) -> ResponseReturnValue:
return await render_template("index.html")

View File

@ -23,6 +23,7 @@ from backend.blueprints.control import blueprint as control_blueprint
from backend.blueprints.members import blueprint as members_blueprint
from backend.blueprints.sessions import blueprint as sessions_blueprint
from backend.blueprints.todos import blueprint as todos_blueprint
from backend.blueprints.serving import blueprint as serving_blueprint
# For making sure error responses are in JSON format
from backend.lib.api_error import APIError
@ -48,6 +49,7 @@ app.register_blueprint(control_blueprint)
app.register_blueprint(sessions_blueprint)
app.register_blueprint(members_blueprint)
app.register_blueprint(todos_blueprint)
app.register_blueprint(serving_blueprint)
# Rate limiting

38
docker-compose.yaml Normal file
View File

@ -0,0 +1,38 @@
version: "3"
services:
web-service:
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8080:8080"
depends_on:
postgres:
condition: service_healthy
networks:
- my_network
environment:
TODO_SECRET_KEY: "secret key"
TODO_QUART_DB_DATABASE_URL: postgres://postgres:postgres_password@postgres:5432/todo
TODO_QUART_DB_DATA_PATH: migrations/data.py
postgres:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: postgres_password
POSTGRES_DB: todo
POSTGRES_USER: postgres
networks:
- my_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 30s
timeout: 10s
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
networks:
my_network:

4
hypercorn.toml Normal file
View File

@ -0,0 +1,4 @@
accesslog = "-"
access_log_format = "%(t)s %(h)s %(f)s - %(S)s '%(r)s' %(s)s %(b)s %(D)s"
bind = "0.0.0.0:8080"
errorlog = "-"