I have tried the docker, ansible, and scratch methods. I have been troubleshooting for a month now. I have gotten nowhere. I need someone to help walk me through how to deploy a lemmy server because the guides are absolute trash.

Please help. I’m wasting money running this VPS and for literally nothing.

Edit: So, I’ve tried the ansible method, but I can’t access my server this way. It just keeps saying “UNREACHABLE”. I have generated a dozen keys, none of them work. I have NO PROBLEMS with ssh in Putty. I can use Putty all day. Putty works fine using my ssh key. Ansible does not. No amount of new keys has made any difference. I have countless keys in my stupid droplet because of this hacky garbage.

  • ZMonster@lemmy.worldOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    No problem at all. Thanks for getting back to me. I really do appreciate it!!! I have a busy day today too but I’ll try to be vigilant about responding.

    • BlackEco@lemmy.blackeco.com
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      1 year ago

      So, here’s something that might work. I tested it on my local machine, up to Caddy but without HTTPS, but I’m confident it’ll work once deployed on a server.

      Prerequisites:

      • Server with Docker and docker-compose installed
      • Ports 80 and 443 open and directed at your server
      • A domain name pointing to your server

      Setup

      First, create a folder and download the following files:

      Then, generate passwords for PostgreSQL and your admin user, store them somewhere safe.

      Config changes

      lemmy.hjson

      You’ll want to change the admin_username, admin_password and site_name to match your primary user’s credentials and the name you want to give your instance.

      Then, change hostname to match your domain name: if it is sub.domain.tld then it should read hostname: "sub.domain.tld".

      The base config file does not have proper configuration for the database, so you’ll have to edit the database field as follows with the password you previously created:

        database: {
          host: postgres
          database: "lemmy"
          user: "lemmy"
          password: "POSTGRES_PWD" # Change for your password
        }
      

      Additionally, if you want to send emails for registration confirmation and password resets, add the following before the closing } and change to match your email provider configuration.

        email: {
            # Hostname and port of the smtp server
            smtp_server: "SMTP_SERVER"
            # Login name for smtp server
            smtp_login: "SMTP_LOGIN"
            # Password to login to the smtp server
            smtp_password: "SMTP_PASSWORD"
            # Address to send emails from, eg "noreply@your-instance.com"
            smtp_from_address: "SMTP_LOGIN"
            # Whether or not smtp connections should use tls. Can be none, tls, or starttls
            tls_type: "starttls"
          }
      

      docker-compose.yml

      By default the compose file is meant to build a development version of Lemmy, we will change this by removing the blocks with build and uncomment those with image. Note: think to update the images to 0.18.2 since it fixes some vulnerabilities.

      Also, since we will use a reverse proxy and I don’t now if your server has a firewall, we should remove the ports blocks which are used to expose the services’ ports on the host.

      Finally, make sure to change the POSTGRES_PASSWORD field to match the PostgreSQL password you set in lemmy.hjson.

      It should look something like that:

      version: "3.7"
      
      x-logging: &default-logging
        driver: "json-file"
        options:
          max-size: "50m"
          max-file: "4"
      
      services:
        proxy:
          image: nginx:1-alpine
          volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf:ro,Z
          restart: always
          depends_on:
            - pictrs
            - lemmy-ui
          logging: *default-logging
      
        lemmy:
          # use "image" to pull down an already compiled lemmy. make sure to comment out "build".
          image: dessalines/lemmy:0.18.2
          # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1.
          # use "build" to build your local lemmy server image for development. make sure to comment out "image".
          # run: docker compose up --build
      
          # this hostname is used in nginx reverse proxy and also for lemmy ui to connect to the backend, do not change
          hostname: lemmy
          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:
          # use "image" to pull down an already compiled lemmy-ui. make sure to comment out "build".
          image: dessalines/lemmy-ui:0.18.2
          # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1.
          # use "build" to build your local lemmy ui image for development. make sure to comment out "image".
          # run: docker compose up --build
      
          # build:
          #   context: ../../lemmy-ui # assuming lemmy-ui is cloned besides lemmy directory
          #   dockerfile: dev.dockerfile
          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_UI_HTTPS=false
            - LEMMY_UI_DEBUG=true
          depends_on:
            - lemmy
          restart: always
          logging: *default-logging
          init: true
      
        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
          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",
            ]
          environment:
            - POSTGRES_USER=lemmy
            - POSTGRES_PASSWORD=password # Change with your password
            - POSTGRES_DB=lemmy
          volumes:
            - ./volumes/postgres:/var/lib/postgresql/data:Z
          restart: always
          logging: *default-logging
      

      Reverse-proxy

      For the final touch, we are going to setup Caddy, a reverse proxy with HTTPS support out of the box. You could use pretty much any reverse proxy you want, but I chose Caddy for its easy setup.

      First, create a file nammed Caddyfile and write the following in it:

      sub.domain.tld {
      	reverse_proxy http://proxy:1236
      }
      

      Make sure to match your actual domain name.

      Finally, update the docker-compose.yml file to add the following at the end (make sure that it’s correctly tabulated)

        caddy:
          image: caddy:2.6.4
          restart: unless-stopped
          ports:
            - "80:80"
            - "443:443"
            - "443:443/udp"
          depends_on:
            - proxy
          volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile:ro
            - caddy_data:/data
            - caddy_config:/config
      volumes:
        caddy_data:
        caddy_config:
      

      Launching the instance

      Before starting the stack, we have a few things left to do:

      • Create the folders for pictrs and postgres to store their data: mkdir -p volumes/postgres volumes/pictrs
      • Change the owner of volumes/pictrs: sudo chown -R 991:991 pictrs

      Finally, to start everything: docker compose up -d

    • BlackEco@lemmy.blackeco.com
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      So, here’s something that might work. I tested it on my local machine, up to Caddy but without HTTPS, but I’m confident it’ll work once deployed on a server.

      Prerequisites:

      • Server with Docker and docker-compose installed
      • Ports 80 and 443 open and directed at your server
      • A domain name pointing to your server

      Setup

      First, create a folder and download the following files:

      Then, generate passwords for PostgreSQL and your admin user, store them somewhere safe.

      Config changes

      lemmy.hjson

      You’ll want to change the admin_username, admin_password and site_name to match your primary user’s credentials and the name you want to give your instance.

      Then, change hostname to match your domain name: if it is sub.domain.tld then it should read hostname: "sub.domain.tld".

      The base config file does not have proper configuration for the database, so you’ll have to edit the database field as follows with the password you previously created:

        database: {
          host: postgres
          database: "lemmy"
          user: "lemmy"
          password: "POSTGRES_PWD" # Change for your password
        }
      

      Additionally, if you want to send emails for registration confirmation and password resets, add the following before the closing } and change to match your email provider configuration.

        email: {
            # Hostname and port of the smtp server
            smtp_server: "SMTP_SERVER"
            # Login name for smtp server
            smtp_login: "SMTP_LOGIN"
            # Password to login to the smtp server
            smtp_password: "SMTP_PASSWORD"
            # Address to send emails from, eg "noreply@your-instance.com"
            smtp_from_address: "SMTP_LOGIN"
            # Whether or not smtp connections should use tls. Can be none, tls, or starttls
            tls_type: "starttls"
          }
      

      docker-compose.yml

      By default the compose file is meant to build a development version of Lemmy, we will change this by removing the blocks with build and uncomment those with image. Note: think to update the images to 0.18.2 since it fixes some vulnerabilities.

      Also, since we will use a reverse proxy and I don’t now if your server has a firewall, we should remove the ports blocks which are used to expose the services’ ports on the host.

      Finally, make sure to change the POSTGRES_PASSWORD field to match the PostgreSQL password you set in lemmy.hjson.

      It should look something like that:

      version: "3.7"
      
      x-logging: &default-logging
        driver: "json-file"
        options:
          max-size: "50m"
          max-file: "4"
      
      services:
        proxy:
          image: nginx:1-alpine
          volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf:ro,Z
          restart: always
          depends_on:
            - pictrs
            - lemmy-ui
          logging: *default-logging
      
        lemmy:
          # use "image" to pull down an already compiled lemmy. make sure to comment out "build".
          image: dessalines/lemmy:0.18.2
          # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1.
          # use "build" to build your local lemmy server image for development. make sure to comment out "image".
          # run: docker compose up --build
      
          # this hostname is used in nginx reverse proxy and also for lemmy ui to connect to the backend, do not change
          hostname: lemmy
          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:
          # use "image" to pull down an already compiled lemmy-ui. make sure to comment out "build".
          image: dessalines/lemmy-ui:0.18.2
          # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1.
          # use "build" to build your local lemmy ui image for development. make sure to comment out "image".
          # run: docker compose up --build
      
          # build:
          #   context: ../../lemmy-ui # assuming lemmy-ui is cloned besides lemmy directory
          #   dockerfile: dev.dockerfile
          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_UI_HTTPS=false
            - LEMMY_UI_DEBUG=true
          depends_on:
            - lemmy
          restart: always
          logging: *default-logging
          init: true
      
        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
          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",
            ]
          environment:
            - POSTGRES_USER=lemmy
            - POSTGRES_PASSWORD=password # Change with your password
            - POSTGRES_DB=lemmy
          volumes:
            - ./volumes/postgres:/var/lib/postgresql/data:Z
          restart: always
          logging: *default-logging
      

      Reverse-proxy

      For the final touch, we are going to setup Caddy, a reverse proxy with HTTPS support out of the box. You could use pretty much any reverse proxy you want, but I chose Caddy for its easy setup.

      First, create a file nammed Caddyfile and write the following in it:

      sub.domain.tld {
      	reverse_proxy http://proxy:1236
      }
      

      Make sure to match your actual domain name.

      Finally, update the docker-compose.yml file to add the following at the end (make sure that it’s correctly tabulated)

        caddy:
          image: caddy:2.6.4
          restart: unless-stopped
          ports:
            - "80:80"
            - "443:443"
            - "443:443/udp"
          depends_on:
            - proxy
          volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile:ro
            - caddy_data:/data
            - caddy_config:/config
      volumes:
        caddy_data:
        caddy_config:
      

      Launching the instance

      Before starting the stack, we have a few things left to do:

      • Create the folders for pictrs and postgres to store their data: mkdir -p volumes/postgres volumes/pictrs
      • Change the owner of volumes/pictrs: sudo chown -R 991:991 pictrs

      Finally, to start everything: docker compose up -d