Hosting Lemmy with Traefik as a reverse proxy

cross-posted from: https://lmmy.tvdl.dev/post/259

In light of the ongoing Reddit blackout, many users are seeking alternative platforms to host their communities. One popular option is Lemmy, a self-hosted federated link aggregator. However, most of the available documentation on running Lemmy involves using Nginx or Caddy as a reverse proxy. If you're utilizing Traefik with docker-compose and docker labels on your server, this guide will walk you through the process of setting up a working Lemmy instance without the need for Nginx or Caddy.

Step-by-Step Guide:

  1. Docker Compose Configuration: To begin, create a new docker-compose.yml file and include the necessary services for running Lemmy. Here's a sample configuration to get you started:

    version: "3.7"
    
    services:
      web:
        image: dessalines/lemmy:0.17.4
        restart: always
        logging:
          driver: journald
          options:
            tag: "{{.Name}}[{{.ID}}]"
        environment:
          - RUST_LOG="warn,lemmy_server=info,lemmy_api=info,lemmy_api_common=info,lemmy_api_crud=info,lemmy_apub=info,lemmy_db_schema=info,lemmy_db_views=info,lemmy_db_views_actor=info,lemmy_db_views_moderator=info,lemmy_routes=info,lemmy_utils=info,lemmy_websocket=info"
        volumes:
          - ./lemmy.hjson:/config/config.hjson
        depends_on:
          - db
        networks:
          - default
          - reverse_proxy
        labels:
          - traefik.enable=true
          - traefik.http.routers.http_lemmyexamplecom.rule=Host(`lemmy.example.com`) && (PathPrefix(`/api`, `/pictrs`, `/feeds`, `/nodeinfo`, `/.well-known`) || Method(`POST`) || HeadersRegexp(`Accept`, `^[Aa]pplication/.*`))
          - traefik.http.routers.https_lemmyexamplecom.rule=Host(`lemmy.example.com`) && (PathPrefix(`/api`, `/pictrs`, `/feeds`, `/nodeinfo`, `/.well-known`) || Method(`POST`) || HeadersRegexp(`Accept`, `^[Aa]pplication/.*`))
          - traefik.http.routers.http_lemmyexamplecom.entrypoints=http
          - traefik.http.routers.https_lemmyexamplecom.entrypoints=https
          - traefik.http.routers.http_lemmyexamplecom.middlewares=https_redirect@file
          - traefik.http.routers.https_lemmyexamplecom.tls.certresolver=letsencrypt
      web-frontend:
        image: dessalines/lemmy-ui:0.17.4
        environment:
          - LEMMY_UI_LEMMY_INTERNAL_HOST=web:8536
          - LEMMY_UI_LEMMY_EXTERNAL_HOST=localhost:1236
          - LEMMY_HTTPS=true
        depends_on:
          - web
        restart: always
        logging:
          driver: journald
          options:
            tag: "{{.Name}}[{{.ID}}]"
        networks:
          - default
          - reverse_proxy
    labels:
          - traefik.enable=true
          - traefik.http.routers.http_lemmyexamplecom_static.rule=Host(`lemmy.example.com`)
          - traefik.http.routers.https_lemmyexamplecom_static.rule=Host(`lemmy.example.com`)
          - traefik.http.routers.http_lemmyexamplecom_static.entrypoints=http
          - traefik.http.routers.https_lemmyexamplecom_static.entrypoints=https
          - traefik.http.routers.http_lemmyexamplecom_static.middlewares=https_redirect@file
          - traefik.http.routers.https_lemmyexamplecom_static.tls.certresolver=letsencrypt
      db:
        image: postgres:15-alpine
        hostname: db
        environment:
          - POSTGRES_USER=lemmy
          - POSTGRES_PASSWORD=password
        volumes:
          - db:/var/lib/postgresql/data
        restart: always
        logging:
          driver: journald
          options:
            tag: "{{.Name}}[{{.ID}}]"
        networks:
          - default
    
    networks:
      reverse_proxy:
        external: true
    
    volumes:
      db:
    
  2. Adjust Hostname: Remember to replace the placeholder hostname in the configuration with the actual hostname of your server. This ensures that Lemmy is accessible via the correct URL. Start Lemmy: Save the changes to your docker-compose.yml file and execute the following command in the terminal to start Lemmy:

    docker-compose up -d
    
  3. Verify Lemmy's Availability: Once the containers are up and running, access your Lemmy instance by navigating to the URL associated with your server's hostname.

Please note that the instructions provided here assume a basic understanding of Docker, Traefik, and server administration. Adjustments may be necessary based on your specific setup and requirements.

edit: Also note that this is for version 0.17.4. In case a new version releases you need to change the tag for both lemmy and lemmy-ui

18 points · 5 comments · view on lemmy.world

5 Comments

theRealBassist@lemmy.world · 1 pts · 3y (1 reply)
[ removed ]
tom@lmmy.tvdl.dev · 1 pts · 3y

In one of the updates, I noticed in the traefik dashboard that traefik was forwarding to a different port. So I added the following label in my web labels:

      - traefik.http.services.web-lemmy.loadbalancer.server.port=8536

You might need to change the web-lemmy part to whatever the traefik service is named in your config.

mbirth@lemmy.mbirth.uk · 1 pts · 3y (2 replies)

Thank you! Works a treat!

For some reason this prevents some requests from finishing. Searches don't come back with a result until I reload the page. Posting comments never finishes (and never posts). After reverting back to the NginX proxy, everything works fine again.

To not having to repeat the http --> https redirect all the time, I've created a file config for Traefik:

http:

  routers:

    redirect-https:
      rule: HostRegexp(`{catchall:.*}`)
      entrypoints: http
      middlewares: redirect-https
      service: dummy

  services:

    dummy:
      loadbalancer:
        servers:
          - url: "about:blank"

That one works for all requests throughout my Traefik setup.

tom@lmmy.tvdl.dev · 1 pts · 3y

Regarding your edit. I haven't have this problem myself. Might be because of a slightly different setup.

tom@lmmy.tvdl.dev · 1 pts · 3y

Thanks! Good trick to know!