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.

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

    In my opinion its best not to touch the nginx that’s set up by Lemmy and it’s better to have another reverse-proxy in front of it.

    I’ll try to come up with an solution later in the day, gotta do my daily at work.

    • 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