version: "3.2" services: # webserver to handle all traffic. This can use let's encrypt to generate a SSL cert. traefik: image: traefik:1.7 command: - --loglevel=INFO - --api # Entrypoints - --defaultentrypoints=https,http - --entryPoints=Name:http Address::${TRAEFIK_HTTP_PORT:-8000} ${TRAEFIK_HTTP_REDIRECT:-""} - --entryPoints=Name:https Address::${TRAEFIK_HTTPS_PORT:-8443} ${TRAEFIK_HTTPS_OPTIONS:-TLS} # Configuration for acme (https://letsencrypt.org/) - --acme=${TRAEFIK_ACME_ENABLE:-false} #- --acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory - --acme.email=${TRAEFIK_ACME_EMAIL:-""} - --acme.entrypoint=https - --acme.onhostrule=true - --acme.storage=/config/acme.json - --acme.httpchallenge.entrypoint=http - --acme.storage=/config/acme.json - --acme.acmelogging=true # DOCKER - --docker=true - --docker.endpoint=unix:///var/run/docker.sock - --docker.exposedbydefault=false - --docker.watch=true restart: unless-stopped networks: - pecan ports: - "${TRAEFIK_HTTP_PORT-8000}:${TRAEFIK_HTTP_PORT:-8000}" - "${TRAEFIK_HTTPS_PORT-8443}:${TRAEFIK_HTTPS_PORT:-8443}" labels: - "traefik.enable=true" - "traefik.backend=traefik" - "traefik.port=8080" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefixStrip: /traefik" - "traefik.website.frontend.whiteList.sourceRange=${TRAEFIK_IPFILTER:-172.16.0.0/12}" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - traefik:/config # ---------------------------------------------------------------------- # Access to the files generated and used by PEcAn, both through a # web interface (minio) as well using the thredds server. # ---------------------------------------------------------------------- # webserver to handle access to data minio: user: "${UID:-1001}:${GID:-1001}" image: minio/minio:latest command: server /data restart: unless-stopped networks: - pecan environment: - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY:-carya} - MINIO_SECRET_KEY=${MINIO_SECRET_KEY:-illinois} labels: - "traefik.enable=true" - "traefik.backend=minio" - "traefik.port=9000" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/minio/" volumes: - pecan:/data # THREDDS data server thredds: user: "${UID:-1001}:${GID:-1001}" image: pecan/thredds:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan volumes: - pecan:/data labels: - "traefik.enable=true" - "traefik.port=8080" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/thredds" - "traefik.backend=thredds" # ---------------------------------------------------------------------- # Job management system. Jobs are distributed through the message # system. PEcAn uses this to distribute the work/load across multiple # containers. # ---------------------------------------------------------------------- # rabbitmq to connect to extractors rabbitmq: image: rabbitmq:3.8-management restart: unless-stopped networks: - pecan environment: - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbitmq_management path_prefix "/rabbitmq" - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER:-guest} - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS:-guest} labels: - "traefik.enable=true" - "traefik.backend=rabbitmq" - "traefik.port=15672" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/rabbitmq" - "traefik.website.frontend.whiteList.sourceRange=${TRAEFIK_IPFILTER:-172.16.0.0/12}" volumes: - rabbitmq:/var/lib/rabbitmq # ---------------------------------------------------------------------- # Database to hold the data from PEcAn and BETY. # ---------------------------------------------------------------------- # postgresql + postgis to hold all the data postgres: image: mdillon/postgis:9.5 restart: unless-stopped networks: - pecan volumes: - postgres:/var/lib/postgresql/data # ---------------------------------------------------------------------- # BETY rails frontend to the database # ---------------------------------------------------------------------- bety: image: pecan/bety:${BETY_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - UNICORN_WORKER_PROCESSES=1 - SECRET_KEY_BASE=${BETY_SECRET_KEY:-notasecret} - RAILS_RELATIVE_URL_ROOT=/bety - LOCAL_SERVER=${BETY_LOCAL_SERVER:-99} depends_on: - postgres labels: - "traefik.enable=true" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/bety/" - "traefik.backend=bety" # ---------------------------------------------------------------------- # RStudio # ---------------------------------------------------------------------- rstudio: image: pecan/base:${PECAN_VERSION:-latest} command: /work/rstudio.sh restart: unless-stopped networks: - pecan depends_on: - rabbitmq - postgres environment: - KEEP_ENV=RABBITMQ_URI RABBITMQ_PREFIX RABBITMQ_PORT FQDN NAME - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} - RABBITMQ_PREFIX=/rabbitmq - RABBITMQ_PORT=15672 - FQDN=${PECAN_FQDN:-docker} - NAME=${PECAN_NAME:-docker} - USER=${PECAN_RSTUDIO_USER:-carya} - PASSWORD=${PECAN_RSTUDIO_PASS:-illinois} - USERID=${UID:-1001} - GROUPID=${GID:-1001} volumes: - pecan:/data - rstudio:/home labels: - "traefik.enable=true" - "traefik.backend=rstudio" - "traefik.port=80" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefixStrip:/rstudio" # ---------------------------------------------------------------------- # PEcAn application # ---------------------------------------------------------------------- # PEcAn documentation as well as PEcAn home page docs: image: pecan/docs:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan labels: - "traefik.enable=true" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/" - "traefik.backend=docs" # PEcAn web front end, this is just the PHP code web: user: "${UID:-1001}:${GID:-1001}" image: pecan/web:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} - FQDN=${PECAN_FQDN:-docker} - NAME=${PECAN_NAME:-docker} - SECRET_KEY_BASE=${BETY_SECRET_KEY:-thisisnotasecret} depends_on: - postgres - rabbitmq labels: - "traefik.port=8080" - "traefik.enable=true" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/pecan/" - "traefik.backend=pecan" volumes: - pecan:/data - pecan:/var/www/html/pecan/data # PEcAn model monitor monitor: user: "${UID:-1001}:${GID:-1001}" image: pecan/monitor:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} - FQDN=${PECAN_FQDN:-docker} depends_on: - rabbitmq labels: - "traefik.enable=true" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefixStrip:/monitor/" - "traefik.backend=monitor" volumes: - pecan:/data # PEcAn executor, executes jobs. Does not the actual models executor: user: "${UID:-1001}:${GID:-1001}" image: pecan/executor:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} - RABBITMQ_PREFIX=/rabbitmq - RABBITMQ_PORT=15672 - FQDN=${PECAN_FQDN:-docker} depends_on: - postgres - rabbitmq volumes: - pecan:/data # ---------------------------------------------------------------------- # PEcAn models, list each model you want to run below # ---------------------------------------------------------------------- # PEcAn basgra model runner basgra: user: "${UID:-1001}:${GID:-1001}" image: pecan/model-basgra-basgra_n_v1.0:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} depends_on: - rabbitmq volumes: - pecan:/data # PEcAn sipnet model runner sipnet: user: "${UID:-1001}:${GID:-1001}" image: pecan/model-sipnet-r136:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} depends_on: - rabbitmq volumes: - pecan:/data # PEcAn ED model runner ed2: user: "${UID:-1001}:${GID:-1001}" image: pecan/model-ed2-2.2.0:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} depends_on: - rabbitmq volumes: - pecan:/data # PEcAn MAESPA model runner maespa: user: "${UID:-1001}:${GID:-1001}" image: pecan/model-maespa-git:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan environment: - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} depends_on: - rabbitmq volumes: - pecan:/data # ---------------------------------------------------------------------- # Shiny Apps # ---------------------------------------------------------------------- # PEcAn DB Sync visualization dbsync: image: pecan/shiny-dbsync:${PECAN_VERSION:-latest} restart: unless-stopped networks: - pecan depends_on: - postgres labels: - "traefik.enable=true" - "traefik.backend=dbsync" - "traefik.port=3838" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefixStrip:/dbsync/" # ---------------------------------------------------------------------- # PEcAn API # ---------------------------------------------------------------------- api: image: pecan/api:${PECAN_VERSION:-latest} user: "${UID:-1001}:${GID:-1001}" networks: - pecan environment: - PGHOST=${PGHOST:-postgres} - HOST_ONLY=${HOST_ONLY:-FALSE} - AUTH_REQ=${AUTH_REQ:-TRUE} - RABBITMQ_URI=${RABBITMQ_URI:-amqp://guest:guest@rabbitmq/%2F} - DATA_DIR=${DATA_DIR:-/data/} - DBFILES_DIR=${DBFILES_DIR:-/data/dbfiles/} - SECRET_KEY_BASE=${BETY_SECRET_KEY:-thisisnotasecret} labels: - "traefik.enable=true" - "traefik.frontend.rule=${TRAEFIK_HOST:-}PathPrefix:/api" - "traefik.backend=api" - "traefik.port=8000" depends_on: - postgres volumes: - pecan:/data/ # ---------------------------------------------------------------------- # Name of network to be used by all containers # ---------------------------------------------------------------------- networks: pecan: # ---------------------------------------------------------------------- # Volumes used by the PEcAn stack. These volumes are used to make sure # we have persistent data. You can use add the commented section to your # docker-compose.override.yml to have the docker volumes placed at a # specific location. # ---------------------------------------------------------------------- volumes: traefik: postgres: rabbitmq: pecan: rstudio: