Hi all,
I am running proxmox on a mini PC with a handful of services in my stack. I also run NPM in an LXC to reach my services through my domain name (service.domain.tld).
For my Arr related stuff, I use Usenet, and everything runs through a VPN.
I have three services which are public. Jellyfin, Seer and BookOrbit (for syncing Kobos).
Currently I have no security besides the built in login managers from the services, but I am considering setting up Authentik. I know I’m asking for trouble with my current set up.
I have elderly and extremely tech averse family members who live in two countries other than me, so tech support can be a challenge.
A lot of people suggest running a VPN, but it would be difficult for my family and I don’t know how to make it work syncing our Kobos with BookOrbit.
I’ve also seen some posts about tunneling to a VPS somewhere and users can connect to the VPS without a VPN.
I feel this question has been asked several times, and I tried searching here and on the internet in general, but my knowledge is not good enough to use the right terms and to get something that is idiot proof.
Any suggestions on best practices or links to guides you recommend would be much appreciated. Also, what EU based affordable VPS would you recommend?
Are your exposed services all on their own ports externally, or behind a reverse proxy?
Putting them behind a reverse proxy makes sure that attackers at least need to know the correct hostname to access your service.
This is security by obscurity which isn’t proper security but it means that all of the port scanners out there likely won’t know your jellyfin server exists when a vulnerability for jellyfin is released.
If you use let’s encrypt or something similar be aware that all issues certs show up in a public log so attackers like to harvest that log as a list of valid domain names. Switch those certs to wildcards so that you aren’t advertising those valid hostnames.
There are often options in reverse proxies, or sometimes your router to do geo based blocking. If you can limit connections to your local country only you eliminate huge portions of the botnets out there.
Combining this with auto updates/reboots on your services is probably enough to keep you safe, but if you want to really secure things a separate DMZ vlan for your services to prevent an attacker from compromising additional services on your LAN.
The more network segmentation you can do the better. An ideal setup is every app/container in its own network/ACL that only allows traffic to the specific network devices that it needs to talk to. This is a lot to manage if you do this with your router/vlans. Containers orchestrators (i.e. k8s) make this easier, but don’t protect you from kernel level exploits to break out of the containers. I believe proxmox has VM level ACLs now so you could skip the vlans and do your segmentation at that level instead.
I’m using NPM as a reverse proxy with let’s encrypt certs. I did not know about the public log.
I have to look into hiwvto best segment my network given my hardware, and I think about deploying NetBird.
Thanks a lot for the advice! Lot’s to read about.
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.
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.
@Klox This is exactly what I do in my RV. Easy, cheap, reliable.
Yeah that’s kinda my situation as well, but they have a firestick.
@Blue_Morpho @heyeddi
Something like tailscale could be the solutionThere’s no tailscale for Roku.
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.
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.
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).
Just install koreader. It really saved my kobo purchase
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 binaryOh sorry I was thinking you were talking about something entirely different. Makes sense, and yes.
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.
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 addressPangolin on a cheap VPS.
Ask yourself: is there any service that really, really needs to be public? Or is this only about availability for you or a very limited group (family, friends), which could be implemented via a VPN solution?
It’s just for family, but elderly family in two different very far away countries, across multiple devices.
WireGuard is stateless, so running it “on” 24/7 is cheap, set it up once for them and leave it on, ideally they wouldn’t notice a thing.
See that you get a solid VPN bridge, much better than trying to fix a ton of different services if things go awry.
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.
Because you quoted in dollars I almost dismissed them for not being European, but then I saw they are German, but have servers all over the world. I’ll check them out, thanks.
Acronyms, initialisms, abbreviations, contractions, and other phrases which expand to something larger, that I’ve seen in this thread:
Fewer Letters More Letters AP WiFi Access Point DNS Domain Name Service/System NAS Network-Attached Storage NAT Network Address Translation SSD Solid State Drive mass storage SSH Secure Shell for remote terminal access VPN Virtual Private Network VPS Virtual Private Server (opposed to shared hosting) nginx Popular HTTP server
9 acronyms in this thread; the most compressed thread commented on today has 8 acronyms.
[Thread #151 for this comm, first seen 30th Oct 2026, 19:00] [FAQ] [Full list] [Contact] [Source code]
Hetzner is great as a provider, highly recommend.
I use authentik with fail2ban, crowdsec and ufw. I use netbird to act as a VPN between different servers - most services need users to login through there but have a couple on the internet. I also restrict countries to ones my clients are on and update when im going on holiday.
I use caddy as my reverse proxy with rate limits and crowdsec. I moved from NPM just to try it and liked it.
SSH is on a different port and restricted to keys only. I also setup ntfy to notify my phone if there are logins (to check it’s just me).
I use unattended upgrades for security but try to upgrade frequently the servers and docker services.
Don’t put them on the internet. Seriously, don’t put stuff on the internet. These days critical CVEs are coming out weekly and it is unlikely that you even detect the compromise.
What is your use case? Maybe there is a better way
Family members on two different countries connect to my Jellyfin server from several devices (phones and android boxes), seer for requests, and BookOrbit for their ereaders.
You need a VPN. It will cause inconveniences but the way currently have it setup is highly vulnerable to attack. I would look into something like Netbird or just a plain Wireguard VPN. If they are connecting primarily from home you could always setup a simple proxy device that forwards connections over a VPN from the local network.
Security should absolutely come first. If you can’t provide basic security I wouldn’t recommend hosting anything especially for other people.
Dude chill, OP is trying to provide pirated media service for his retired relative, not host Area 51 archives or pacemaker as a service.
https://people.kernel.org/monsieuricon/creepy-crawlies
If you don’t secure your stuff it will be part of a bot net. Residential IPs and hardware are extremely valuable.
For enough. I recognize I am very uninformed in this area, and most of my resistance is due to the high effort of setting things up remotely.
I’ve seen a lot posted about netbird. What’s the advantage of that vs wireguard?
crowdsec is super easy to setup
Tried to get it running with NginxProxyManager. Didn’t work. I’m probably part of “team idiot”.
That does not bode well for me then :p
Idiots of the world - unite!
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.
This looks great. Would you say this would be anough security?
Hard to say. Set up countermeasures and intrusion detection (tripwires, fail2ban, and more) or you’ll probably never know.
The big thing is what you are guardian against. Scammers and port scanners you would be good but if your a corporation or someone a government goes after they can do so much more and use an unreleased vulnerability on you.
I run crowdsec thru Zoraxy and also set an allow list for countries that can connect, a very short list since it’s just 5 people. Also fail2ban and I run the paid security thru unify to try it out.
Is this better than CSF (Configserver)? The scope seems to be the same here unless I’m missing something.









