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:
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:
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
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
Figured I’d ask to see if you know if this method is still working? I have mine setup very nearly identically to what you have here, and I have corrected my lemmy.hjson to have the correct hostname and password for the database. The only changes I have made thus far is to remove the HTTP redirection, and to change things like me cert resolver, the Lemmy version, and other small corrections.
However, all I am getting is a gateway timeout when I try to visit the url I have setup. Do you have any idea why this might be? I’ll provide my docker-compose below.
version: "3.7" services: web: image: dessalines/lemmy:latest 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: - /mnt/lemmy/lemmy.hjson:/config/config.hjson depends_on: - db networks: - lemmy - traefik_default labels: - traefik.enable=true - traefik.http.routers.https_lemmy.rule=Host(`lem.domain.tld`) && (PathPrefix(`/api`, `/pictrs`, `/feeds`, `/nodeinfo`, `/.well-known`) || Method(`POST`) || HeadersRegexp(`Accept`, `^[Aa]pplication/.*`)) - traefik.http.routers.https_lemmy.entrypoints=https - traefik.http.routers.https_lemmy.tls.certresolver=myresolver web-frontend: image: dessalines/lemmy-ui:latest 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: - lemmy - traefik_default labels: - traefik.enable=true - traefik.http.routers.https_lemmy_static.rule=Host(`lem.domain.tld`) - traefik.http.routers.https_lemmy_static.entrypoints=https - traefik.http.routers.https_lemmy_static.tls.certresolver=myresolver db: image: postgres:15-alpine hostname: db environment: - POSTGRES_USER=lemmy - POSTGRES_PASSWORD=LONGstringOFcharacters volumes: - /mnt/lemmy/db:/var/lib/postgresql/data - ./customPostgresql.conf:/etc/postgresql.conf restart: always logging: driver: journald options: tag: "{{.Name}}[{{.ID}}]" networks: - lemmy networks: traefik_default: external: true lemmy: driver: bridge volumes: db: