!!! info "Community Contributed" The examples in this section were contributed by members of the community. This page especially contains some setups that might help you if you really want to go down a certain path but none of the examples are supported (as I simply am not able to give you support for them). ## Apache + Traefik + Sub-Path This guide was contributes by [incaseoftrouble](https://github.com/incaseoftrouble) in [Issue #266](https://github.com/vabene1111/recipes/issues/266) My setup is docker-compose / traefik / apache / recipes. Swapping out apache for nginx should be straightforward. Relevant parts: docker-compose: ```yaml apache: # omitting other config volumes: - ./recipes/static:/var/www/recipes/static:ro - ./recipes/media:/var/www/recipes/media:ro labels: traefik.enable: true traefik.http.routers.apache-recipes.rule: Host(``) && PathPrefix(`/`) traefik.http.routers.apache-recipes.entrypoints: http traefik.http.routers.apache-recipes.service: apache traefik.http.services.apache.loadbalancer.server.port: 80 traefik.http.services.apache.loadbalancer.server.scheme: http ... recipes: volumes: - ./recipes/static:/opt/recipes/staticfiles:rw - ./recipes/media:/opt/recipes/mediafiles:rw environment: # all the other env - SCRIPT_NAME=/ - JS_REVERSE_SCRIPT_PREFIX=// - STATIC_URL=//static/ - MEDIA_URL=//media/ labels: traefik.enable: true traefik.http.routers.recipes.rule: Host(``) && PathPrefix(`/`) traefik.http.routers.recipes.entrypoints: http traefik.http.services.recipes.loadbalancer.server.port: 8080 traefik.http.services.recipes.loadbalancer.server.scheme: http ``` apache: ``` Alias //static/ /var/www/recipes/static/ Alias //media/ /var/www/recipes/media/ Require all granted ``` I used two paths `` and `` for simplicity. In my case I have ` = recipes` and ` = serve/recipes`. One could also change the matching rules of traefik to have everything under one path. I left out the TLS config in this example for simplicity. ## Docker + Apache + Sub-Path The following could prove to be useful if you are not using Traefik, but instead run Apache as your reverse proxy to route all calls for a shared (sub)domain to a sub path, e.g. https://mydomain.tld/tandoor As a side note, I am using [Blocky](https://0xerr0r.github.io/blocky/) + [Consul](https://hub.docker.com/r/hashicorp/consul) + [Registrator](https://hub.docker.com/r/gliderlabs/registrator) as a DNS solution. The relevant Apache config: ``` # in case you want to restrict access to specific IP addresses: Require local Require forward-dns [myhomedomain.useyourdomain.com] Require ip [anylocalorremoteipyouwanttowhitelist] # The following assumes that tandoor.service.consul.local resolves to the IP address of the Docker container. ProxyPass http://tandoor.service.consul.local:8080/tandoor ProxyPassReverse http://tandoor.service.consul.local:8080/tandoor RequestHeader add X-Script-Name /tandoor RequestHeader set X-Forwarded-Proto "https" ProxyPreserveHost On Require local Require forward-dns [myhomedomain.useyourdomain.com] Require ip [anylocalorremoteipyouwanttowhitelist] ProxyPass http://tandoor.service.consul.local:8080/tandoor/tandoor/static ProxyPassReverse http://tandoor.service.consul.local:8080/tandoor/static RequestHeader add X-Script-Name /tandoor RequestHeader set X-Forwarded-Proto "https" ProxyPreserveHost On ``` and the relevant section from the docker-compose.yml: ``` tandoor: restart: always container_name: tandoor image: vabene1111/recipes environment: - SCRIPT_NAME=/tandoor - JS_REVERSE_SCRIPT_PREFIX=/tandoor - STATIC_URL=/tandoor/static/ - MEDIA_URL=/tandoor/media/ - GUNICORN_MEDIA=0 - SECRET_KEY=${YOUR_TANDOOR_SECRET_KEY} - POSTGRES_HOST=postgres.service.consul.local - POSTGRES_PORT=${POSTGRES_PORT} - POSTGRES_USER=${YOUR_TANDOOR_POSTGRES_USER} - POSTGRES_PASSWORD=${YOUR_TANDOOR_POSTGRES_PASSWORD} - POSTGRES_DB=${YOUR_TANDOOR_POSTGRES_DB} labels: # The following is relevant only if you are using Registrator and Consul - "SERVICE_NAME=tandoor" volumes: - ${YOUR_DOCKER_VOLUME_BASE_DIR}/tandoor/static:/opt/recipes/staticfiles:rw # Do not make this a bind mount, see https://docs.tandoor.dev/install/docker/#volumes- vs-bind-mounts - tandoor_nginx_config:/opt/recipes/nginx/conf.d - ${YOUR_DOCKER_VOLUME_BASE_DIR}}/tandoor/media:/opt/recipes/mediafiles:rw depends_on: # You will have to set up postgres accordingly - postgres ``` The relevant docker-compose.yml for Registrator, Consul, and Blocky, and Autoheal: ``` consul: image: hashicorp/consul container_name: consul command: > agent -server -domain consul.local -advertise=${YOUR_DOCKER_HOST_IP_ON_THE_LAN} -client=0.0.0.0 -encrypt=${SOME_SECRET_KEY} -datacenter=${YOUR_DC_NAME} -bootstrap-expect=1 -ui -log-level=info environment: - "CONSUL_LOCAL_CONFIG={\"skip_leave_on_interrupt\": true, \"dns_config\": { \"service_ttl\": { \"*\": \"0s\" } } }" network_mode: "host" restart: always registrator: image: gliderlabs/registrator:latest container_name: registrator extra_hosts: - "host.docker.internal:host-gateway" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro command: > -internal -cleanup=true -deregister="always" -resync=60 consul://host.docker.internal:8500 restart: always blocky: image: spx01/blocky container_name: blocky restart: unless-stopped healthcheck: interval: 30s timeout: 5s start_period: 1m labels: # The following is only relevant if you use autoheal autoheal: true # Optional the instance hostname for logging purpose hostname: blocky extra_hosts: - "host.docker.internal:host-gateway" ports: - "1153:53/tcp" - "1153:53/udp" - 4000:4000 environment: - TZ=YOUR_TIMEZONE # Optional to synchronize the log timestamp with host volumes: # Optional to synchronize the log timestamp with host - /etc/localtime:/etc/localtime:ro # config file - ${YOUR_DOCKER_VOLUME_BASE_DIR}/blocky/config.yml:/app/config.yml networks: # in case you want to bind Blocky to an IP address your-docker-network-name: ipv4_address: 'some-ip-address-in-the-docker-network-subnet' autoheal: image: willfarrell/autoheal volumes: - '/var/run/docker.sock:/var/run/docker.sock' environment: - AUTOHEAL_CONTAINER_LABEL=autoheal restart: always container_name: autoheal ``` as well as a snippet of the Blocky configuration: ``` conditional: fallbackUpstream: false mapping: consul.local: tcp+udp:host.docker.internal:8600 ``` ## WSL If you want to install Tandoor on the Windows Subsystem for Linux you can find a detailed post here: .