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.

  • Chromozone@lemmy.chromozone.dev
    link
    fedilink
    English
    arrow-up
    2
    ·
    edit-2
    2 years ago

    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"]