Love does not work when using traefik
As far as the documentation is not so detailed when using love container with traefik I created my docker compose like this:
x-common-env: &common-env
SERVER_SECRET: secret
SECRET: secret
STORAGE_CONFIG: minio|minio?accessKey=minioadmin&secretKey=secret
MONGO_URL: mongodb://ix-huly-mongodb-1:27017
DB_URL: mongodb://ix-huly-mongodb-1:27017
ACCOUNTS_URL: https://huly.example.com/accounts
STATS_URL: https://huly.example.com/stats
OPENID_CLIENT_ID: secret
OPENID_CLIENT_SECRET: secret
OPENID_ISSUER: https://authentik.example.com/application/o/huly/
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: ti4oaseG1dpKTvVpMl
FRONT_URL: https://huly.example.com
GITHUB_CLIENT_ID: secret
GITHUB_CLIENT_SECRET: secret
DISABLE_SIGNUP: true
services:
mongodb:
image: mongo:7-jammy
container_name: ix-huly-mongodb-1
restart: unless-stopped
environment:
<<: *common-env
PUID: 1000
PGID: 1000
volumes:
- /mnt/storage-1/databases/huly:/data/db
networks:
- internal-services
minio:
image: minio/minio
restart: unless-stopped
command: server /data --address ":9000" --console-address ":9001"
environment:
<<: *common-env
volumes:
- /mnt/storage-1/apps/huly/files:/data
networks:
- internal-services
elastic:
image: elasticsearch:7.14.2
restart: unless-stopped
command: |
/bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment;
/usr/local/bin/docker-entrypoint.sh eswrapper"
volumes:
- /mnt/storage-1/apps/huly/elastic:/usr/share/elasticsearch/data
environment:
<<: *common-env
ELASTICSEARCH_PORT_NUMBER: 9200
BITNAMI_DEBUG: true
discovery.type: single-node
ES_JAVA_OPTS: -Xms1024m -Xmx1024m
http.cors.enabled: true
http.cors.allow-origin: http://localhost:8082
healthcheck:
interval: 20s
retries: 10
test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
networks:
- internal-services
rekoni:
image: hardcoreeng/rekoni-service:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
deploy:
resources:
limits:
memory: 500M
networks:
- internal-services
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.rekoni.entrypoints=websecure"
- "traefik.http.services.rekoni.loadbalancer.server.port=4004"
- "traefik.http.routers.rekoni.rule=Host(`huly.example.com`) && PathPrefix(`/rekoni`)"
- "traefik.http.routers.rekoni.middlewares=rekoni-stripprefix"
- "traefik.http.middlewares.rekoni-stripprefix.stripprefix.prefixes=/rekoni"
- "traefik.http.routers.rekoni.tls=true"
- "traefik.http.routers.rekoni.tls.certresolver=cloudflare"
transactor:
image: hardcoreeng/transactor:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
SERVER_PORT: 3333
SERVER_CURSOR_MAXTIMEMS: 30000
FULLTEXT_URL: http://ix-huly-fulltext-1:4700
LAST_NAME_FIRST: true
MAIL_URL: http://ix-huly-mail-1:8097
networks:
- internal-services
- traefik
labels:
- "traefik.enable=true"
# WebSocket route
- "traefik.http.routers.transactor-ws.entrypoints=websecure"
- "traefik.http.routers.transactor-ws.rule=Host(`huly.example.com`) && PathPrefix(`/ws/transactor`)"
- "traefik.http.routers.transactor-ws.tls=true"
- "traefik.http.routers.transactor-ws.tls.certresolver=cloudflare"
- "traefik.http.services.transactor-ws.loadbalancer.server.port=3333"
- "traefik.http.routers.transactor-ws.service=transactor-ws"
# Strip WebSocket prefix
- "traefik.http.routers.transactor-ws.middlewares=strip-transactor-ws-prefix"
- "traefik.http.middlewares.strip-transactor-ws-prefix.stripprefix.prefixes=/ws/transactor"
# HTTP route for non-WebSocket traffic
- "traefik.http.routers.transactor.entrypoints=websecure"
- "traefik.http.routers.transactor.rule=Host(`huly.example.com`) && PathPrefix(`/transactor`)"
- "traefik.http.routers.transactor.tls=true"
- "traefik.http.routers.transactor.tls.certresolver=cloudflare"
- "traefik.http.services.transactor.loadbalancer.server.port=3333"
- "traefik.http.routers.transactor.service=transactor"
# Strip HTTP prefix
- "traefik.http.routers.transactor.middlewares=strip-transactor-prefix"
- "traefik.http.middlewares.strip-transactor-prefix.stripprefix.prefixes=/transactor"
collaborator:
image: hardcoreeng/collaborator:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
COLLABORATOR_PORT: 3078
networks:
- internal-services
- traefik
labels:
- "traefik.enable=true"
# WebSocket route
- "traefik.http.routers.collaborator-ws.entrypoints=websecure"
- "traefik.http.routers.collaborator-ws.rule=Host(`huly.example.com`) && PathPrefix(`/ws/collaborator`)"
- "traefik.http.routers.collaborator-ws.tls=true"
- "traefik.http.routers.collaborator-ws.tls.certresolver=cloudflare"
- "traefik.http.services.collaborator-ws.loadbalancer.server.port=3078"
- "traefik.http.routers.collaborator-ws.service=collaborator-ws"
# Strip WebSocket prefix
- "traefik.http.routers.collaborator-ws.middlewares=strip-collaborator-ws-prefix"
- "traefik.http.middlewares.strip-collaborator-ws-prefix.stripprefix.prefixes=/ws/collaborator"
# HTTP route for non-WebSocket traffic
- "traefik.http.routers.collaborator.entrypoints=websecure"
- "traefik.http.routers.collaborator.rule=Host(`huly.example.com`) && PathPrefix(`/collaborator`)"
- "traefik.http.routers.collaborator.tls=true"
- "traefik.http.routers.collaborator.tls.certresolver=cloudflare"
- "traefik.http.services.collaborator.loadbalancer.server.port=3078"
# Strip HTTP prefix
- "traefik.http.routers.collaborator.middlewares=strip-collaborator-prefix"
- "traefik.http.middlewares.strip-collaborator-prefix.stripprefix.prefixes=/collaborator"
account:
image: hardcoreeng/account:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
SERVER_PORT: 3000
TRANSACTOR_URL: ws://ix-huly-transactor-1:3333;wss://huly.example.com/ws/transactor
MODEL_ENABLED: "*"
ACCOUNT_PORT: 3000
MAIL_URL: http://ix-huly-mail-1:8097
networks:
- internal-services
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.account.entrypoints=websecure"
- "traefik.http.services.account.loadbalancer.server.port=3000"
- "traefik.http.routers.account.rule=Host(`huly.example.com`) && PathPrefix(`/accounts`)"
- "traefik.http.routers.account.middlewares=account-stripprefix"
- "traefik.http.middlewares.account-stripprefix.stripprefix.prefixes=/accounts"
- "traefik.http.routers.account.tls=true"
- "traefik.http.routers.account.tls.certresolver=cloudflare"
workspace:
image: hardcoreeng/workspace:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
TRANSACTOR_URL: ws://ix-huly-transactor-1:3333;wss://huly.example.com/ws/transactor
MODEL_ENABLED: "*"
networks:
- internal-services
front:
image: hardcoreeng/front:v0.6.501
restart: unless-stopped
labels:
traefik.enable: true
traefik.http.routers.huly.entrypoints: websecure
traefik.http.services.huly.loadbalancer.server.port: 8080
traefik.http.routers.huly.rule: Host(`huly.example.com`)
traefik.http.routers.huly.tls: true
traefik.http.routers.huly.tls.certresolver: cloudflare
environment:
<<: *common-env
SERVER_PORT: 8080
REKONI_URL: https://huly.example.com/rekoni
CALENDAR_URL: https://huly.example.com/_calendar
GMAIL_URL: https://huly.example.com/_gmail
TELEGRAM_URL: https://huly.example.com/_telegram
UPLOAD_URL: /files
ELASTIC_URL: http://ix-huly-elastic-1:9200
COLLABORATOR_URL: wss://huly.example.comws/collaborator
TITLE: Sustainjanes Project Management
DEFAULT_LANGUAGE: de
LAST_NAME_FIRST: false
DESKTOP_UPDATES_CHANNEL: selfhost
LIVEKIT_WS: wss://secret
LOVE_ENDPOINT: http://ix-huly-love-1:8096
GITHUB_CLIENT_ID: secret
GITHUB_CLIENT_SECRET: secret
networks:
- internal-services
- traefik
fulltext:
image: hardcoreeng/fulltext:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
FULLTEXT_DB_URL: http://ix-huly-elastic-1:9200
ELASTIC_INDEX_NAME: huly_storage_index
REKONI_URL: http://ix-huly-rekoni-1:4004
networks:
- internal-services
stats:
image: hardcoreeng/stats:v0.6.501
restart: unless-stopped
environment:
<<: *common-env
PORT: 4900
networks:
- internal-services
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.stats.entrypoints=websecure"
- "traefik.http.services.stats.loadbalancer.server.port=4900"
- "traefik.http.routers.stats.rule=Host(`huly.example.com`) && PathPrefix(`/stats`)"
- "traefik.http.routers.stats.middlewares=stats-stripprefix"
- "traefik.http.middlewares.stats-stripprefix.stripprefix.prefixes=/stats"
- "traefik.http.routers.stats.tls=true"
- "traefik.http.routers.stats.tls.certresolver=cloudflare"
mail:
image: hardcoreeng/mail:v0.6.501
container_name: ix-huly-mail-1
# ports:
# - 8097:8097
environment:
<<: *common-env
PORT: 8097
SOURCE: [email protected]
SMTP_HOST: mail.example.net
SMTP_PORT: 587
SMTP_USERNAME: [email protected]
SMTP_PASSWORD: secret
networks:
- internal-services
restart: unless-stopped
love:
image: hardcoreeng/love:v0.6.501
container_name: ix-huly-love-1
networks:
- internal-services
- traefik
# ports:
# - 8096:8096
environment:
<<: *common-env
STORAGE_PROVIDER_NAME: ix-huly-minio-1
PORT: 8096
LIVEKIT_HOST: wss://huly-lzwdgu15.livekit.cloud
LIVEKIT_API_KEY: APIMzXo3Q9Tcspo
LIVEKIT_API_SECRET: QV2QE3rIDjiHwnA9fRAoctOS8K0FTgfmqldUzQf6VPLB
labels:
- "traefik.enable=true"
- "traefik.http.routers.love.entrypoints=websecure"
- "traefik.http.services.love.loadbalancer.server.port=3000"
- "traefik.http.routers.love.rule=Host(`huly.example.com`) && PathPrefix(`/love`)"
- "traefik.http.routers.love.tls=true"
- "traefik.http.routers.love.tls.certresolver=cloudflare"
restart: unless-stopped
networks:
internal-services:
name: internal-services
traefik:
external: true
But it seems like more steps are necessary to make this work, because it just cause endless loading:
https://github.com/user-attachments/assets/ee837e1d-e333-408a-b6e6-5612542434e7
If I can provide more information I will of course. Hope you can help me.
Connected to Huly®: SELFH-177
can someone please assist with this - I've tried to get my LIVEKIT account setup and I also get this love service issue - I can't use the board room section and I really need this as my team is in Isreal and I am in South Africa.
on the produuction server with SSL when I try and start a meeting (just like the video):
curl -X GET http://127.0.0.1:8096/ -v Note: Unnecessary use of -X or --request, GET is already inferred.
- Trying 127.0.0.1:8096...
- Connected to 127.0.0.1 (127.0.0.1) port 8096
GET / HTTP/1.1 Host: 127.0.0.1:8096 User-Agent: curl/8.5.0 Accept: /
< HTTP/1.1 404 Not Found < X-Powered-By: Express < Access-Control-Allow-Origin: * < Content-Security-Policy: default-src 'none' < X-Content-Type-Options: nosniff < Content-Type: text/html; charset=utf-8 < Content-Length: 139 < Date: Sun, 17 Aug 2025 20:24:18 GMT < Connection: keep-alive < Keep-Alive: timeout=5 <
Cannot GET /* Connection #0 to host 127.0.0.1 left intact jackcat% docker compose logs love --tail=20 love-1 | (node:1) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. love-1 | (Use `node --trace-deprecation ...` to show where the warning was created) love-1 | Server listening on port 8096 love-1 | Error: identity is required for join but not set love-1 | at AccessToken.toJwt (/usr/src/app/bundle.js:121576:17) love-1 | at createToken (/usr/src/app/bundle.js:124186:23) love-1 | at /usr/src/app/bundle.js:124075:24 love-1 | at Layer.handle [as handle_request] (/usr/src/app/bundle.js:107357:9) love-1 | at next (/usr/src/app/bundle.js:107526:17) love-1 | at Route.dispatch (/usr/src/app/bundle.js:107506:7) love-1 | at Layer.handle [as handle_request] (/usr/src/app/bundle.js:107357:9) love-1 | at /usr/src/app/bundle.js:107728:19 love-1 | at Function.process_params (/usr/src/app/bundle.js:107764:16) love-1 | at next (/usr/src/app/bundle.js:107724:15)
compose.yml
love: image: hardcoreeng/love:${HULY_VERSION} ports: - "8096:8096" environment: - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin - SECRET=${SECRET} - ACCOUNTS_URL=http://account:3000 - DB_URL=mongodb://mongodb:27017 - MONGO_URL=mongodb://mongodb:27017 - STORAGE_PROVIDER_NAME=minio - PORT=8096 - LIVEKIT_HOST=*** - LIVEKIT_API_KEY=*** - LIVEKIT_API_SECRET=*** restart: unless-stopped
Hey @sustainjane98, I found couple of issues in your configuration:
- Invalid
LOVE_ENDPOINTvalue in front service - Missing
stripprefixmiddleware in love service
Below you can find example of traefik love service configuration (tested on basic self-host example)
front:
image: hardcoreeng/front:${HULY_VERSION}
restart: unless-stopped
environment:
...
LOVE_ENDPOINT: https://${SERVER_ADDRESS}/love
LIVEKIT_WS: wss:/example.livekit.cloud
love:
image: hardcoreeng/love:${HULY_VERSION}
networks:
- internal-services
- traefik-public
environment:
<<: *common-env
PORT: 8096
LIVEKIT_HOST: wss://example.livekit.cloud
LIVEKIT_API_KEY: <LIVEKIT_API_KEY>
LIVEKIT_API_SECRET: <LIVEKIT_API_SECRET>
labels:
- "traefik.enable=true"
- "traefik.http.routers.love.entrypoints=websecure"
- "traefik.http.services.love.loadbalancer.server.port=8096"
- "traefik.http.routers.love.rule=Host(`${SERVER_ADDRESS}`) && PathPrefix(`/love`)"
- "traefik.http.routers.love.middlewares=love-stripprefix"
- "traefik.http.routers.love.tls=true"
- "traefik.http.routers.love.tls.certresolver=cloudflare"
- "traefik.http.middlewares.love-stripprefix.stripprefix.prefixes=/love"
Please adjust this example per your needs and let me know whether you have any other issues.