From 2103aa93a9995ceea282a9c563bca7d862c2e7a6 Mon Sep 17 00:00:00 2001 From: "Anna (Anya) Parker" <50943381+anna-parker@users.noreply.github.com> Date: Wed, 8 May 2024 15:59:46 +0200 Subject: [PATCH] Update READMEs with some development tips. Add an ingest DAG (I always use this for development so I feel it could be useful for others). --- README.md | 9 ++++++++- backend/README.md | 26 +++++++++++++++++--------- ingest/README.md | 8 ++++++++ ingest/dag.png | Bin 0 -> 52980 bytes kubernetes/README.md | 1 + 5 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 ingest/dag.png diff --git a/README.md b/README.md index 223b601f2..b818dd5dc 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,16 @@ Loculus is a software package to power microbial genomial databases. ### [Visit the Loculus documentation website](https://loculus-project.github.io/loculus/) +## Development + Additional documentation for development is available in each folder's README. This file contains a high-level overview of the project and shared development information that is best kept in one place. +If you would like to develop loculus locally you need to first: + +1. Deploy a local kubernetes instance: [kubernetes](/kubernetes/README.md) +2. Deploy the backend: [backend](/backend/README.md) +3. Deploy the frontend/website: [website](/website/README.md) + ## Architecture - Backend code is in `backend`, see [`backend/README.md`](/backend/README.md) @@ -27,7 +35,6 @@ While the documentation is still a work in progress, a look at the [`.github/wor - [`website.yml`](/.github/workflows/website.yml) runs the website tests and builds the website docker image - [`e2e-k3d.yml`](/.github/workflows/e2e-k3d.yml) runs the end-to-end tests - ## Authorization ### User management diff --git a/backend/README.md b/backend/README.md index 0e74271b4..9c1a550c8 100644 --- a/backend/README.md +++ b/backend/README.md @@ -6,8 +6,8 @@ All commands mentioned in this section are run from the `backend` directory unle ### Prerequisites -* Java 21 installed on your system -* A running PostgreSQL database (e.g. via a local [Kubernetes deployment](../kubernetes/README.md))]) +- Java 21 installed on your system +- A running PostgreSQL database (e.g. via a local [Kubernetes deployment](../kubernetes/README.md))]) ### Starting the backend @@ -24,18 +24,24 @@ The backend is configured via [Spring properties](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config) that need to be passed on startup, e.g. via command line argument. You need to set: -* the database URL, username and password: + +- the database URL, username and password: + ``` --spring.datasource.url=jdbc:postgresql://localhost:5432/loculus --spring.datasource.username=postgres --spring.datasource.password=unsecure ``` -* the path to the config file (use `../generate_local_test_config.sh` to generate this file): + +- the path to the config file (use `../generate_local_test_config.sh` to generate this file): + ``` --loculus.config.path=../website/tests/config/backend_config.json ``` -* the url to fetch the public key for JWT verification + +- the url to fetch the public key for JWT verification (corresponding to the `jwks_uri` value in the `/.well-known/openid-configuration` endpoint of the Keycloak server): + ``` --spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8083/realms/loculus/protocol/openid-connect/certs ``` @@ -44,13 +50,15 @@ We use Flyway, so that the service can provision an empty/existing DB without an The service listens, by default, to **port 8079**: . +Note: When using a postgresSQL development platform (e.g. pgAdmin) the hostname is 127.0.0.1 and not localhost - this is defined in the `deploy.py` file. + ### Operating the backend behind a proxy When running the backend behind a proxy, the proxy needs to set X-Forwarded headers: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Prefix +- X-Forwarded-For +- X-Forwarded-Proto +- X-Forwarded-Prefix ## Development @@ -98,7 +106,7 @@ The backend provides a Swagger UI at dag.png +``` + +![snakemake DAG](dag.png) + ### Download data from NCBI virus Using NCBI `datasets` CLI, download all sequences and corresponding NCBI curated metadata for a configurable taxon. The taxon is specified using the NCBI Taxonomy ID, and includes all child taxa, i.e. dowloading sequences for the Ebola virus taxon ID includes all sequences for more specific Ebola virus (sub)species taxon ids. diff --git a/ingest/dag.png b/ingest/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..26667977be9839e3ede4ec06ce3237a606c05532 GIT binary patch literal 52980 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 literal 0 HcmV?d00001 diff --git a/kubernetes/README.md b/kubernetes/README.md index 2b2543a8d..f98ed30f0 100644 --- a/kubernetes/README.md +++ b/kubernetes/README.md @@ -32,6 +32,7 @@ helm install loculus kubernetes/loculus -f my-values.yaml Install [k3d](https://k3d.io/v5.6.0/) and [helm](https://helm.sh/). +We deploy kubernetes via the `../deploy.py` script, this requires you to have `pyyaml` and `requests` installed. We recommend following the steps in [ingest](/ingest/README.md) to activate the loculus-ingest mamba environment which includes these packages, but the packages can also be installed individually. ### Setup for local development