I am a software developer by craft and a linux system admin by hobby. I cannot commit to moderating and managing my own instance, but I would be glad to help someone with the technical aspects.
The most common complaint I saw in Reddit and here about switching to Lemmy is the difficulty of setting it up, so I thought I would help bridge this gap.
While I have never hosted my own instance before, I already checked the setup guide and it looks pretty simple to me, so I am confident I can do it. Please feel free to comment or DM.
It would be great if you can comment general questions. I can then respond to you here and maybe others will see it and know how to host their own instances too.
The thing I struggled with the most was adapting the provided docker-compose.yml
for my Caddy setup.
I am using caddy-docker-proxy, which I absolutely love but their documentation is not the greatest for matchers.
If anyone else wants a super basic Lemmy instance running on Caddy with their domain on Cloudflare here is a docker-compose.yml
Please make sure you update your lemmy.hjson
hostname
field to match the domain you used in the docker-compose.yml
for the caddy
labels
If you’re not using Cloudflare you can replace build: .
(and not use the Dockerfile
I provided below) in the caddy service with image: lucaslorentz/caddy-docker-proxy:ci-alpine
(and remove the caddy.acme_dns
label) and I believe it will fall back to Let’sEncrypt
version: "3.9"
services:
caddy:
container_name: caddy
build: .
depends_on:
- lemmy-ui
- pictrs
ports:
- 80:80
- 443:443
environment:
CADDY_INGRESS_NETWORKS: caddy
networks:
- caddy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/docker/caddy/data:/data
- /opt/docker/caddy/config:/config
labels:
caddy.log.format: console
caddy.acme_dns: cloudflare YOUR_CLOUDFLARE_API_TOKEN
restart: unless-stopped
lemmy:
container_name: lemmy
image: dessalines/lemmy:0.17.3
depends_on:
- postgres
- pictrs
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"
networks:
- caddy
volumes:
- /opt/docker/lemmy/lemmy.hjson:/config/config.hjson:ro
labels:
caddy: "your.domain.com"
caddy.@lemmy: path_regexp ^/(api|pictrs|feeds|nodeinfo|\.well-known)/.*$
caddy.@post: method POST
caddy.@accept: header Accept application/*
caddy.reverse_proxy_1: "@lemmy {{upstreams 8536}}"
caddy.reverse_proxy_2: "@post {{upstreams 8536}}"
caddy.reverse_proxy_3: "@accept {{upstreams 8536}}"
restart: unless-stopped
lemmy-ui:
container_name: lemmy-ui
image: dessalines/lemmy-ui:0.17.3
depends_on:
- lemmy
environment:
LEMMY_UI_LEMMY_INTERNAL_HOST: lemmy:8536
LEMMY_UI_LEMMY_EXTERNAL_HOST: localhost:1234
LEMMY_HTTPS: true
networks:
- caddy
labels:
caddy: "your.domain.com"
caddy.reverse_proxy: "{{upstreams 1234}}"
restart: unless-stopped
pictrs:
container_name: pictrs
image: asonix/pictrs:0.3.1
environment:
PICTRS__API_KEY: API_KEY
user: 991:991
volumes:
- /opt/docker/pictrs:/mnt
networks:
- caddy
postgres:
container_name: postgres
image: postgres:15-alpine
environment:
POSTGRES_DB: lemmy
POSTGRES_USER: lemmy
POSTGRES_PASSWORD: password
volumes:
- /opt/docker/postgres:/var/lib/postgresql/data
networks:
- caddy
restart: unless-stopped
networks:
caddy:
external: true
Here is the Dockerfile used for the caddy container:
ARG CADDY_VERSION=2.6.4
FROM caddy:${CADDY_VERSION}-builder AS builder
RUN xcaddy build \
--with github.com/lucaslorentz/caddy-docker-proxy/v2@v2.8.4 \
--with github.com/caddy-dns/cloudflare
FROM caddy:${CADDY_VERSION}-alpine
RUN apk add --no-cache tzdata
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
CMD ["caddy", "docker-proxy"]