Thorsten Merten has proposed merging ~thorsten-merten/maas-site-manager:MAASENG-1451-setup-docker-compose into maas-site-manager:main.
Commit message: feat: add docker-compose to easily run backend + db * add docker-compose.yaml * add .env.dev file to share db secrets * add backend Dockerfiles and .dockerignore * change backend to use environment variables instead of hardcoded db * change uvcorn run to accept all connections * change tox to forward env vars Requested reviews: MAAS Committers (maas-committers) For more details, see: https://code.launchpad.net/~thorsten-merten/maas-site-manager/+git/maas-site-manager/+merge/438281 -- Your team MAAS Committers is requested to review the proposed merge of ~thorsten-merten/maas-site-manager:MAASENG-1451-setup-docker-compose into maas-site-manager:main.
diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..c59d0d9 --- /dev/null +++ b/.env.dev @@ -0,0 +1,11 @@ +APP_CORES=1 +APP_RAM=512MB + +POSTGRES_CORES=1 +POSTGRES_RAM=512MB + +POSTGRES_HOST="db" +POSTGRES_PORT=5432 +POSTGRES_DB="postgres" # default for postgres docker image +POSTGRES_USER="postgres" # default for postgres docker image +POSTGRES_PASSWORD="msm" # default for postgres docker image diff --git a/README.md b/README.md new file mode 100644 index 0000000..912f06f --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# MAAS Site Manager + +This repository contains the MAAS Site Manager MVP. It one sub-folder for every sub-project. + +## How to run a local development environment? + +### Manually + +Follow the instruction in `/backend/README.md` and `/frontend/README.md`. + +### Via docker compose + +* Make sure to have a recent version of [docker](https://docs.docker.com/get-docker/) installed. +* Run `docker compose up --build` to start the backend and the database +* Run `cd frontend` and `yarn run serve` to start the frontend + diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..d885fbd --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,2 @@ +.tox +msm.egg-info diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..4bd1ba3 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,29 @@ +FROM python:3.10 +LABEL maintainer="MAAS Commiters <[email protected]>" + +ARG VERSION=development +ENV VERSION ${VERSION} + +# ensure python stdout and stderr streams are sent straight to terminal +# also ensure nothing is buffered and thus may never be written +ENV PYTHONUNBUFFERED 1 + +# RUN apt-get update -q -y && apt-get install -q -y --no-install-recommends --no-install-suggests \ +# tox + +RUN python -m pip install --user tox + +# create app directory +RUN mkdir /app +WORKDIR /app + +# Bundle app source +COPY . /app/ + +# Expose port +EXPOSE 8000 + +#ENTRYPOINT ["tail", "-f", "/dev/null"] # to keep it running for debugging +ENTRYPOINT ["python", "-m", "tox", "-e", "run", "run"] +# CMD "python -m tox -e run run" +#CMD "python wait-for-postgres.py" diff --git a/backend/README.md b/backend/README.md index 78d1b7b..9bf524c 100644 --- a/backend/README.md +++ b/backend/README.md @@ -20,7 +20,7 @@ These are the step needed for setup: ## Linting and testing - The project uses `tox` for running python-related workflows: +The project uses `tox` for running python-related workflows: - Code formatting: `tox -e format` - Linting: `tox -e lint` @@ -59,18 +59,26 @@ It requires a PostgreSQL database set up to connect to. One (more persistent) option is to set up the required user and database in the system-wide PostgreSQL instance (installed via `make install-dependencies`). +Make sure to set the following environment variables when starting the app: + +``` +export POSTGRES_HOST="hostname" +export POSTGRES_PORT=5432 +export POSTGRES_DB="postgres" # default for postgres docker image +export POSTGRES_USER="postgres" # default for postgres docker image +export POSTGRES_PASSWORD="msm" +``` + Another (quicker) way is to launch a PostgreSQL instance via `docker`: ``` docker run --rm -it \ -p 5432:5432 \ - -e POSTGRES_PASSWORD=pass \ + -e POSTGRES_PASSWORD=msm \ --name postgres \ postgres:14 ``` -This setup matches the current hardcoded default DSN, so the app can be run -right away after staring the `postgres` container. Database schema setup will happen automatically at application startup. The application can be run via diff --git a/backend/msm/user_api/_setup.py b/backend/msm/user_api/_setup.py index f181be3..58b272f 100644 --- a/backend/msm/user_api/_setup.py +++ b/backend/msm/user_api/_setup.py @@ -1,11 +1,20 @@ +from os import environ + from fastapi import FastAPI from . import _base from .. import PACKAGE from ..db import Database -# XXX drop hardcoded default -DEFAULT_DB_DSN = "postgresql+asyncpg://postgres:pass@localhost/postgres" +POSTGRES_HOST = environ.get("POSTGRES_HOST") +POSTGRES_PORT = environ.get("POSTGRES_PORT") +POSTGRES_DB = environ.get("POSTGRES_DB") +POSTGRES_USER = environ.get("POSTGRES_USER") +POSTGRES_PASSWORD = environ.get("POSTGRES_PASSWORD") +DEFAULT_DB_DSN = ( + "postgresql+asyncpg://" + + f"{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}/{POSTGRES_DB}" +) def create_app(db_dsn: str = DEFAULT_DB_DSN) -> FastAPI: diff --git a/backend/setup.cfg b/backend/setup.cfg index f55af69..c889873 100644 --- a/backend/setup.cfg +++ b/backend/setup.cfg @@ -8,6 +8,7 @@ author_email = [email protected] [options] packages = find: python_requires = >= 3.10 +pass_env = POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD install_requires = fastapi SQLAlchemy[postgresql_asyncpg] @@ -75,10 +76,11 @@ commands = {envbindir}/mypy -p msm {posargs} [testenv:run] +pass_env = POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD deps = -e . uvicorn commands = - {envbindir}/uvicorn --factory msm.user_api:create_app --reload {posargs} + {envbindir}/uvicorn --factory msm.user_api:create_app --host 0.0.0.0 --reload {posargs} diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..05d795f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,31 @@ +version: "3.9" +services: + postgres: + image: postgres:14 + env_file: .env.dev + ports: + - 5432:5432 + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + + backend: + env_file: .env.dev + depends_on: + postgres: + condition: service_healthy + build: + context: ./backend + volumes: + - ./backend:/app + ports: + - "8000:8000" + links: + - "postgres:db" + +volumes: + postgres-data:
-- Mailing list: https://launchpad.net/~sts-sponsors Post to : [email protected] Unsubscribe : https://launchpad.net/~sts-sponsors More help : https://help.launchpad.net/ListHelp

