diff --git a/compose.local.yml b/compose.local.yml new file mode 100644 index 000000000..54ced9ea2 --- /dev/null +++ b/compose.local.yml @@ -0,0 +1,8 @@ +include: + - path: docker/app.default.yml + env_file: + - .env.default + - path: docker/env.local.yml + env_file: + - .env.local + - .env.default diff --git a/compose.net.yml b/compose.net.yml new file mode 100644 index 000000000..a97dff2cb --- /dev/null +++ b/compose.net.yml @@ -0,0 +1,7 @@ +name: funkwhale-services +include: + - path: docker/net.dnsmasq.yml + - path: docker/net.traefik.yml + # uncomment on Linux hosts with empty docker0 bridges, which else are DOWN + # - path: docker/net.helpers.resolved.yml + - path: docker/net.verify.yml diff --git a/compose.single-node.yml b/compose.single-node.yml deleted file mode 100644 index 9e3530269..000000000 --- a/compose.single-node.yml +++ /dev/null @@ -1,43 +0,0 @@ -networks: - internal: - federation: - external: true - -x-django: &django - -services: - front: - ports: - - "${VUE_PORT:-8080}" - - api: - env_file: - - .env.single-node - - .env.dev - - .env - environment: - - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME:-localhost}" - - "FUNKWHALE_PROTOCOL=${FUNKWHALE_PROTOCOL:-http}" - - "FUNKWHALE_PORT=${FUNKWHALE_PORT:-8000}" - - "DATABASE_URL=postgresql://postgres@postgres/postgres" - - "CACHE_URL=redis://redis:6379/0" - - "STATIC_ROOT=/staticfiles" - extra_hosts: [] - - celeryworker: - env_file: - - .env.single-node - - .env.dev - - .env - environment: - - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME:-localhost}" - - "FUNKWHALE_PROTOCOL=${FUNKWHALE_PROTOCOL:-http}" - - "FUNKWHALE_PORT=${FUNKWHALE_PORT:-8000}" - - "DATABASE_URL=postgresql://postgres@postgres/postgres" - - "CACHE_URL=redis://redis:6379/0" - extra_hosts: [] - - nginx: - ports: - - "${NGINX_PORTS_MAPPING:-8000:80}" - labels: {} diff --git a/compose.yml b/compose.yml index df9c2e490..5b485f398 100644 --- a/compose.yml +++ b/compose.yml @@ -1,134 +1,8 @@ -networks: - internal: - federation: - external: true - -x-django: &django - env_file: - - .env.dev - - .env - build: - context: ./api - dockerfile: Dockerfile - args: - install_dev_deps: 1 - image: funkwhale-api - volumes: - - ./api:/app - - "${MUSIC_DIRECTORY_SERVE_PATH-./data/music}:/music:ro" - - "./data/plugins:/srv/funkwhale/plugins" - - "./data/staticfiles:/staticfiles" - - "./data/media:/data/media" - environment: - - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME:-localhost}" - - "FUNKWHALE_HOSTNAME_SUFFIX=funkwhale.test" - - "FUNKWHALE_HOSTNAME_PREFIX=${COMPOSE_PROJECT_NAME}" - - "FUNKWHALE_PROTOCOL=${FUNKWHALE_PROTOCOL:-http}" - - "DATABASE_URL=postgresql://postgres@postgres/postgres" - - "CACHE_URL=redis://redis:6379/0" - - "STATIC_ROOT=/staticfiles" - depends_on: - - postgres - - redis - networks: - - internal - extra_hosts: - - "node1.funkwhale.test:host-gateway" - - "node2.funkwhale.test:host-gateway" - - "node3.funkwhale.test:host-gateway" - -services: - front: - build: - context: front - dockerfile: Dockerfile.dev +include: + - path: docker/app.default.yml env_file: - - .env.dev - - .env - environment: - - "HOST=0.0.0.0" - - "VUE_PORT=${VUE_PORT:-8080}" - volumes: - - "./front:/app" - - "/app/node_modules" - - "./po:/po" - networks: - - internal - command: "yarn dev --host" - - postgres: - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 10s - timeout: 5s - retries: 5 + - .env.default + - path: docker/env.federation.yml env_file: - - .env.dev - - .env - image: postgres:${POSTGRES_VERSION:-15}-alpine - environment: - - "POSTGRES_HOST_AUTH_METHOD=trust" - command: postgres ${POSTGRES_ARGS:-} - volumes: - - "./data/${COMPOSE_PROJECT_NAME:-node1}/postgres:/var/lib/postgresql/data" - networks: - - internal - - redis: - env_file: - - .env.dev - - .env - image: redis:7-alpine - volumes: - - "./data/${COMPOSE_PROJECT_NAME:-node1}/redis:/data" - networks: - - internal - - api: - <<: *django - command: > - bash -c "funkwhale-manage collectstatic --no-input - && uvicorn --reload config.asgi:application --host 0.0.0.0 --port 5000 --reload-dir config/ --reload-dir=funkwhale_api/" - cap_add: - - SYS_PTRACE - - celeryworker: - <<: *django - command: celery -A funkwhale_api.taskapp worker -l debug -B --concurrency=${CELERYD_CONCURRENCY-0} - - nginx: - env_file: - - .env.dev - - .env - image: nginx - environment: - - "NGINX_MAX_BODY_SIZE=${NGINX_MAX_BODY_SIZE:-100M}" - - "FUNKWHALE_API_HOST=${FUNKWHALE_API_HOST:-api}" - - "FUNKWHALE_API_PORT=${FUNKWHALE_API_PORT:-5000}" - - "FUNKWHALE_FRONT_IP=${FUNKWHALE_FRONT_IP:-front}" - - "FUNKWHALE_FRONT_PORT=${VUE_PORT:-8080}" - - "COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}" - - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME:-localhost}" - - "STATIC_ROOT=/staticfiles" - depends_on: - - api - - front - volumes: - - ./docker/nginx/conf.dev:/etc/nginx/templates/default.conf.template:ro - - "${MUSIC_DIRECTORY_SERVE_PATH:-./data/music}:/music:ro" - - ./deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro - - "./front:/frontend:ro" - - "./data/staticfiles:/usr/share/nginx/html/staticfiles:ro" - - "./data/media:/protected/media:ro" - networks: - - federation - - internal - - labels: - traefik.backend: "${COMPOSE_PROJECT_NAME}" - traefik.frontend.rule: "Host:${COMPOSE_PROJECT_NAME}.funkwhale.test" - traefik.enable: "true" - traefik.federation.protocol: "http" - traefik.federation.port: "80" - traefik.frontend.passHostHeader: true - traefik.docker.network: federation + - .env.federation + - .env.default diff --git a/docker/app.default.yml b/docker/app.default.yml new file mode 100644 index 000000000..15bf2308d --- /dev/null +++ b/docker/app.default.yml @@ -0,0 +1,49 @@ +networks: + internal: + federation: + external: true + +services: + front: + build: + context: ../front + dockerfile: Dockerfile.dev + ports: + - "${VUE_PORT:-8080}:${VUE_PORT:-8080}" + environment: + - HOST + - VUE_PORT + volumes: + - "../front:/app" + - "/app/node_modules" + - "../po:/po" + networks: + - internal + command: "yarn dev --host" + + postgres: + image: "postgres:${POSTGRES_VERSION:-15}-alpine" + environment: + - POSTGRES_HOST_AUTH_METHOD + command: postgres ${POSTGRES_ARGS:-} + volumes: + - "../data/${COMPOSE_PROJECT_NAME:-funkwhale}/postgres:/var/lib/postgresql/data" + networks: + - internal + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + + redis: + image: redis:7-alpine + volumes: + - "../data/${COMPOSE_PROJECT_NAME:-funkwhale}/redis:/data" + networks: + - internal + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 3 diff --git a/docker/app.django.yml b/docker/app.django.yml new file mode 100644 index 000000000..a0130574b --- /dev/null +++ b/docker/app.django.yml @@ -0,0 +1,32 @@ +x-django: &django + image: funkwhale-api + volumes: + - ../api:/app + - "${MUSIC_DIRECTORY_SERVE_PATH-../data/music}:/music:ro" + - "../data/plugins:/srv/funkwhale/plugins" + - "../data/staticfiles:/staticfiles" + - "../data/media:/protected/media" + - "../data/${COMPOSE_PROJECT_NAME}/media:/data/media" + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + networks: + - internal + +services: + api: + <<: *django + build: + context: ../api + dockerfile: Dockerfile + args: + install_dev_deps: 1 + command: > + bash -c "funkwhale-manage collectstatic --no-input + && uvicorn --reload config.asgi:application --host 0.0.0.0 --port 5000 --reload-dir config/ --reload-dir=funkwhale_api/" + + celeryworker: + <<: *django + command: celery -A funkwhale_api.taskapp worker -l debug -B --concurrency=${CELERYD_CONCURRENCY} diff --git a/docker/app.nginx.yml b/docker/app.nginx.yml new file mode 100644 index 000000000..a261e3233 --- /dev/null +++ b/docker/app.nginx.yml @@ -0,0 +1,18 @@ +services: + nginx: + image: nginx + depends_on: + - api + - front + volumes: + - "${MUSIC_DIRECTORY_SERVE_PATH:-../data/music}:${MUSIC_DIRECTORY_PATH:-/music}:ro" + + - ./etc/nginx/conf.dev:/etc/nginx/templates/default.conf.template:ro + - ../deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro + + - ../front:/frontend:ro + - ../data/staticfiles:/usr/share/nginx/html/staticfiles:ro + - ../data/media:/protected/media:ro + - ../data/${COMPOSE_PROJECT_NAME}/media:/data/media:ro + networks: + - internal diff --git a/docker/env.federation.yml b/docker/env.federation.yml new file mode 100644 index 000000000..2ac0fe5f6 --- /dev/null +++ b/docker/env.federation.yml @@ -0,0 +1,86 @@ +networks: + internal: + federation: + external: true + +x-federation: &federation + environment: + - DEBUG + + - DJANGO_SETTINGS_MODULE + - DJANGO_SECRET_KEY + + - EXTERNAL_REQUESTS_VERIFY_SSL + + - "FORCE_HTTPS_URLS=${FORCE_HTTPS_URLS:-False}" + - FUNKWHALE_PROTOCOL + - "FUNKWHALE_HOSTNAME=${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}" + + - DATABASE_URL + - CACHE_URL + + - "STATIC_URL=${FUNKWHALE_PROTOCOL}://${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}/static/" + - "MEDIA_URL=${FUNKWHALE_PROTOCOL}://${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}/media/" + + - STATIC_ROOT + - MEDIA_ROOT + + - FUNKWHALE_SPA_HTML_ROOT + - LDAP_ENABLED + - BROWSABLE_API_ENABLED + + - C_FORCE_ROOT + - PYTHONDONTWRITEBYTECODE + - PYTHONTRACEMALLOC + + dns: 172.17.0.1 + dns_search: funkwhale.test + +services: + api: + extends: + file: ./app.django.yml + service: api + <<: *federation + + celeryworker: + extends: + file: ./app.django.yml + service: celeryworker + <<: *federation + + nginx: + extends: + file: ./app.nginx.yml + service: nginx + environment: + - "MUSIC_DIRECTORY_PATH=${MUSIC_DIRECTORY_PATH:-/music}" + - "FUNKWHALE_HOSTNAME=${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}" + + - FUNKWHALE_PROTOCOL + + - FUNKWHALE_API_HOST + - FUNKWHALE_API_PORT + + - FUNKWHALE_FRONT_IP + - FUNKWHALE_FRONT_PORT + + - NGINX_MAX_BODY_SIZE + + - STATIC_ROOT + - "MEDIA_ROOT=${MEDIA_ROOT:-/data/media}" + networks: + - federation + - internal + + labels: + - "traefik.enable=true" + + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-web.rule=Host(`${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}`)" + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-web.entrypoints=web" + + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-webs.rule=Host(`${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}`)" + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-webs.entrypoints=webs" + + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-webs.tls=true" + - "traefik.http.routers.funkwhale-${COMPOSE_PROJECT_NAME:-funkwhale}-webs.tls.domains[0].main=${COMPOSE_PROJECT_NAME:-funkwhale}.${FUNKWHALE_DOMAIN}" diff --git a/docker/env.local.yml b/docker/env.local.yml new file mode 100644 index 000000000..267638eb7 --- /dev/null +++ b/docker/env.local.yml @@ -0,0 +1,69 @@ +networks: + internal: + +x-local: &local + environment: + - DEBUG + + - DJANGO_SETTINGS_MODULE + - DJANGO_SECRET_KEY + + - "FORCE_HTTPS_URLS=${FORCE_HTTPS_URLS:-False}" + - FUNKWHALE_PROTOCOL + - FUNKWHALE_HOSTNAME + - FUNKWHALE_PORT + + - DATABASE_URL + - CACHE_URL + + - STATIC_URL + - MEDIA_URL + + - STATIC_ROOT + - MEDIA_ROOT + + - FUNKWHALE_SPA_HTML_ROOT + - LDAP_ENABLED + - BROWSABLE_API_ENABLED + + - C_FORCE_ROOT + - PYTHONDONTWRITEBYTECODE + - PYTHONTRACEMALLOC + +services: + api: + extends: + file: ./app.django.yml + service: api + <<: *local + + celeryworker: + extends: + file: ./app.django.yml + service: celeryworker + <<: *local + + nginx: + extends: + file: ./app.nginx.yml + service: nginx + ports: + - "${NGINX_HOST_PORT:-8000:80}" + environment: + - "MUSIC_DIRECTORY_PATH=${MUSIC_DIRECTORY_PATH:-/music}" + - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME:-localhost}" + + - FUNKWHALE_PROTOCOL + + - FUNKWHALE_API_HOST + - FUNKWHALE_API_PORT + + - FUNKWHALE_FRONT_IP + - FUNKWHALE_FRONT_PORT + + - NGINX_MAX_BODY_SIZE + + - STATIC_ROOT + - "MEDIA_ROOT=${MEDIA_ROOT:-/data/media}" + networks: + - internal