Selfhosted

54792 readers
379 users here now

A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.

Rules:

  1. Be civil: we're here to support and learn from one another. Insults won't be tolerated. Flame wars are frowned upon.

  2. No spam posting.

  3. Posts have to be centered around self-hosting. There are other communities for discussing hardware or home computing. If it's not obvious why your post topic revolves around selfhosting, please include details to make it clear.

  4. Don't duplicate the full text of your blog or github here. Just post the link for folks to click.

  5. Submission headline should match the article title (don’t cherry-pick information from the title to fit your agenda).

  6. No trolling.

  7. No low-effort posts. This is subjective and will largely be determined by the community member reports.

Resources:

Any issues on the community? Report it using the report flag.

Questions? DM the mods!

founded 2 years ago
MODERATORS
1
 
 

Due to the large number of reports we've received about recent posts, we've added Rule 7 stating "No low-effort posts. This is subjective and will largely be determined by the community member reports."

In general, we allow a post's fate to be determined by the amount of downvotes it receives. Sometimes, a post is so offensive to the community that removal seems appropriate. This new rule now allows such action to be taken.

We expect to fine-tune this approach as time goes on. Your patience is appreciated.

2
 
 

Hello everyone! Mods here 😊

Tell us, what services do you selfhost? Extra points for selfhosted hardware infrastructure.

Feel free to take it as a chance to present yourself to the community!

🦎

3
 
 

I've been a bit short sighted. I set up my WordPress instance on a server with... Not a huge amount of space. A year or so later, and now I'm running out. I have another server which I could serve files from, and it's got loads of space. Is there a way that I could get the Wordpress media library to just... Serve and upload from that one instead? Preferably migrate it there as well.

Too many people I find online get some sort of yuppie answer like an expensive plug-in with an Amazon CDN subscription. I just want to homebrew this. I don't intend to host the major site assets for the site structure on it, and I'm fine with images taking a little longer to load.

4
 
 

I started using Docker containers last week, so this is all new to me.

I have a huge library of pictures in another drive (HDD) on my PC and I tried to setup Immich to index those.

I'm using Windows, Docker is installed on C: drive and I gave Docker permission to check the D: drive, but I can't make Immich find it when adding an external library.

I edited the yml file, including D:\Pictures but I get an error when trying to add the path in Immich.

Tried to search around, but without luck.

Someone knows how can I do this? Thank you :)

5
 
 

Managarr v0.7.0 has been released with Lidarr support!

What is Managarr?

Managarr is a terminal-based application for managing all your Servarr instances from one place. It provides a user-friendly interface to interact with your media libraries, making it easier to manage your downloads, monitor your artists and albums, and perform various actions directly from the terminal.

It sports two modes: a TUI mode (Text-based User Interface) and a CLI mode (Command Line Interface).

TUI mode gives you an interactive User Interface right inside your terminal window, allowing you to navigate through your Sonarr and Radarr libraries, view details about your series and movies, and perform actions like adding or removing items, all through keyboard shortcuts.

CLI mode lets you execute commands directly from the terminal to manage your Servarr instances without needing to open the TUI. This is great for quick tasks or for integrating with scripts and automation tools.

Screenshots

Try it out for yourself using the in-browser demo!

If you want to try it out for yourself without installing it first, you can use the Managarr demo-site: https://managarr-demo.alexjclarke.com/

What Lidarr operations are supported?

📚 Library Management

  • Artist Library - Browse, search, filter, and sort your music collection
  • Add Artists ➕ - Search for new artists and add them with full config options (quality profile, metadata profile, root folder, monitoring options)
  • Edit Artists ✏️ - Tweak artist settings including quality profiles, metadata profiles, tags, and monitoring status
  • Delete Artists 🗑️ - Remove artists from your library with optional file deletion
  • Artist Details 🔍 - Get the full picture on any artist:
    • Overview, disambiguation, type, status, genres, and ratings
    • Album list with release dates, track counts, and download status
    • Artist history with detailed event info
    • Manual discography search with release selection and download

💿 Album & Track Management

  • Album Details - Drill into individual albums to see:
    • Track listing with audio info (codec, channels, bitrate, sample rate, bit depth)
    • Album history
    • Manual album search for grabbing specific releases
  • Track Details 🎼 - View individual track info and history
  • Delete Albums - Remove individual albums from your library

⬇️ Downloads & Queue

  • Downloads Tab - Keep an eye on active downloads and manage your queue
  • Blocklist 🚫 - View and manage blocked releases

📜 History

  • Full History Support - Browse, search, filter, and sort Lidarr event history
  • History Details - Dig into the details of any history event
  • Mark as Failed ❌ - Mark history items as failed

🔎 Indexers

  • Indexer Management - View, add, edit, and delete indexers
  • Indexer Settings ⚙️ - Configure global indexer settings
  • Test Indexers 🧪 - Test individual or all indexers at once

📁 Root Folders

  • Root Folder Management - Add and manage root folders for your music library

🖥️ System

  • System Status - View Lidarr system info and health checks
  • Tasks - View and trigger system tasks
  • Queued Events - Monitor queued system events
  • Logs 📋 - Browse system logs
  • Updates 🆙 - Check for and view available updates

⌨️ CLI Commands

Full Lidarr CLI support for all the things!

managarr lidarr list artists|albums|tracks|indexers|root-folders|tags|quality-profiles|...
managarr lidarr get artist|album|track|...
managarr lidarr add artist|root-folder|tag|...
managarr lidarr edit artist|indexer|indexer-settings|...
managarr lidarr delete artist|album|root-folder|tag|blocklist-item|...
managarr lidarr search artist|album|...
managarr lidarr refresh artist|downloads|...
managarr lidarr trigger-automatic-search artist|album
managarr lidarr manual-search artist|album

Managarr also supports Radarr and Sonarr!

If you're running the full *arr stack, Managarr has you covered - It supports Radar and Sonarr too, all from the same interface!

This is a passion project so I'd love to hear your feedback, feature requests, or any bug reports you find.

6
44
submitted 17 hours ago* (last edited 16 hours ago) by Excaliburr@lemmy.dbzer0.com to c/selfhosted@lemmy.world
 
 

I need some help if anyone could take the time and has the knowledge:

I'm basically new to podman and namespaces, relatively new to linux and a noob at networking. So figuring this out and getting it to work took many more hours than I would like to admit, but I still have a few problems. I have all my current Quadlets below in the spoiler (seperated by "---", assume user123 = UID 1000). I am on Bazzite, rootless Podman, which probably makes this even harder.

Spoiler with the Quadlets

[Unit]
Description=Arr-stack pod

[Pod]
PodName=arr-stack
# Network
# Network=vpn-only

# User mapping / I don't fully understand this yet, but the pod does not work without this (maps user id to specified ID inside the containers? So the containers have UID:GID 1000:1000?)
UserNS=keep-id:uid=1000,gid=1000
#
# Homepage Port Mapping
PublishPort=3000:3000
# Jellyfin Port Mapping
PublishPort=8096:8096/tcp
# qBittorrent Port Mapping
PublishPort=8080:8080
#PublishPort=6881:6881
#PublishPort=6881:6881/udp
# Prowlarr Port Mapping
PublishPort=9696:9696
# Flaresolverr Port Mapping
PublishPort=8191:8191
# Radarr Port Mapping
PublishPort=7878:7878
# Sonarr Port Mapping
PublishPort=8989:8989

# Jellyseerr Port Mapping
#PublishPort=8055:5055

#[Install]
# WantedBy=default.target

***

[Unit]
Description=Gluetun Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod


[Container]
ContainerName=gluetun
Pod=arr-stack.pod
Image=docker.io/qmcgaw/gluetun:v3
AutoUpdate=registry
# Network
# Network=vpn-only

# UID/GID permissions / root + privileged for networking?
PodmanArgs=--privileged
User=0
Group=0
# Equivalent to cap_add: - NET_ADMIN # one wrong?
AddCapability=NET_ADMIN
AddCapability=CAP_NET_ADMIN
# Required for Gluetun to delete the bridge's default route, but does not work
AddCapability=NET_RAW
AddCapability=CAP_NET_RAW
# Equivalent to "devices: - /dev/net/tun:/dev/net/tun"
AddDevice=/dev/net/tun:/dev/net/tun

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=gluetun.env
# Environment=FIREWALL_OUTBOUND_SUBNETS=10.90.0.0/24 / test from a specific podman network
Environment=FIREWALL_INPUT_PORTS=8080
#
Environment=VPN_SERVICE_PROVIDER= <123>
Environment=VPN_TYPE=wireguard
Environment=WIREGUARD_PRIVATE_KEY= <key>
Environment=SERVER_COUNTRIES= <country>
# for now:
Environment=VPN_PORT_FORWARDING=off
#Secret=openvpn_user,type=env,target=OPENVPN_USER
#Secret=openvpn_password,type=env,target=OPENVPN_PASSWORD

#Volume
Volume=/var/home/user123/.config/arr-configs/gluetun:/gluetun:Z
# SecurityLabel=disable

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=qBittorrent Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=qbittorrent
Pod=arr-stack.pod
Image=lscr.io/linuxserver/qbittorrent:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions / linuxserver images require UID:GID 0:0 at the start; they won't start without it
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=qbittorrent.env
Environment=WEBUI_PORT=8080
# Environtment=TORRENTING_PORT=6881

# Volume :Z (> :z) probably works as well and is saver for configs?
Volume=/var/home/user123/.config/arr-configs/qbittorrent:/config:z
Volume=/var/home/user123/Videos/Downloads:/downloads:z
# Volume=/var/home/user123/Videos/Downloads/completed:/downloads:z,U
# Volume=/var/home/user123/Videos/Downloads/incomplete:/incomplete:z,U
# Volume=/var/home/user123/Videos/Downloads/torrents:/torrents:z,U

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=Prowlarr Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=prowlarr
Pod=arr-stack.pod
Image=lscr.io/linuxserver/prowlarr:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions / linuxserver images require UID:GID 0:0 at the start; they won't start without it
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=prowlarr.env
Environment=WEBUI_PORT=9696

# Volume
Volume=/var/home/user123/.config/arr-configs/prowlarr:/config:z,U

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=Sonarr Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=sonarr
Pod=arr-stack.pod
Image=lscr.io/linuxserver/sonarr:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions / linuxserver images require UID:GID 0:0 at the start; they won't start without it
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=sonarr.env
Environment=WEBUI_PORT=8989

# Volume / Disable SecurityLabels due to SMB share, need to look this up
SecurityLabelDisable=true
Volume=/var/home/user123/.config/arr-configs/sonarr:/config:z
Volume=/var/home/user123/Videos/Shows:/tv:z
Volume=/var/home/user123/Videos/Downloads:/downloads:z

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=Radarr Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=radarr
Pod=arr-stack.pod
Image=lscr.io/linuxserver/radarr:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions / linuxserver images require UID:GID 0:0 at the start; they won't start without it
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=radarr.env
Environment=WEBUI_PORT=7878

# Volume / Disable SecurityLabels due to SMB share
SecurityLabelDisable=true
Volume=/var/home/user123/.config/arr-configs/radarr:/config:z
Volume=/var/home/user123/Videos/Movies:/movies:z
Volume=/var/home/user123/Videos/Downloads:/downloads:z

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=Flaresolverr Container
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=flaresolverr
Pod=arr-stack.pod
Image=ghcr.io/flaresolverr/flaresolverr:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=flaresolverr.env
Environment=WEBUI_PORT=8191
Environment=LOG_LEVEL=info
Environment=LOG_HTML=false
Environment=CAPTCHA_SOLVER=none

# Volume=flaresolverr:/app/

[Service]
Restart=always

#[Install]
#WantedBy=default.target

***

[Unit]
Description=Podman - Jellyfin
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container


[Container]
ContainerName=jellyfin
Pod=arr-stack.pod
Image=ghcr.io/jellyfin/jellyfin
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions / 1000:1000 might work?
User=0
Group=0
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvironmentFile=jellyfin.env
Environment=WEBUI_PORT=8096:8096/tcp
#PublishPort=8096:8096/tcp
#PublishPort=8920:8920
#PublishPort=7359:7359/udp
#PublishPort=1900:1900/udp

# Volume
Volume=/var/home/user123/.config/arr-configs/jellyfin:/config:z
Volume=/var/home/user123/Videos/jellyfin-cache:/cache:z
Volume=/var/home/user123/Videos/Movies:/data/movies:z
Volume=/var/home/user123/Videos/Shows:/data/shows:z

[Service]
# Inform systemd of additional exit status
# SuccessExitStatus=0 143a
Restart=always
TimeoutStartSec=900

#[Install]
# Start by default on boot
#WantedBy=default.target


***

[Unit]
Description=Homepage Dashboard
# Dependencies
# pod
Wants=arr-stack-pod.service
After=arr-stack-pod.service
Requires=arr-stack-pod.service
PartOf=arr-stack-pod.service
# .pod is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=arr-stack.pod
After=arr-stack.pod
Requires=arr-stack.pod
PartOf=arr-stack.pod
# gluetun
Wants=gluetun.service
After=gluetun.service
Requires=gluetun.service
BindsTo=gluetun.service
# .container is probably not quite what I want, but it works and I might as well keep it, in case they change the syntax
Wants=gluetun.container
After=gluetun.container
Requires=gluetun.container
BindsTo=gluetun.container
# idk about this?:
After=network-online.target
Wants=network-online.target
# Socket
Wants=podman.socket
After=podman.socket
Requires=podman.socket


[Container]
ContainerName=homepage
Pod=arr-stack.pod
Image=ghcr.io/gethomepage/homepage:latest
AutoUpdate=registry
# Network
Network=container:gluetun

# UID/GID permissions
User=1000
Group=1000
Environment=PUID=1000
Environment=PGID=1000

# EnvironmentFile=global.env
Timezone=UTC
Environment=TZ=Etc/UTC

# EnvirontmentFile=homepage.env
#Environment=LOG_LEVEL=debug
Environment=HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev
#PublishPort=3000:3000

# Podman socket (recommended on Bazzite)
Volume=%t/podman/podman.sock:/var/run/docker.sock:ro
#Volume=/var/run/docker.sock:/run/user/1000/podman/podman.sock:ro
#Volume=/%t/podman/podman.sock:/run/user/1000/podman/podman.sock:ro

# Volume / Config directory
SecurityLabelDisable=true
Volume=%h/apps/homepage:/app/config:Z
Volume=%h/apps/homepage/icons:/app/public/icons:Z

[Service]
Restart=on-failure
TimeoutStartSec=300

#[Install]
#WantedBy=default.target

Questions:

    1. If I use "podman exec ip route" (on e.g. qbittorrent) the default route goes through my actual network interface (actual ip adress) which I very much do not want (or through my killswitch dummy network from my VPN if on, which is better but still not ideal). Is there a way to completely remove my actual network from a container's eyes? "podman exec ip addr" shows 1 lo (local), 2 my actual network, 4 tun0 from gluetun. The traffic does go through gluetun correctly, but I don't trust it 100%. Having the containers separated and NOT inside a pod gives the same result, since the containers share the network namespaces from the gluetun container when I do "Network=container:gluetun" (same as just having them in a pod as far as I understand). I tried to also create a podman network without a default gateway, but then gluetun cannot connect to the VPN in the first place.
    1. My setup works but is quite convoluted and probably has many unnecessary lines, so please give me any improvements you see
    1. Is User=1000, Group=1000, even sensible? For example in the homepage container those lines result in the container showing User "1000:1000" (from podman inspect). Would User=0, Group=0 (or no lines since I use UserNS=keep-id in the pod?), which shows as User=root (podman inspect) mean that it has actual root access or just that it is root INSIDE the container?

Thank you in advance for the answers, in case I don't reply to your comment specifically.

7
8
 
 

Hi all, I'll cut to the point: is anyone out there running a NAS with multiple users, and each user has their own media folders and files that belong to them, with share access to those files (samba), and separately is also running an instance of Immich (as its own user) that in some way has access to these files and folders, AND is able to upload new files, while maintaining the NAS user ownership/permissions on those files?

In my current setup, each user's media files have permissions user:media 740 (so the "media" group has read access). The Immich user is in the media group. I then have the NAS files mapped as read-only, and added in Immich as external storage per user. This means I'm currently not uploading anything. (If I do, they get stored separately in Immich, not merged with the rest of the media files).

I could instead make the dir writable by the media group, map each NAS user's media directories directly as their Immich upload location (and fix up the Immich file naming/organization so that it matches), but I would still have the problem that it would create new files as the Immich user on the NAS, not the specific user.

Is there a clever permissions solution here I'm missing, or is it a lost cause to try and have both coherent per-user permissions on the NAS/samba share, AND use Immich? I don't really want a script that runs and chmods everything to user:media periodically. Feels hacky, and then Immich isn't able to change/delete any files, but that might be the only solution...

9
 
 

I like onedrive a lot as it meets everything i need. But there is one issue. Privacy.

So i am using infomaniak kdrive right now. A very good one drive alternative if you like your privacy. But they keep having issues with payments. So i am looking for something else.

My partner and i are looking for a family plan. about 1tb per user. Webdev is very important for me as i always use nextcloud als a sync app. It is nice it has web office build in too just like onedrive has. as i have a lot of meetings.

Recently we purchased a family plan with internxt. But god their software is bad. So that is a no go.

I couple things we looking at

sync.com - filen - pcloud - icedrive

proton is a good one too. Bit a bit on the pricey side.

We are still doing research on pcloud as i still do not trust pcloud that well.. I dont know but something still smells about this company...

Anyone any ideas?

10
 
 

Hi there, folks. I hope this post is okay here. I'm trying to do my best to follow the rules and also to have done my homework before I come here with questions, but if this is the wrong place to ask my questions, I'd just like to politely ask for directions for the right place to ask. I recently started test driving Jellyfin in a more limited way on my desktop, and I'm impressed. I'm way on board with building out my library and self hosting the majority of my media consumption. I'm looking into buying a NAS, and it's not going to break the bank, but it's still a substantial purchase, and I don't want to waste money by buying the wrong thing for my needs.

I'm looking at getting something like a UGreen DH4300 NAS with four 8 TB hard drives in RAID 5, which ought to be 24 TB of usable space, if I understand correctly. My primary use case is going to be a Jellyfin server for video, though I might try hosting other media libraries and files there like eBooks and such, through Jellyfin or otherwise. Looking at my Blu Ray shelf, I've got about 65 Blu Rays already, some of which are combo packs with 4K and 1080p versions, and once I've got a server like this set up, I'm very much inclined to build that library out even more. Currently, I have no screen or drive with which to watch 4K movies (I have a regular Blu Ray drive, a 1080p TV, and my PC monitor tops out at 1440p), but if I'm being mindful of future proofing, whenever my current TV dies, I'll have more reason for accumulating 4K content. I don't intend for frequent usage of this Jellyfin server to be by anyone besides my wife and me, and I'd be surprised if I ever had 5 simultaneous users.

So here are where my questions come in.

  1. Is a NAS like the one above strong enough to drive high quality output to even 5 simultaneous users, rare though that use case might be? Other than my regular gaming desktop, which is quite powerful, I also have a Minisforum EM780 mini PC that could potentially drive a media server if that's necessary/sufficient?

  2. I've been reading posts in this community here and there, and I've come across a comment or two about security when exposing ports to the outside world. At the risk of being a big dummy, with selective port forwarding, what kind of real risks are there to this? And is there a reasonable way to navigate those risks such that I could regularly access my own Jellyfin server when I'm on the go like I would any third party streaming service? To be clear, this project is still of interest to me even if it's restricted to my own home network, but it would be a bummer if exposing it to the outside world was particularly ill advised.

  3. I've seen measurements of things like decibel levels in reviews and words of caution about power draw, but I'm curious for feedback from folks here about real world noise levels and power draw from a NAS like the one above with HDDs. Is the noise easily ignored when it's in the same room? I have a small apartment, and there are only so many places I could feasibly put one. Is the power draw noticeable on your electric bill such that you're particularly mindful of when it's running?

  4. Any other tips for this project that I might not know that I don't know?

Thanks!

11
 
 
12
13
 
 

I have an ancient laptop running Proxmox with a few containers. I want some of the containers and the Proxmox management UI to be in the LAN, and a few other containers to be in my DMZ.

I haven't touched any of the default networking setup. There is a single VLAN-agnostic Linux bridge vmbr0 associated with the physical ethernet interface. All containers and the management UI are associated with this bridge. The interface on the physical switch to which the laptop is connected is in the DMZ VLAN.

I have some idea how to accomplish what I want but wanted to run it by you all to see if I'm making any serious errors. I need to put the physical switch port in trunking mode. Then I need to make vmbr0 VLAN-aware and create VLAN interfaces on vmbr0. My current assumption is that I can leave the management UI and the containers I want in the private LAN alone, as the private LAN is untagged, and move the public containers onto the DMZ VLAN.

14
27
Wildlife cam setups? (piefed.social)
submitted 2 days ago* (last edited 1 day ago) by Flamekebab@piefed.social to c/selfhosted@lemmy.world
 
 

I've got a server running Debian and I've previously borrowed a wildlife cam for my garden. It activates on motion and records, has night vision, etc..

That said the only way to get the footage is to go out there and pull the SD card.

Is there a self-hosted approach to this? I don't know what weather-proof camera setup people like for this sort of thing.

Edit for clarity: I don't own a camera. I would need to buy one. That's part of what this post is about - is there some self hosted software for this sort of thing that has a list of cameras it supports? Or a standard that the software needs the camera to support?

15
 
 

I'm curious if anyone has had much luck leveraging older AMD hardware to use ROCm, I have an 6700 xt that I've just begun inquiring about, and it seems it falls outside of official support.

Right now I intend to pass it through to my Debian Docker VM to support transcoding in some containers in addition to machine learning applications.

16
 
 

Basically, I want to make one for some multiplayer games out there (along with Stoat communities, or something similar - what do y'all recommend? Bonus if it has voice chat).

What would I need, and how can I set this up safely without having my own network hacked beyond comprehension? I could do it off site from home too if that's better.

I have a Raspberry Pi 4gb, but also an old DDR3 16gb desktop with a PCI network card available if that's recommended.

17
 
 

I recently noticed that htop displays a much lower 'memory in use' number than free -h, top, or fastfetch on my Ubuntu 25.04 server.

I am using ZFS on this server and I've read that ZFS will use a lot of RAM. I also read a forum where someone commented that htop doesn't show caching used by the kernel but I'm not sure how to confirm ZFS is what's causing the discrepancy.

I'm also running a bunch of docker containers and am concerned about stability since I don't know what number I should be looking at. I either have a usable ~22GB of available memory left, ~4GB, or ~1GB depending on what tool I'm using. Is htop the better metric to use when my concern is available memory for new docker containers or are the other tools better?

Server Memory Usage:

  • htop = 8.35G / 30.6G
  • free -h =
               total        used        free      shared  buff/cache   available
Mem:            30Gi        26Gi       1.3Gi       730Mi       4.2Gi       4.0Gi
  • top = MiB Mem : 31317.8 total, 1241.8 free, 27297.2 used, 4355.9 buff/cache
  • fastfetch = 26.54GiB / 30.6GiB

EDIT:

Answer

My Results

tldr: all the tools are showing correct numbers. Htop seems to be ignoring ZFS cache. For the purposes of ensuring there is enough RAM for more docker containers in the future, htop seems to be the tool that shows the most useful number with my setup.

18
 
 

Linux installs fast. Then you spend the next hour doing the same boring ritual: browser, codecs, media tools, chat apps, dev tools, fonts, utilities… all via tabs, notes, and half-forgotten package names.

So I built LinuxMate: a free, open-source helper that generates a clean “get me productive” install script from a checklist. Basically Ninite, but for Linux, and without the “sign in to continue existing” vibes.

  • Pick apps/tools
  • Choose your distro / package manager
  • Get a reproducible script
  • Run it and move on with your life

Live demo: https://www.allroundwebsite.com/linuxmate/ Repo: https://github.com/Henkster72/LinuxMate Blog (my reasoning / background): https://www.allroundwebsite.com/blog/bye-windows-hello-linux-and-linuxmate/

If you’ve got strong opinions (the useful kind): distro support, package picks, safer defaults, or edge cases, I’m collecting feedback.

19
 
 

See the post in the link for the latest details. As of me making this post

Due to an error during an organization migration, we have temporarily lost control of the bentopdf namespace on Docker Hub. The bentopdf username/namespace may currently be in a released state, meaning it could potentially be registered by a third party.

20
 
 

Inspired by nitter.

21
31
submitted 3 days ago* (last edited 3 days ago) by tserts@lemmy.tserts.com to c/selfhosted@lemmy.world
 
 

Lets hope this works, I am posting from my new instance, which has some teething issues, so if you see this it is a small victory...

I must fix some issues on my lemmy instance before I go insane. The setup is pretty simple (or so I thought), proxmox > ct with docker lemmy no outside connection, and another ct with docker npm proxying for it.

  1. There is this deal breaking issue: on my local posts (the federated content seems to work) when I browse a community, the image posts are not showing the thumb, which expands if you click on it, istead they are shown as "link" and when I click on the black icon with the square with the arrow the image opens full screen on the window (it opens the image link). I think I have verified that the issue is that lemmy sets my image posts as link posts, there are no errors and the html shows no missing thumb. All tests show that my images get processed as they should, but in the end the post is "marked" as a link and it shows the square with the arrow.

  2. Federation is also hit or miss, I get content, upvotes, posts, I can search and browse instances BUT some communites (random, even from the same instance) stay pending instead of joined (like this community).

  3. Finally, I cannot find my instance searching from other instances, even though my instance is in their lists.

Can someone who has made nginx proxy manager on a separate server in the network give me some pointers?

I have done so many changes, tried to use nginx locally on the same CT (lemmy <> nginx <> npm) got to about the same state, wasted hours with the AI taking for a ride down "Hack-Town", I am about to call it quits.

Here are the configs:

root@xx:/opt/lemmy# cat docker-compose.yml

networks:
  # This stays internal for DB safety
  lemmyinternal:
    driver: bridge
    internal: true
  # We use the default bridge for everything that needs internet/DNS
  default:
    driver: bridge
  lemmyexternal:

services:
  lemmy:
    image: dessalines/lemmy:0.19.15
    networks:
      - lemmyinternal
      - default # Added to allow federation/DNS/Pictrs access
    ports:
      - 8536:8536
    restart: always
    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"
      - RUST_BACKTRACE=1
      #
***
FIXES START HERE
***
      - LEMMY_HOSTNAME=lemmy.tserts.com
      - LEMMY_EXTERNAL_HOST=lemmy.tserts.com
      - LEMMY_HTTPS=true # Tells backend to generate https:// links for the UI
      #
***
FIXES END HERE
***
    volumes:
      - /opt/lemmy/lemmy.hjson:/config/config.hjson
    depends_on:
      - postgres
      - pictrs

  lemmy-ui:
    image: dessalines/lemmy-ui:0.19.15
    networks:
      - lemmyinternal
      - default # Added so it can resolve 'lemmy' container via DNS
    ports:
      - 1236:1234
    environment:
      - LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
      #
***
FIXES START HERE
***
      - LEMMY_UI_LEMMY_EXTERNAL_HOST=lemmy.tserts.com # Removed IP to stop CORS errors
      - LEMMY_UI_HTTPS=true # Matches your NPM SSL setup
      - LEMMY_HTTPS=true
      #
***
FIXES END HERE
***
    depends_on:
      - lemmy
    restart: always

  pictrs:
    image: asonix/pictrs:0.5.0
    networks:
      - lemmyinternal
      - default # Critical for downloading external images
    hostname: pictrs
    #environment:
    user: 991:991
    volumes:
      - /opt/lemmy/volumes/pictrs:/mnt
    restart: always

  postgres:
    image: postgres:15-alpine
    networks:
      - lemmyinternal
    hostname: postgres
    # No changes needed here, internal is fine for DB
    environment:
      - POSTGRES_USER=xx
      - POSTGRES_PASSWORD=xxx
      - POSTGRES_DB=xx
    volumes:
      - /opt/lemmy/volumes/postgres:/var/lib/postgresql/data
    restart: always

root@xx:/opt/lemmy# cat lemmy.hjson

{
  # for more info about the config, check out the documentation
  # https://join-lemmy.org/docs/en/administration/configuration.html

  # only few config options are covered in this example config


  # the domain name of your instance (eg "lemmy.ml" or "fernchat.esotericmonkey.com")
  hostname: "lemmy.tserts.com"
  # address where lemmy should listen for incoming requests
  bind: "0.0.0.0"
  # port where lemmy should listen for incoming requests
  port: 8536
  # Whether the site is available over TLS. Needs to be true for federation to work.
  tls_enabled: true

  # pictrs host
  pictrs: {
    url: "http://pictrs:8080/"
    # api_key: "API_KEY"
  }

  # settings related to the postgresql database
  database: {
    # name of the postgres database for lemmy
    database: "xx"
    # username to connect to postgres
    user: "xx"
    # password to connect to postgres
    password: "xx"
    # host where postgres is running. This needs to match the postgres hostname in the portainer stack
    host: "postgres"
    # port where postgres can be accessed
    port: 5432
    # maximum number of active sql connections
    pool_size: 5
  }


# See the documentation for available config fields and descriptions:
# https://join-lemmy.org/docs/en/administration/configuration.html
  federation: {
  hostname: "lemmy.tserts.com"
  # allowed_instances: <lemmy_ml>
}

  email: {
    smtp_server: "xx"
    smtp_login: "xx"
    smtp_password: "xx"
    smtp_from_address: "xx"
    tls_type: "starttls"
  }
}

Here is npm advanced tab, websockets are on and ssl is also setup right.

# Handle ActivityPub/Federation traffic
location ~ ^/(u|c|post|comment|nodeinfo|explore) {
    set $proxytarget "http://10.0.0.227:1236/"; # Default to UI
    
    if ($http_accept ~* "application/(activity|ld)\+json") {
        set $proxytarget "http://10.0.0.227:8536/"; # Send to Backend
    }

    proxy_pass $proxytarget;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

# Standard Root Location
location / {
    proxy_pass http://10.0.0.227:1236/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

# API and Pictrs
location /api/ {
    proxy_pass http://10.0.0.227:8536/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /pictrs/ {
    proxy_pass http://10.0.0.227:8536/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Help me get my sleep back. ___

22
 
 

Does anyone have a suggestion for photo notes? By this I mean, we use our cameras for actual photos but also quick pictures for products, model numbers, passwords...

I'm looking for a separate app to take pictures so my random pictures of product tags are separated and don't show up in my immich memories

Any suggestions?

23
24
 
 

Hi everyone, I’m running a Proxmox server with a Docker LXC container and want to set up a music server. I’ve heard about many services, but I’m not sure which one fits my needs best. My goals:

A program that lets me play music with many client apps, ideally with offline playback for some tracks.

A tool that helps me discover and download music, similar to how I use Deluge, Prowlarr, and SABnzbd for my movie server.

A service that recommends music based on my taste and playlists, like Spotify does. This is especially important for me because I’m not very creative with my playlists—they tend to be short and boring.

I want to share the server with my girlfriend, who uses Apple devices, so the experience should be as smooth as Spotify for her.

What self-hosted music servers do you use in your homelabs? Are there any tools that can analyze my existing playlists and suggest similar music? Do you have any tutorials, blog posts, or Docker Compose files for easy setup?

I’m really excited to hear what you’re using and what you recommend!

25
 
 

Hi everyone, I’ve recently taken an interest in self-hosted solutions for document management and budgeting, specifically Paperless-ngx, Firefly III, and n8n. A bit about me: I run a Proxmox server with a freshly set up Docker LXC container. I’m still quite new to all this, but i am infected with the homelab fever.

After spending hours on Google, I’ve come across a few services that caught my eye:

Paperless-ngx: A tool for scanning and organizing all my receipts, invoices, and documents in a searchable database.

Firefly III: A budgeting app with lots of cool features. My goal is to use it to get a better overview of my finances.

n8n: To automate the process, because I know I’m lazy and won’t keep up with manual data entry for long.

My idea: I want to scan receipts and invoices, store them in Paperless-ngx, use OCR to extract the text, total amount, and maybe even individual items, and then pass that data to Firefly III via n8n.

My questions:

Does anyone have experience with these tools? Is this a good approach, or should I consider other software?

I’ve seen that n8n is getting a lot of hype, but also has some critical, glaring issues. Is it still a good choice for this kind of automation?

Are there any tutorials or blog posts out there that cover a similar setup? I haven’t found much online. Are there any additional Docker containers I should consider, like a dedicated AI container or a special database? I have only a weak Intel I5 7th Gen PC.

I’d love to hear your thoughts, experiences, or any concerns you might have about this project. If you know someone who has done something similar, or if there’s a hidden tutorial I’ve missed, please let me know!

view more: next ›