Docker-compose help (lemmy selfhosted)

ChaosAD@lemmy.world to Selfhosted@lemmy.world – 13 points –

cross-posted from: https://lemmy.world/post/226995

Hi guys, I am trying to bring a lemmy instance up but I have no idea why it freezes on "building lemmy"

This is what I get: https://i.imgur.com/GjcHPkd.png

and when I check my $ docker images https://i.imgur.com/wIUw54R.png

This is my docker-compose.yml for refenrece:

version: "3.7"

x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "50m"
    max-file: 4

networks:
  # communication to web and clients
  lemmyexternalproxy:
  # communication between lemmy services
  lemmyinternal:
    driver: bridge
    internal: true

services:
  proxy:
    image: nginx:1-alpine
    networks:
      - lemmyinternal
      - lemmyexternalproxy
    ports:
      # actual and only port facing any connection from outside
      # Note, change the left number if port 1236 is already in use on your system
      # You could use port 80 if you won't use a reverse proxy
      - "1236:1236"
      - "8536:8536"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro,Z
    restart: always
    depends_on:
      - pictrs
      - lemmy-ui
    logging: *default-logging

  lemmy:
    # image: dessalines/lemmy:dev
    # use this to build your local lemmy server image for development
    # run docker compose up --build
    build:
      context: ../
      dockerfile: docker/Dockerfile
      # args:
      #   RUST_RELEASE_MODE: release
    # this hostname is used in nginx reverse proxy and also for lemmy ui to connect to the backend, do not change
    hostname: lemmy
    networks:
      - lemmyinternal
      - lemmyexternalproxy
    restart: always
    environment:
      - RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
      - RUST_BACKTRACE=full
    volumes:
      - ./lemmy.hjson:/config/config.hjson:Z
    depends_on:
      - postgres
      - pictrs
    logging: *default-logging

  lemmy-ui:
    image: dessalines/lemmy-ui:0.17.1
    # use this to build your local lemmy ui image for development
    # run docker compose up --build
    # assuming lemmy-ui is cloned besides lemmy directory
    # build:
    #   context: ../../lemmy-ui
    #   dockerfile: dev.dockerfile
    networks:
      - lemmyinternal
    environment:
      # this needs to match the hostname defined in the lemmy service
      - LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
      # set the outside hostname here
      - LEMMY_UI_LEMMY_EXTERNAL_HOST=localhost:1236
      - LEMMY_HTTPS=false
      - LEMMY_UI_DEBUG=true
    depends_on:
      - lemmy
    restart: always
    logging: *default-logging

  pictrs:
    image: asonix/pictrs:0.4.0-beta.19
    # this needs to match the pictrs url in lemmy.hjson
    hostname: pictrs
    # we can set options to pictrs like this, here we set max. image size and forced format for conversion
    # entrypoint: /sbin/tini -- /usr/local/bin/pict-rs -p /mnt -m 4 --image-format webp
    networks:
      - lemmyinternal
    environment:
      - PICTRS_OPENTELEMETRY_URL=http://otel:4137
      - PICTRS__API_KEY=API_KEY
      - RUST_LOG=debug
      - RUST_BACKTRACE=full
      - PICTRS__MEDIA__VIDEO_CODEC=vp9
      - PICTRS__MEDIA__GIF__MAX_WIDTH=256
      - PICTRS__MEDIA__GIF__MAX_HEIGHT=256
      - PICTRS__MEDIA__GIF__MAX_AREA=65536
      - PICTRS__MEDIA__GIF__MAX_FRAME_COUNT=400
    user: 991:991
    volumes:
      - ./volumes/pictrs:/mnt:Z
    restart: always
    logging: *default-logging

  postgres:
    image: postgres:15-alpine
    # this needs to match the database host in lemmy.hson
    # Tune your settings via
    # https://pgtune.leopard.in.ua/#/
    # You can use this technique to add them here
    # https://stackoverflow.com/a/30850095/1655478
    hostname: postgres
    command:
      [
        "postgres",
        "-c",
        "session_preload_libraries=auto_explain",
        "-c",
        "auto_explain.log_min_duration=5ms",
        "-c",
        "auto_explain.log_analyze=true",
        "-c",
        "track_activity_query_size=1048576",
      ]
    networks:
      - lemmyinternal
      # adding the external facing network to allow direct db access for devs
      - lemmyexternalproxy
    ports:
      # use a different port so it doesnt conflict with potential postgres db running on the host
      - "5433:5432"
    environment:
      - POSTGRES_USER=lemmy
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=lemmy
    volumes:
      - ./volumes/postgres:/var/lib/postgresql/data:Z
    restart: always
    logging: *default-logging
29

replace the whole build: yaml block with image: dessalines/lemmy:0.17.1

also bump both versions from 0.17.1 to 0.17.4

Seems like you are building Lemmy from source as it has "build:" specified. I personally use "image: dessalines/lemmy:0.17.4" to avoid building Lemmy from source.

every time i see this compose file my head hurts

  • so much debugging enabled
  • two networks for whatever reason
  • bespoke logging setup instead of just using system default
  • host mounted directories instead of docker volumes
  • postgresql exposed for whatever reason

it's a development setup. devs really need to put a production enduser version of this out there.

I always see docker compose files like this as a starting point rather than the best way to do things, haha.

so much debugging enabled

Yeah, the log level is pretty excessive, though lemmy is still pretty young software-wise so they are probably doing it to make sure they can get good bug reports from users. At least they are necessarily showing you how you can change those levels yourself if you are unhappy with their suggested settings.

two networks for whatever reason

Two networks isn't strictly necessary, but it is generally a good practice to isolate things that don't need to talk to each other at a network/vlan/whatever level. IMO it's not particularly useful since docker compose makes a somewhat isolated network by default (have to be on the same box and know the IPs to hit it). I would just use ports to expose the LB, also is less powerful when they're exposing postgres like they are.

bespoke logging setup instead of just using system default

Unless it has changed the "default" logging for docker retains a stupid amount of logs. I literally filled disks because of this until I figured out what was happening. IMO this is actually a very good production-oriented change.

host mounted directories instead of docker volumes

Maybe a controversial opinion, but I actually want to control where the disks are being mounted very explicitly (pictrs on NAS, pg on local fast disk, etc) and find this far easier to do with host directories than volumes.

postgresql exposed for whatever reason

Totally agree

re: container logs issue, the proper fix is setting this once in daemon.json (which is what you did) and fixing this issue node-wide instead of adding custom logging into compose files, unless the situation requires it (we had an application which had to use gelf for, oh god) which isn't the case here. i just have an ansible role to deploy docker which configures logging, among other things.

agree that multiple networks may have a use but definitely not in this particular case.

I always see docker compose files like this as a starting point

same here, unfortunately not everyone has necessary expertise to do that, default setup linked on the project page shouldn't be this half-baked.

also, unless they fixed it already, 3 days ago compose file and nginx.conf had mismatching ports so it would just never work ootb.

I mean, either of us could be contributing to fix the docs/compose file on github instead of arguing agreeing about it here on reddit lemmy.

fixing this issue node-wide instead of adding custom logging into compose files

Yeah, they should probably have that in the docs as part of the "install docker" step, IIRC such a change takes restarting the docker daemon (which requires restarting all containers), which kinda sucks. I see having this in the compose as a way to prevent people who won't follow the instructions closely from shooting themself in the foot, and then if you know what you're doing you'll probably just strip that stuff out of the config anyways.

default setup linked on the project page shouldn’t be this half-baked

Agreed, though it does seem like it is continuing to evolve. As someone who works in DevOps I have learned not to expect devs to worry about or be interested in the actual running of their software. This project is very immature and experience a significant spkie in users, I think stumbling through things at this point is fine as long as lessons are learned and improvements are made (which seems to be happening).

3 days ago compose file and nginx.conf had mismatching ports so it would just never work ootb

I mean, when I installed lemmy I am pretty sure a significant number of these things (debug settings, logging) weren't even in the example compose file. That is still a pretty funny oversight regardless.

Howdy! Forgive the link to the site that must not be named, but I found this guide to get it hosted using portainer and Nginx proxy manager. Perhaps some of the config and notes over there will help ya. Or perhaps it will make it worse since you may not have the same setup that I do haha.

https://www.reddit.com/r/nginxproxymanager/comments/1485y0d/getting_lemmy_running_with_a_separate_nginx_proxy/

I wrote a small guide here. https://lemmy.death916.xyz/post/3068

But suffice to say their docker compose sux and requires some tweaking. I got mine running behind nginx proxy manager on a remote host

Thanks! I just tried the docker-compose.yml you shared and I am getting the follwoing error:

ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for networks: 'lemmyinternal'
Unsupported config option for services: 'pictrs'

If you're not using arm remove the arm tags. Not sure about the network issue as u should be able to declare networks in compose easily. Id check if some formatting got messed up in copying it over as the yaml is usually whitespace sensitive. Is there more to the pictrs error because that image is pretty basic and jus pulls it doen

I added the version line and it did the trick

version: "3.7"

nice glad to hear it.

are you using nginx? I am trying with caddy (because I already use it with other apps) but I can't access, do you have some idea how I could debug where the issue is?

ya i used nginx proxy manager. you have to put some custom locations in and passthrough some headers for reverse proxy to work.

I gave up to publish it and am trying now just run locally to see what's going on. And still I can't.

I am out of ideas :(

I get this error: When I try to access http://localhost:1236

instead of hostnames try and use an ip for everything. if not im not sure sorry

Don't be sorry friend, you are helping and you are awesome for that :)

Honestly, i don't think anyone knows what is happening what is going on inside the docker-compose files i set my instance up with 0.17.4/prod file with some tweaks.

Gotta stick with the 1st rule of engineering: "If it works, do not touch it"

Also i don't know if my full works, cause i can federate with everybody except lemmy.ml (which i guess is a error on their end?)