diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..e8b2bb26 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +.PHONY: dev +dev: + docker compose --profile central -f docker-compose.yml -f docker-compose.dev.yml up -d + +.PHONY: upgrade-successful +upgrade-successful: + docker compose exec postgres14 touch /var/lib/odk/postgresql/14/.postgres14-upgrade-successful + +.PHONY: stop +stop: + docker compose stop diff --git a/README.md b/README.md index 2cfe34dd..cb94de91 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ In addition to the Backend and the Frontend, Central deploys services: * Central relies on [pyxform-http](https://github.com/getodk/pyxform-http) for converting Forms from XLSForm. It generally shouldn't be needed in development but can be run locally. * Central relies on [Enketo](https://github.com/enketo/enketo-express) for Web Form functionality. Enketo can be run locally and configured to work with Frontend and Backend in development by following [these instructions](https://github.com/getodk/central-frontend/blob/master/docs/enketo.md). +If you want to work on Central codebase and don't want to setup dependent services like Postgresql, Enketo, etc manually then you can run `make dev`, which will start those services as Docker containers. If you are setting up development environment for the first time, please run `make upgrade-successful` to skip the Postgresql upgrade. + Operations ---------- diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..0f8c88e1 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,51 @@ +# Assumption: This file will be merged by `docker compose` +# +# What it does: +# Sets profiles for each service depending on whether that +# service is required for development of that particular application +# For Central be/fe development, we need postgres14, pyxform, enketo, redis_main +# For Enketo development, we need postgres14, service, nginx, redis_main +# 'none' profile is set for services that are not need for either +# +# depends_on of some services are reset using !reset custom yml tag +# nb: can't replace depends_on so we have removed all the values, ok for dev +services: + postgres14: + profiles: + - central + network_mode: host + postgres: + profiles: + - none + mail: + profiles: + - none + service: + profiles: + - none + nginx: + profiles: + - none + pyxform: + profiles: + - central + # changing port here - can't use `ports` mapping with host networking + command: ["gunicorn", "--bind", "0.0.0.0:5001", "--workers", "5", "--timeout", "600", "--max-requests", "1", "--max-requests-jitter", "3", "main:app()"] + network_mode: host + secrets: + profiles: + - none + enketo: + profiles: + - central + depends_on: !reset [] + environment: + - ENV=DEV + network_mode: host + enketo_redis_main: + profiles: + - central + network_mode: host + enketo_redis_cache: + profiles: + - none diff --git a/files/enketo/start-enketo.sh b/files/enketo/start-enketo.sh index b9a43ac0..08829969 100755 --- a/files/enketo/start-enketo.sh +++ b/files/enketo/start-enketo.sh @@ -3,6 +3,15 @@ CONFIG_PATH=${ENKETO_SRC_DIR}/config/config.json echo "generating enketo configuration..." +if [ "$ENV" = "DEV" ]; then + sed -i -e 's/enketo_redis_main/localhost/g' \ + -e 's/enketo_redis_cache/localhost/g' \ + -e 's/6380/6379/g' \ + -e 's/${SECRET}/s0m3v3rys3cr3tk3y/g' \ + -e 's/${LESS_SECRET}/this $3cr3t key is crackable/g' \ + -e 's/${API_KEY}/enketorules/g' "$CONFIG_PATH.template" +fi + BASE_URL=$( [ "${HTTPS_PORT}" = 443 ] && echo https://"${DOMAIN}" || echo https://"${DOMAIN}":"${HTTPS_PORT}" ) \ SECRET=$(cat /etc/secrets/enketo-secret) \ LESS_SECRET=$(cat /etc/secrets/enketo-less-secret) \ diff --git a/files/postgres14/start-postgres.sh b/files/postgres14/start-postgres.sh index 972c6147..978f6c4c 100755 --- a/files/postgres14/start-postgres.sh +++ b/files/postgres14/start-postgres.sh @@ -1,7 +1,7 @@ #!/bin/bash -eu set -o pipefail -flag_upgradeCompletedOk="$PGDATA/../.postgres14-upgrade-successful" +flag_upgradeCompletedOk=$(readlink -f -m "$PGDATA/../.postgres14-upgrade-successful") logPrefix="$(basename "$0")" log() {