Never call yourself an idiot. Not a good IT engineer? (Just saying, I don't know you) That doesn't make you stupid at all.
Selfhosted
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:
-
Be civil.
-
No spam.
-
Posts are to be related to self-hosting.
-
Don't duplicate the full text of your blog or readme if you're providing a link.
-
Submission headline should match the article title.
-
No trolling.
-
Promotion posts require active participation, with an account that is at least 30 days old. F/LOSS without a paywall has exceptions, with requirements. See the rules link for details. Tags [CBH] or [AIP] are required, see the links in Rule 8 for details.
-
AI-related discussions and AI-involved promotional posts have additional requirements for tagging, as noted in Rule 7 and the AI & Promotional Post Expanded Rules post, and find example disclosures here.
Resources:
- selfh.st Newsletter and index of selfhosted software and apps
- awesome-selfhosted software
- awesome-sysadmin resources
- Self-Hosted Podcast from Jupiter Broadcasting
Any issues on the community? Report it using the report flag.
Questions? DM the mods!
For whatever it is worth to you I've hardened my jellyfin docker compose this way. I'm obscuring some things in this that are local to my network.
The container is read only. It mounts the media read only. It should be fairly isolated from getting privileges it shouldn't have. The only things lost in this setup are the ability to delete media from a jellyfin client (something I never do) and the ability to manipulate files directly stored with the media. I use bazarr for subtitles so don't need jellyfin to download them and I don't keep trickplay or any other jellyfin metadata related files alongside the media. I feel pretty confident with this that even if the jellyfin codebase had a serious 0 day that the worst I'd lose is metadata and server setup, and important config files I have backing up to another machine.
I'm sure there's things I've overlooked with this setup so I'm very open to being told there's a better way to do something.
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
mac_address: OBSCURED # see macvlan note below
hostname: jellyfin
user: ${PUID}:${PGID}
group_add:
- "992" # my render group id
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp:exec,nosuid,nodev # exec some plugins can write to /tmp, no-nosuid,nodev for security
networks:
macvlan:
ipv4_address: OBSCURED
healthcheck:
test: [ "CMD", "curl", "-fsS", "http://127.0.0.1:8096/health" ]
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
environment:
- TZ=${TZ}
- JELLYFIN_PublishedServerUrl=OBSCURED
- JELLYFIN_DATA_DIR=/config/data # consolidates these dirs under /config, migrated from linuxserver.io setup
- JELLYFIN_CONFIG_DIR=/config
- JELLYFIN_LOG_DIR=/config/log
- JELLYFIN_CACHE_DIR=/config/cache
- HOME=/config
volumes:
- ./jellyfin:/config
- ${MEDIA}:/media:ro
devices:
- /dev/dri/renderD128:/dev/dri/renderD128 # isolate to just the renderD128 device
device_cgroup_rules:
- 'c 226:128 rw' # further limits access for the renderD128 device
networks: # I went with macvlan to preserve mdns for local discovery, otherwise you need to use host level networking
macvlan:
driver: macvlan
driver_opts:
parent: OBSCURED # Replace with host network interface name (find via: ip route | grep default)
ipam:
config:
- subnet: OBSCURED/24 # Your local LAN network CIDR
gateway: OBSCURED # Your local router IP address
Not sure why nobody here recommended netbird reverse proxies. It has crowdsec out of the box plus blocking/allowing ip ranges. On top of it, it also support pin or password based auth, so you can have 2 layers of auth.
But i haven't hosted jellyfin yet, only opencloud and a couple others. Haven't seen anybody pwning it based on the logs
at this point why not just use Pangolin ?
Netbird's reverse proxy is still in beta and is free, so when it goes GA the pricing may change. Otherwise this is a great option.
Hmm, thats a good point.
It's just something to keep in mind.
Tailscale is also a good option. Headscale will also be good for this once they finish the implementation.
Backup.
Update.
Don't keep all in one place.
Update.
Don't forget to backup.
At least the backup part I think I got. I do local backups in the mini PC, which get replicated to my NAS, which get backedup to backblaze (encrypted, because my photos and documents are also backed up there)
So the public services are purely for private use, to sync your mobile devices? You can install Wireguard on Android, send them over there. Though for e-reader, since they are Kobos (basically Android), you can trick it to install the app. Or even another launcher/book reader.
Kobo uses its own OS, not Android unfortunately. But I just found a tailscale plugin for it, so will try that
Install Koreader. Then install the bookorbit plugin
It’s very easy and reversible. And its really good
Yeah, not "Android" like Amazons' is not Android; all based on AOSP but not certified for Play Store. Or is it depending on the device in Kobo, do they use something else too? The ones i know (Leaf, Note) have the not-Android ROM.
Kobo runs a light linux software called NickelOS on an esp32 board. No android at all. No ability to instal apks. Its not even AOSP.
One can install a custom OS over top called KOreader which expands its usability and offers tons of community led plugins.
I hate our kobos. The app is shit. Total waste of money.
But this gives me hope. I'm going to play with this.
Just install koreader. It really saved my kobo purchase
I love my kobo precisely because there's a huge community behind KOreader. Lots of YouTube tutorials, lots of flexibility. My kobo kept dying at like 50% battery and I just assumed it was a bad battery. Turns out NickelOS was trying to cache a book infinitely in the background so the battery calibration was wildly off because it never properly achieved a sleep state when powered down.
I left it sitting for a year and a half. Charged it for a full day to balance the cells, copy pasted the files needed for KOreader, changed a config file so that NickelOS would not cache items in hidden folders, and then threw all my epubs onto a hidden folder called ". books" and boom.
New life in my kobo. I use it daily now. Battery is accurate to 20% (then it sorta doesnt turn back on but whatever). Fair warning though because KOreader is so expansive that its a rabbit hole. UI takes getting used to but the customizability is huge and it runs more efficiently without bloat and you can even use LocalSend to wirelessly push epubs from any device that can run LocalSend to the Kobo so you never have to plug it in again.
I sync book progress from my Xteink X4 pro to my Kobo Clara HD using KOSync and have my own little KOSync instance running on my homelab (but you can just use the public instances if you want).
Issue:
Most clients we instruct on homeoffice usage with vpns are already unable to remember the workflow:
VPN -> (wait until green for connected) -> open work app -> Do work -> close work app -> disconnect vpn.
Now you also may not want to tunnel all traffic (if you don't have a VPS with symmetric Gbit and unlimited traffic) so you'd need to set up split-tunneling and/or limit the apps allowed for the tunnel (works in android).
Honestly? It would be easier to set up a S2S split-tunnel VPN with wireguard on the relatives router.
You can just specify AllowedIPs in the wireguard client config to route only traffic to your services through the VPN, works great.
Yes. Split-tunneling...
But if you are really hardcore about restrictions and would need to update the profiles it will be a pita...
Scheduling stuff is annoying ;-;
AllowedIPs is a client side restriction that can be ignored anyway, no real security benefit from not just putting your entire network there.
Can you ellaborate?
The user can just edit the wg conf file and remove the restriction where it can and cannot connect to.
The file is not a baked immutable binary
Oh sorry I was thinking you were talking about something entirely different. Makes sense, and yes.
crowdsec is super easy to setup
Crowdsec is excellent. Also add per country block for inbound connections. If you expose the services to a few friends and family members limit inbound access to their country. Just remember to change the list when travelling abroad and coming back.
I use Pangolin on a kinda cheap VPS on Hetzner (they're now a bit too pricey), and route my services through Site Connectors (Newt, it's called). Dealing with opening my firewall is a pain I don't wanna think about, but Pangolin creates a websocket and can do NAT traversal from the Site Connector, so no swiss-cheesing your firewall.
It's nice because you can contain different services with VLANs to further segment and protect your network, and each Site Connector can work for many services (if there's no firewall rules restricting it/VLANs) or you can put a Site Connector on each server individually, if segmentation is important to you.
Is there a guide you can link?
Sure, https://pimylifeup.com/pangolin-linux/
But I have to say, the Pangolin Docs are quite good as well: https://docs.pangolin.net/self-host/quick-install
Thanks a lot! Thus actually looks doable and like it will fit my needs!
Awesome, good to hear. Just a reminder that I forgot when I sent that link: double-check the Tutorial, it might have slightly outdated information. But a few lessons I learned when setting it up:
Pangolin uses its own auth. You can use a OIDC provider if you like, but you have to set it up. I use TinyAuth in conjunction because I have so few users.
To bypass auth on Pangolin, you must disable it and it will appear "Unprotected". This helps with mobile apps, which don't know how to deal with third-party login screens, but it leaves the login screen of whatever server you're running (like Jellyfin) accessible by everyone. So something more hardened as your OIDC provider at the frontend help. Although lots of apps, again like Jellyfin, don't have native OIDC login.
The solution would be to route it with Private Resources, which are zero-trust connections. Great for a few people on your network, but it requires you setting up the Client app to access the Pangolin network. I've had issues with DNS on Android before, but your problems may vary.
If you have any more questions, let me know. I've been using Pangolin for only about a year, but I think I learned enough to help.
Get Jellyfin off the open internet. For family who'll never install a VPN app, the setup that holds up is WireGuard on their router, or Tailscale on whatever TV box they use, set up before it ever ships to them. They never see it. If something has to stay public, CrowdSec plus Pocket-ID is a lot lighter than Authentik for three users. I'm building a home box that ships locked down like this by default, so I'm curious: which broke first for your family, remote access or the logins?
Jellyfin on the open internet is FINE.
Agreed.
Secure it properly and you wont be pwned instantly.
My setup:
WAN -> OPNsense -> CrowdSec on FW and docker server -> Traefik -> Authelia middleware -> Jellyfin.
I also have a geoblock active on the Cloudflare domain and directly on my opnsense.
Most datacenter ASNs are also blocked. They don't need to connect to me.
Yes, first party apps are broken but the browser works good enough and if I meed it, I have a VPN for myself.
Relatives get web browser or I'll consider a S2S VPN setup.
How would you handle a mother in law at a retirement community with a Roku and no access to the router that serves the condo?
Get a router/travel router and set it up as a gateway where it provides its own SSID for the Roku to connect to. Basically a bridge to the complex, where you can inject some software. A lot of the travel devices have baked in Wireguard+Tailnet support. iNet are generally good products.
If you don't mind I'd share my scenario with you, but I'm far from a professional myself, so in the same time I'm also asking any thought about my own approach.
For my public facing services (e.g. Nextcloud) I've created a separate VLAN which is completely isolated from the rest of the system, I've deployed an nginx LXC with Crowdsec/fail2ban, and opened very specific "pinhole" style firewall rules towards the service layer VLAN in OPNsense. I've also separated this service / app VLAN layer from the database layer (which is another VLAN with strict firewall rules and SSL). For authentication I use what the service offers natively, except for some cases of keycloak / hardware key.
Based on my research, this should be a solid baseline, but honestly noone more knowledgeable than myself has confirmed it, so take it with a grain of salt.
I personally have been getting away from Nextcloud, because I feel it tries to do to much and does not do any of it great, except maybe file storage. It is also has a lot of php in its coding, so I have other services replacing it, and because I do not yet have the money to replace my iOS devices with stuff that can run GrapheneOS or Linux I use smb for file sharing. I do have a inexpensive VPS that hosts my blog and off site backup and that same host hosts my email (easyDNS), everything else is held locally.
If you are running crowdsec I hope that everything other than your honeypot (on its private vLAN) is using something other than port 22 for ssh?
There is some great advice in here but I wanted to throw my two cents in by saying bollocks to Hetzner, they get circlejerked far too much. Go with Contabo instead, 4 core 8GB VPS with 100GB SSD is $5 a month right now and has a generous 30TB/month bandwidth allowance.