Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add dev docker-compose file to manage supporting services #525

Open
wants to merge 1 commit into
base: next
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
----------

Expand Down
51 changes: 51 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove stale comment.

# '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
9 changes: 9 additions & 0 deletions files/enketo/start-enketo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason these env vars can't be handled in docker-compose.dev.yml?

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) \
Expand Down
2 changes: 1 addition & 1 deletion files/postgres14/start-postgres.sh
Original file line number Diff line number Diff line change
@@ -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")
Copy link
Contributor Author

@sadiqkhoja sadiqkhoja Nov 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

data directory is not there when running for the first time without postgres upgrade. Another approach is to create the data directory if it's absent via make upgrade-successful

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens currently when the "data" directory is missing?


logPrefix="$(basename "$0")"
log() {
Expand Down