From 653117fcb7d1a7e5b12579b5d73611d6e26083c8 Mon Sep 17 00:00:00 2001 From: Jenny Danzmayr Date: Fri, 8 Dec 2023 00:41:14 +0100 Subject: [PATCH] added docker compose file --- deployment/docker/.gitignore | 2 + deployment/docker/compose.yaml | 154 ++++++++++++++++++++++++++++++++ deployment/docker/example.env | 6 ++ deployment/docker/prepare.sh | 25 ++++++ deployment/docker/update_tag.sh | 3 + 5 files changed, 190 insertions(+) create mode 100644 deployment/docker/.gitignore create mode 100644 deployment/docker/compose.yaml create mode 100644 deployment/docker/example.env create mode 100755 deployment/docker/prepare.sh create mode 100755 deployment/docker/update_tag.sh diff --git a/deployment/docker/.gitignore b/deployment/docker/.gitignore new file mode 100644 index 00000000..af4d511d --- /dev/null +++ b/deployment/docker/.gitignore @@ -0,0 +1,2 @@ +/.env +/data diff --git a/deployment/docker/compose.yaml b/deployment/docker/compose.yaml new file mode 100644 index 00000000..8e568adb --- /dev/null +++ b/deployment/docker/compose.yaml @@ -0,0 +1,154 @@ +version: '3' +name: c3nav + +x-restart-policy: &restart-policy + restart: unless-stopped +x-depends_on-default: &depends_on + condition: service_started +x-depends_on-healthy: &depends_on-healthy + condition: service_healthy +x-healthcheck_defaults: &healthcheck_defaults + interval: 10s + timeout: 2s + retries: 5 + start_period: 5s +x-c3nav-defaults: &c3nav-defaults + build: + context: ../../ + dockerfile: docker/Dockerfile + image: ghcr.io/c3nav/c3nav:${C3NAV_TAG} + depends_on: + redis: + <<: *depends_on-healthy + postgres: + <<: *depends_on-healthy + volumes: + - type: bind + source: ${C3NAV_DOCKER_DATA_DIR:-./data} + target: /data + bind: + create_host_path: true +x-c3nav-environment: &c3nav-environment + C3NAV_DEBUG: false + C3NAV_LOGLEVEL: info + C3NAV_CONFIG: /data/c3nav.cfg + C3NAV_DATA_DIR: /data + C3NAV_DJANGO_ALLOWED_HOSTS: localhost,127.0.0.1,c3nav-core,c3nav-tiles,${C3NAV_DJANGO_ALLOWED_HOSTS:-""},${C3NAV_DOMAIN} + C3NAV_DJANGO_REVERSE_PROXY: "true" + UWSGI_WORKERS: ${C3NAV_CORE_WORKERS:-2} + C3NAV_DATABASE_BACKEND: postgresql + C3NAV_DATABASE_NAME: ${C3NAV_DATABASE_NAME:-c3nav} + C3NAV_DATABASE_USER: ${C3NAV_DATABASE_USER:-postgres} + C3NAV_DATABASE_HOST: postgres + C3NAV_REDIS: "redis://redis:6379/0" + C3NAV_CELERY_BROKER: "redis://redis:6379/1" + C3NAV_CELERY_BACKEND: "redis://redis:6379/2" + +x-c3nav-develop: &c3nav-develop + watch: + - path: ../../src + action: sync+restart + target: /app + ignore: + - "*.pyc" + - /data + - c3nav.cfg + + +services: + c3nav-core: + <<: [*restart-policy, *c3nav-defaults] + command: webstatic-async + environment: + <<: *c3nav-environment + C3NAV_AUTOMIGRATE: yes + healthcheck: + <<: *healthcheck_defaults + test: curl -f http://localhost:8000/ + labels: + - traefik.enable=true + - traefik.http.services.c3nav-core.loadbalancer.server.port=8000 + - traefik.http.routers.c3nav.rule=PathPrefix(`/`) + - traefik.http.routers.c3nav.entrypoints=websecure + - traefik.http.routers.c3nav.middlewares=add-hsts-header + - traefik.http.middlewares.add-hsts-header.headers.stsseconds=63072000 + - traefik.http.middlewares.add-hsts-header.headers.stspreload=true + - traefik.http.middlewares.add-hsts-header.headers.stsincludesubdomains=true + expose: + - "8000" + #- "5000" + develop: + <<: *c3nav-develop + + c3nav-workers: + <<: [*restart-policy, *c3nav-defaults] + command: worker + environment: + <<: *c3nav-environment + C3NAV_AUTOMIGRATE: no + healthcheck: + interval: 30s + timeout: 15s + retries: 2 + start_period: 5s + test: entrypoint worker_healthcheck + develop: + <<: *c3nav-develop + + postgres: + image: postgres:16 + healthcheck: + <<: *healthcheck_defaults + test: pg_isready -U postgres + environment: + POSTGRES_DB: ${C3NAV_DATABASE_NAME:-c3nav} + POSTGRES_HOST_AUTH_METHOD: "trust" + volumes: + - "c3nav-postgres:/var/lib/postgresql/data" + + redis: + image: redis:7.2 + command: redis-server --save 60 1 --loglevel warning + healthcheck: + <<: *healthcheck_defaults + test: redis-cli ping + volumes: + - "c3nav-redis:/data" + ulimits: + nofile: + soft: 10032 + hard: 10032 + + traefik: + image: traefik:${TRAEFIK_TAG:-v2.10} + # Enables the web UI and tells Traefik to listen to docker + command: + - --api.insecure=true + - --api.dashboard=true + - --providers.docker + - --providers.docker.exposedByDefault=false + - --providers.docker.allowEmptyServices=true + - --entrypoints.web.address=:8080/tcp + - --entrypoints.web.http.redirections.entryPoint.to=websecure + - --entrypoints.web.http.redirections.entryPoint.scheme=https + - --entrypoints.websecure.address=:8443/tcp + - --entrypoints.websecure.http.tls=true + - --entrypoints.traefik.address=:9000/tcp + ports: + # The HTTP port + - "8080:8080" + # The HTTPS port + - "8443:8443" + # The Web UI (enabled by --api.insecure=true) + - "127.0.0.1:9000:9000" + volumes: + # So that Traefik can listen to the Docker events + - type: bind + source: /run/docker.sock + target: /var/run/docker.sock + +volumes: + c3nav-postgres: + external: true + c3nav-redis: + external: true diff --git a/deployment/docker/example.env b/deployment/docker/example.env new file mode 100644 index 00000000..de921177 --- /dev/null +++ b/deployment/docker/example.env @@ -0,0 +1,6 @@ +C3ANV_TAG=latest +C3NAV_DOMAIN=c3nav.docker.localhost +# to change the default database name +#C3NAV_DATABASE_NAME=c3nav-37c3 +# if you want to change the default path to the data dir, which by default is a folder called data in this directory +#C3NAV_DOCKER_DATA_DIR=some path \ No newline at end of file diff --git a/deployment/docker/prepare.sh b/deployment/docker/prepare.sh new file mode 100755 index 00000000..2e667352 --- /dev/null +++ b/deployment/docker/prepare.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -e + +COMMIT="$(git rev-parse HEAD)" + +echo "creating data directory" +mkdir -p data + +echo "making sure there is a c3nav.cfg in the data dir" +touch data/c3nav.cfg + +echo "changing permissions to match container permissions" +set -x +sudo chgrp -R 500 data +sudo chmod -R g+rwX data +set +x + +if [[ ! -f .env ]]; then + echo "copying example env file" + cp example.env .env +fi +echo "updating tag" +sed -i "s/C3NAV_TAG=.*/C3NAV_TAG=${COMMIT}/g" .env + +echo "DONE! You can now run \"docker compose up\" to start a test instance" diff --git a/deployment/docker/update_tag.sh b/deployment/docker/update_tag.sh new file mode 100755 index 00000000..a8c0a334 --- /dev/null +++ b/deployment/docker/update_tag.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +sed -i "s/C3NAV_TAG=.*/C3ANV_TAG=$(git rev-parse HEAD)/g" .env