I have setup lemmy verse docker stack on my host 10.0.5.249:
https://join-lemmy.org/docs/administration/install_docker.html
My config files:
cat docker-compose.yml
x-logging: &default-logging
driver: "json-file"
options:
max-size: "50m"
max-file: "4"
services:
proxy:
image: nginx:1-alpine
ports:
# Listen for outside connections on port 10633. You can freely change the left-side
# number to a different port, eg using port 80 if you don't need a reverse proxy.
- "10633:8536"
volumes:
- ./nginx_internal.conf:/etc/nginx/nginx.conf:ro,Z
- ./proxy_params:/etc/nginx/proxy_params:ro,Z
restart: always
logging: *default-logging
depends_on:
- pictrs
- lemmy-ui
lemmy:
image: dessalines/lemmy:0.19.19
hostname: lemmy
restart: always
logging: *default-logging
environment:
- RUST_LOG="warn"
volumes:
- ./lemmy.hjson:/config/config.hjson:Z
depends_on:
- postgres
- pictrs
lemmy-ui:
image: dessalines/lemmy-ui:0.19.19
environment:
- LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
- LEMMY_UI_LEMMY_EXTERNAL_HOST=lemmy.rmict.nl
- LEMMY_UI_HTTPS=true
volumes:
- ./volumes/lemmy-ui/extra_themes:/app/extra_themes
depends_on:
- lemmy
restart: always
logging: *default-logging
pictrs:
image: asonix/pictrs:0.5.23
# 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__SERVER__API_KEY=asd
- RUST_BACKTRACE=full
- PICTRS__MEDIA__VIDEO__VIDEO_CODEC=vp9
- PICTRS__MEDIA__ANIMATION__MAX_WIDTH=256
- PICTRS__MEDIA__ANIMATION__MAX_HEIGHT=256
- PICTRS__MEDIA__ANIMATION__MAX_FRAME_COUNT=400
user: 991:991
volumes:
- ./volumes/pictrs:/mnt:Z
restart: always
logging: *default-logging
postgres:
image: pgautoupgrade/pgautoupgrade:18-alpine
hostname: postgres
environment:
- POSTGRES_USER=lemmy
- POSTGRES_PASSWORD=asd
- POSTGRES_DB=lemmy
shm_size: 1g
volumes:
- ./volumes/postgres:/var/lib/postgresql:Z
- ./customPostgresql.conf:/etc/postgresql.conf
restart: always
logging: *default-logging
postfix:
image: mwader/postfix-relay
environment:
- POSTFIX_myhostname=rmict.nl
restart: "always"
logging: *default-logging
cat lemmy.hjson
{
# for more info about the config, check out the documentation
# https://join-lemmy.org/docs/en/administration/configuration.html
database: {
host: postgres
password: "asd"
# Alternative way:
#uri: "postgresql://lemmy:{{ postgres_password }}@postgres/lemmy"
}
hostname: "lemmy.rmict.nl"
tls_enabled: true
federation: {
# Limit to the number of concurrent outgoing federation requests per target instance.
# Set this to a higher value than 1 (e.g. 6) only if you have a huge instance (>10 activities
# per second) and if a receiving instance is not keeping up.
concurrent_sends_per_instance: 1
}
pictrs: {
url: "http://pictrs:8080/"
api_key: "asd"
}
email: {
smtp_server: "10.0.5.253:26"
smtp_from_address: "not@rmict.nl"
tls_type: "none"
}
}
cat nginx_internal.conf
worker_processes auto;
events {
worker_connections 1024;
}
http {
# Docker internal DNS IP so we always get the newer containers without having to
# restart/reload the docker container / nginx configuration
resolver 127.0.0.11 valid=5s;
# set the real_ip when from docker internal ranges. Ensuring our internal nginx
# container can always see the correct ips in the logs
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
# We construct a string consistent of the "request method" and "http accept header"
# and then apply some simple regexp matches to that combination to decide on the
# HTTP upstream we should proxy the request to.
#
# Example strings:
#
# "GET:application/activity+json"
# "GET:text/html"
# "POST:application/activity+json"
#
# You can see some basic match tests in this regex101 matching this configuration
# https://regex101.com/r/vwMJNc/1
#
# Learn more about nginx maps here http://nginx.org/en/docs/http/ngx_http_map_module.html
map "$request_method:$http_accept" $proxpass {
# If no explicit matches exists below, send traffic to lemmy-ui
default "http://lemmy-ui:1234/";
# GET/HEAD requests that accepts ActivityPub or Linked Data JSON should go to lemmy.
#
# These requests are used by Mastodon and other fediverse instances to look up profile information,
# discover site information and so on.
"~^(?:GET|HEAD):.*?application\/(?:activity|ld)\+json" "http://lemmy:8536/";
# All non-GET/HEAD requests should go to lemmy
#
# Rather than calling out POST, PUT, DELETE, PATCH, CONNECT and all the verbs manually
# we simply negate the GET|HEAD pattern from above and accept all possibly $http_accept values
"~^(?!(GET|HEAD)).*:" "http://lemmy:8536/";
}
server {
set $lemmy_ui "lemmy-ui:1234";
set $lemmy "lemmy:8536";
# this is the port inside docker, not the public one yet
listen 1236;
listen 8536;
# change if needed, this is facing the public web
server_name localhost;
server_tokens off;
# Upload limit, relevant for pictrs
client_max_body_size 20M;
# Send actual client IP upstream
include proxy_params;
# frontend general requests
location / {
proxy_pass $proxpass;
rewrite ^(.+)/+$ $1 permanent;
}
# security.txt
location = /.well-known/security.txt {
proxy_pass "http://$lemmy_ui";
}
# backend
location ~ ^/(api|pictrs|feeds|nodeinfo|.well-known|version|sitemap.xml) {
proxy_pass "http://$lemmy";
# Send actual client IP upstream
include proxy_params;
}
}
}
cat proxy_params
proxy_set_header Host $http_host;
# Needs to be proxy_add_x_forwarded_for, not remote_addr, which is the docker IP.
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
I am able to access the url, and created a user and site.
However when i try to upload an avatar picture the following error occurs:
lemmy-1 | Starting HTTP server at 0.0.0.0:8536
lemmy-1 | 2026-06-15T23:17:00.998542Z WARN lemmy_server::root_span_builder: InvalidUrl: InvalidUrl
lemmy-1 | 0: lemmy_api::local_user::save_settings::save_user_settings
lemmy-1 | with data=Json(SaveUserSettings { show_nsfw: Some(true), blur_nsfw: Some(true), auto_expand: Some(false), theme: Some("browser"), default_sort_type: Some(Active), default_listing_type: Some(Local), interface_language: Some("en"), avatar: Some("https://lemmy.rmict.nl/pictrs/image/fc408328-eb8c-42c2-b8a5-3e0979aa66ce.png"), banner: None, display_name: None, email: Some(Sensitive), bio: None, matrix_user_id: None, show_avatars: Some(true), send_notifications_to_email: Some(false), bot_account: Some(false), show_bot_accounts: Some(true), show_read_posts: Some(true), discussion_languages: Some([]), open_links_in_new_tab: Some(false), infinite_scroll_enabled: None, post_listing_mode: None, enable_keyboard_navigation: None, enable_animated_images: None, collapse_bot_comments: None, show_scores: Some(false), show_upvotes: Some(true), show_downvotes: Some(true), show_upvote_percentage: Some(false) }) local_user_view=LocalUserView { local_user: LocalUser { id: LocalUserId(1), person_id: PersonId(2), password_encrypted: Sensitive, email: Some(Sensitive), show_nsfw: true, theme: "browser", default_sort_type: Active, default_listing_type: Local, interface_language: "en", show_avatars: true, send_notifications_to_email: false, show_scores: false, show_bot_accounts: true, show_read_posts: true, email_verified: false, accepted_application: false, totp_2fa_secret: None, open_links_in_new_tab: false, blur_nsfw: true, auto_expand: false, infinite_scroll_enabled: false, admin: true, post_listing_mode: List, totp_2fa_enabled: false, enable_keyboard_navigation: false, enable_animated_images: true, collapse_bot_comments: false, last_donation_notification: 2026-04-26T09:11:11.320845Z }, local_user_vote_display_mode: LocalUserVoteDisplayMode { local_user_id: LocalUserId(1), score: false, upvotes: true, downvotes: true, upvote_percentage: false }, person: Person { id: PersonId(2), name: "randy", display_name: None, avatar: None, banned: false, published: 2026-06-15T22:32:39.141645Z, updated: None, actor_id: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy", query: None, fragment: None }), bio: None, local: true, private_key: Some(Sensitive), public_key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1uWJPvQkDueuj7sqHsiy\n9nP5cLk/jL5B8Zr685mCYEuvYzP6kQB4a1pFzAXBaLhUJs7usend3IK947Lv8qzX\nKGsDd9tSCrdRDt/nWGEd6n2ZlfA7CfB4tZRk6enP1ScEDmidGNAGJqR9TY57dsIv\not7iCtE/szleZlqsFeu1kFqXFMp/uNi+9NwR6Pj9P43uuj5MJn6bIv/ORDTXo1ea\nJZh8I8L86RXuJKhkAbZ7jUP3vz+gSnO1wVrf9Yg+DciweQ496mO+ximf8qhf3i//\nVJ323ao6it2fqKu5DepsJQe5g6u+szNMscyxhXPGMEa8ElRYKKMl3mOilWLEKZjK\nXwIDAQAB\n-----END PUBLIC KEY-----\n", last_refreshed_at: 2026-06-15T22:32:39.141645Z, banner: None, deleted: false, inbox_url: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy/inbox", query: None, fragment: None }), shared_inbox_url: Some(DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/inbox", query: None, fragment: None })), matrix_user_id: None, bot_account: false, ban_expires: None, instance_id: InstanceId(1) }, counts: PersonAggregates { person_id: PersonId(2), post_count: 0, post_score: 0, comment_count: 0, comment_score: 0 } }
lemmy-1 | at crates/api/src/local_user/save_settings.rs:33
lemmy-1 | 1: lemmy_server::root_span_builder::HTTP request
lemmy-1 | with http.method=PUT http.scheme="https" http.host=lemmy.rmict.nl http.target=/api/v3/user/save_user_settings otel.kind="server" request_id=2282526c-8a99-443b-a3a2-b6369abe2f09
lemmy-1 | at src/root_span_builder.rs:16
lemmy-1 | 2026-06-15T23:20:56.040574Z WARN lemmy_server::root_span_builder: InvalidUrl: InvalidUrl
lemmy-1 | 0: lemmy_api::local_user::save_settings::save_user_settings
lemmy-1 | with data=Json(SaveUserSettings { show_nsfw: Some(true), blur_nsfw: Some(true), auto_expand: Some(false), theme: Some("browser"), default_sort_type: Some(Active), default_listing_type: Some(Local), interface_language: Some("en"), avatar: Some("https://lemmy.rmict.nl/pictrs/image/66e68922-594a-4cbc-aff6-6fcccad2c3e2.png"), banner: None, display_name: None, email: Some(Sensitive), bio: None, matrix_user_id: None, show_avatars: Some(true), send_notifications_to_email: Some(false), bot_account: Some(false), show_bot_accounts: Some(true), show_read_posts: Some(true), discussion_languages: Some([]), open_links_in_new_tab: Some(false), infinite_scroll_enabled: None, post_listing_mode: None, enable_keyboard_navigation: None, enable_animated_images: None, collapse_bot_comments: None, show_scores: Some(false), show_upvotes: Some(true), show_downvotes: Some(true), show_upvote_percentage: Some(false) }) local_user_view=LocalUserView { local_user: LocalUser { id: LocalUserId(1), person_id: PersonId(2), password_encrypted: Sensitive, email: Some(Sensitive), show_nsfw: true, theme: "browser", default_sort_type: Active, default_listing_type: Local, interface_language: "en", show_avatars: true, send_notifications_to_email: false, show_scores: false, show_bot_accounts: true, show_read_posts: true, email_verified: false, accepted_application: false, totp_2fa_secret: None, open_links_in_new_tab: false, blur_nsfw: true, auto_expand: false, infinite_scroll_enabled: false, admin: true, post_listing_mode: List, totp_2fa_enabled: false, enable_keyboard_navigation: false, enable_animated_images: true, collapse_bot_comments: false, last_donation_notification: 2026-04-26T09:11:11.320845Z }, local_user_vote_display_mode: LocalUserVoteDisplayMode { local_user_id: LocalUserId(1), score: false, upvotes: true, downvotes: true, upvote_percentage: false }, person: Person { id: PersonId(2), name: "randy", display_name: None, avatar: None, banned: false, published: 2026-06-15T22:32:39.141645Z, updated: None, actor_id: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy", query: None, fragment: None }), bio: None, local: true, private_key: Some(Sensitive), public_key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1uWJPvQkDueuj7sqHsiy\n9nP5cLk/jL5B8Zr685mCYEuvYzP6kQB4a1pFzAXBaLhUJs7usend3IK947Lv8qzX\nKGsDd9tSCrdRDt/nWGEd6n2ZlfA7CfB4tZRk6enP1ScEDmidGNAGJqR9TY57dsIv\not7iCtE/szleZlqsFeu1kFqXFMp/uNi+9NwR6Pj9P43uuj5MJn6bIv/ORDTXo1ea\nJZh8I8L86RXuJKhkAbZ7jUP3vz+gSnO1wVrf9Yg+DciweQ496mO+ximf8qhf3i//\nVJ323ao6it2fqKu5DepsJQe5g6u+szNMscyxhXPGMEa8ElRYKKMl3mOilWLEKZjK\nXwIDAQAB\n-----END PUBLIC KEY-----\n", last_refreshed_at: 2026-06-15T22:32:39.141645Z, banner: None, deleted: false, inbox_url: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy/inbox", query: None, fragment: None }), shared_inbox_url: Some(DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/inbox", query: None, fragment: None })), matrix_user_id: None, bot_account: false, ban_expires: None, instance_id: InstanceId(1) }, counts: PersonAggregates { person_id: PersonId(2), post_count: 0, post_score: 0, comment_count: 0, comment_score: 0 } }
lemmy-1 | at crates/api/src/local_user/save_settings.rs:33
lemmy-1 | 1: lemmy_server::root_span_builder::HTTP request
lemmy-1 | with http.method=PUT http.scheme="https" http.host=lemmy.rmict.nl http.target=/api/v3/user/save_user_settings otel.kind="server" request_id=1f8019d0-7c5b-430d-9e94-c771031ce22a
lemmy-1 | at src/root_span_builder.rs:16
lemmy-1 | 2026-06-15T23:21:22.844567Z WARN lemmy_server::root_span_builder: InvalidUrl: InvalidUrl
lemmy-1 | 0: lemmy_api::local_user::save_settings::save_user_settings
lemmy-1 | with data=Json(SaveUserSettings { show_nsfw: Some(true), blur_nsfw: Some(true), auto_expand: Some(false), theme: Some("browser"), default_sort_type: Some(Active), default_listing_type: Some(Local), interface_language: Some("en"), avatar: Some("https://lemmy.rmict.nl/pictrs/image/66e68922-594a-4cbc-aff6-6fcccad2c3e2.png"), banner: None, display_name: None, email: Some(Sensitive), bio: None, matrix_user_id: None, show_avatars: Some(true), send_notifications_to_email: Some(false), bot_account: Some(false), show_bot_accounts: Some(true), show_read_posts: Some(true), discussion_languages: Some([]), open_links_in_new_tab: Some(false), infinite_scroll_enabled: None, post_listing_mode: None, enable_keyboard_navigation: None, enable_animated_images: None, collapse_bot_comments: None, show_scores: Some(false), show_upvotes: Some(true), show_downvotes: Some(true), show_upvote_percentage: Some(false) }) local_user_view=LocalUserView { local_user: LocalUser { id: LocalUserId(1), person_id: PersonId(2), password_encrypted: Sensitive, email: Some(Sensitive), show_nsfw: true, theme: "browser", default_sort_type: Active, default_listing_type: Local, interface_language: "en", show_avatars: true, send_notifications_to_email: false, show_scores: false, show_bot_accounts: true, show_read_posts: true, email_verified: false, accepted_application: false, totp_2fa_secret: None, open_links_in_new_tab: false, blur_nsfw: true, auto_expand: false, infinite_scroll_enabled: false, admin: true, post_listing_mode: List, totp_2fa_enabled: false, enable_keyboard_navigation: false, enable_animated_images: true, collapse_bot_comments: false, last_donation_notification: 2026-04-26T09:11:11.320845Z }, local_user_vote_display_mode: LocalUserVoteDisplayMode { local_user_id: LocalUserId(1), score: false, upvotes: true, downvotes: true, upvote_percentage: false }, person: Person { id: PersonId(2), name: "randy", display_name: None, avatar: None, banned: false, published: 2026-06-15T22:32:39.141645Z, updated: None, actor_id: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy", query: None, fragment: None }), bio: None, local: true, private_key: Some(Sensitive), public_key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1uWJPvQkDueuj7sqHsiy\n9nP5cLk/jL5B8Zr685mCYEuvYzP6kQB4a1pFzAXBaLhUJs7usend3IK947Lv8qzX\nKGsDd9tSCrdRDt/nWGEd6n2ZlfA7CfB4tZRk6enP1ScEDmidGNAGJqR9TY57dsIv\not7iCtE/szleZlqsFeu1kFqXFMp/uNi+9NwR6Pj9P43uuj5MJn6bIv/ORDTXo1ea\nJZh8I8L86RXuJKhkAbZ7jUP3vz+gSnO1wVrf9Yg+DciweQ496mO+ximf8qhf3i//\nVJ323ao6it2fqKu5DepsJQe5g6u+szNMscyxhXPGMEa8ElRYKKMl3mOilWLEKZjK\nXwIDAQAB\n-----END PUBLIC KEY-----\n", last_refreshed_at: 2026-06-15T22:32:39.141645Z, banner: None, deleted: false, inbox_url: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy/inbox", query: None, fragment: None }), shared_inbox_url: Some(DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/inbox", query: None, fragment: None })), matrix_user_id: None, bot_account: false, ban_expires: None, instance_id: InstanceId(1) }, counts: PersonAggregates { person_id: PersonId(2), post_count: 0, post_score: 0, comment_count: 0, comment_score: 0 } }
lemmy-1 | at crates/api/src/local_user/save_settings.rs:33
lemmy-1 | 1: lemmy_server::root_span_builder::HTTP request
lemmy-1 | with http.method=PUT http.scheme="https" http.host=lemmy.rmict.nl http.target=/api/v3/user/save_user_settings otel.kind="server" request_id=dfcc8d4a-b7b4-4cb4-ab8a-983ad0a6b821
lemmy-1 | at src/root_span_builder.rs:16
lemmy-1 | 2026-06-15T23:24:24.835212Z WARN lemmy_server::root_span_builder: InvalidUrl: InvalidUrl
lemmy-1 | 0: lemmy_api::local_user::save_settings::save_user_settings
lemmy-1 | with data=Json(SaveUserSettings { show_nsfw: Some(true), blur_nsfw: Some(true), auto_expand: Some(false), theme: Some("browser"), default_sort_type: Some(Active), default_listing_type: Some(Local), interface_language: Some("en"), avatar: Some("https://lemmy.rmict.nl/pictrs/image/e467eb12-a3b3-48cf-92d6-f1e9286ce0b2.jpeg"), banner: None, display_name: None, email: Some(Sensitive), bio: None, matrix_user_id: None, show_avatars: Some(true), send_notifications_to_email: Some(false), bot_account: Some(false), show_bot_accounts: Some(true), show_read_posts: Some(true), discussion_languages: Some([]), open_links_in_new_tab: Some(false), infinite_scroll_enabled: None, post_listing_mode: None, enable_keyboard_navigation: None, enable_animated_images: None, collapse_bot_comments: None, show_scores: Some(false), show_upvotes: Some(true), show_downvotes: Some(true), show_upvote_percentage: Some(false) }) local_user_view=LocalUserView { local_user: LocalUser { id: LocalUserId(1), person_id: PersonId(2), password_encrypted: Sensitive, email: Some(Sensitive), show_nsfw: true, theme: "browser", default_sort_type: Active, default_listing_type: Local, interface_language: "en", show_avatars: true, send_notifications_to_email: false, show_scores: false, show_bot_accounts: true, show_read_posts: true, email_verified: false, accepted_application: false, totp_2fa_secret: None, open_links_in_new_tab: false, blur_nsfw: true, auto_expand: false, infinite_scroll_enabled: false, admin: true, post_listing_mode: List, totp_2fa_enabled: false, enable_keyboard_navigation: false, enable_animated_images: true, collapse_bot_comments: false, last_donation_notification: 2026-04-26T09:11:11.320845Z }, local_user_vote_display_mode: LocalUserVoteDisplayMode { local_user_id: LocalUserId(1), score: false, upvotes: true, downvotes: true, upvote_percentage: false }, person: Person { id: PersonId(2), name: "randy", display_name: None, avatar: None, banned: false, published: 2026-06-15T22:32:39.141645Z, updated: None, actor_id: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy", query: None, fragment: None }), bio: None, local: true, private_key: Some(Sensitive), public_key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1uWJPvQkDueuj7sqHsiy\n9nP5cLk/jL5B8Zr685mCYEuvYzP6kQB4a1pFzAXBaLhUJs7usend3IK947Lv8qzX\nKGsDd9tSCrdRDt/nWGEd6n2ZlfA7CfB4tZRk6enP1ScEDmidGNAGJqR9TY57dsIv\not7iCtE/szleZlqsFeu1kFqXFMp/uNi+9NwR6Pj9P43uuj5MJn6bIv/ORDTXo1ea\nJZh8I8L86RXuJKhkAbZ7jUP3vz+gSnO1wVrf9Yg+DciweQ496mO+ximf8qhf3i//\nVJ323ao6it2fqKu5DepsJQe5g6u+szNMscyxhXPGMEa8ElRYKKMl3mOilWLEKZjK\nXwIDAQAB\n-----END PUBLIC KEY-----\n", last_refreshed_at: 2026-06-15T22:32:39.141645Z, banner: None, deleted: false, inbox_url: DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/u/randy/inbox", query: None, fragment: None }), shared_inbox_url: Some(DbUrl(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("lemmy.rmict.nl")), port: None, path: "/inbox", query: None, fragment: None })), matrix_user_id: None, bot_account: false, ban_expires: None, instance_id: InstanceId(1) }, counts: PersonAggregates { person_id: PersonId(2), post_count: 0, post_score: 0, comment_count: 0, comment_score: 0 } }
lemmy-1 | at crates/api/src/local_user/save_settings.rs:33
lemmy-1 | 1: lemmy_server::root_span_builder::HTTP request
postgres-1 | PostgreSQL Database directory appears to contain a
Message in browser:
Tribute is null, importing... client.js:2:927432
The Notification permission may only be requested from inside a short running user-generated event handler. settings
XHRPUT
https://lemmy.rmict.nl/api/v3/user/save_user_settings
[HTTP/2 400 7ms]
auto_expand false
avatar "https://lemmy.nu.nl/pictrs/image/2a8a24cc-6f85-445f-923d-b3c75cddcc80.jpeg"
blur_nsfw true
bot_account false
default_listing_type "Local"
default_sort_type "Active"
discussion_languages []
email "r.vandenberg@rmict.nl"
interface_language "en"
open_links_in_new_tab false
send_notifications_to_email false
show_avatars true
show_bot_accounts true
show_downvotes true
show_nsfw true
show_read_posts true
show_scores false
show_upvote_percentage false
show_upvotes true
theme "browser"
Tribute is null, importing... client.js:2:927432
The Notification permission may only be requested from inside a short running user-generated event handler. settings
XHRPUT
https://lemmy.rmict.nl/api/v3/user/save_user_settings
[HTTP/2 400 7ms]
error "invalid_url"
I am able to access the picture on https://lemmy.rmict.nl/pictrs/image/2a8a24cc-6f85-445f-923d-b3c75cddcc80.jpeg
But it just does not save the setting
I have Nginx proxy manager in front of it but this just forwards to the internal proxy port: 10633
What am i missing, i have had this issue on a newly installed instance and i am unable to find a fix.
The bug report — this is genuinely thorough and will let a maintainer pinpoint it fast:
Title: InvalidUrl on save_user_settings for any URL field (avatar/banner) — valid same-host URL, 0.19.19 Fresh 0.19.19 docker install. Saving any URL field (avatar, banner) fails HTTP 400 invalid_url at crates/api/src/local_user/save_settings.rs:33. Text fields (bio, display_name) save fine — so it’s isolated to URL validation, not auth or the transaction. The avatar URL is https://lemmy.rmict.nl/pictrs/image/<id>.png — correct host, no port, valid syntax. The image uploads to pictrs successfully and is reachable. Ruled out:
curl from inside the lemmy container reaches the URL (405 on HEAD, allow: GET) local_site_url_blocklist empty; slur_filter_regex empty instance domain (id=1) = lemmy.rmict.nl (matches) pictrs url = http://pictrs:8080/ (no trailing slash) image_mode tested: default and None — no change Reverse proxy Host forced to lemmy.rmict.nl, X-Forwarded-Proto https — no change Text-only settings save successfully
Setup: NPM (separate host) terminates TLS → http://<host>:10633 → bundled nginx → lemmy:8536. tls_enabled: true. Debug log shows only the wrapped InvalidUrl: InvalidUrl with no underlying cause. What at save_settings.rs:33 rejects a syntactically valid, reachable, same-host URL?
Its hard to say, but its probably an issue with nginx proxy mananger, doing some wrong routing on images. I couldn’t even access the images above.
Yeah i turned it off sorry, issue is that the picture is being uploaded, and the image is there and visitable, but the settings are not saved, with the InvalidUrl error
deleted by creator

