Just exposed Immich via a remote and reverse proxy using Caddy and tailscale tunnel. I’m securing Immich using OAuth.

I don’t have very nerdy friends so not many people appreciate this.

  • couch1potato@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    I just got this set up last week too. Same setup with caddy on a free oracle vps, tailscale on vps and home pfsense router, tailscale on pfsense advertising routes (private IPs of my docker hosted services).

    CGNAT sucks 🤮

  • guy@piefed.social
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Good job!
    I’m still trying to understand what it is and why I would want it. I see several programs I use recommend it but I just don’t get what it does and why what it does is good.

    • catloaf@lemm.ee
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      It does a couple things. It’s one service that routes requests to multiple services. So if you have radarr, sonarr, etc., you can put a reverse proxy in front and use the same ip-port to connect to all, and the proxy routes the request to the service by hostname.

      If you have multiple instances of the same service for HA, it can load balance between them (though this is unlikely for a homelab).

      Personally I run all my services through docker and put traefik in front, so that I don’t have to keep track of ports. It’s all by name.

      It’s also nice because traefik handles HTTPS termination, so it automatically gets certs for each name, and the backing service never needs to worry about it (it’s http on the backend, but all that traffic is internal).

      • guy@piefed.social
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 month ago

        Thank you for the explanation. But that’s it than? Just convenience with ports?

        • boonhet@lemm.ee
          link
          fedilink
          English
          arrow-up
          0
          ·
          1 month ago

          Well it IS pretty nice to be able to tell people to go to jellyfin.example.com instead of example.com:8096, but you also get security benefits for using a properly set up reverse proxy. You don’t need to keep your ports open to the whole internet, only the reverse proxy accesses them. As far as the rest of the internet is concerned, you have :443 open.

  • N0x0n@lemmy.ml
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    I know that feeling ! My first service hosted via docker + Treafik outside my lan with a wireguard tunnel felt like a big dopamine hit ! Congrats !

    Now I have over 20 services and It feels trivial :( I still love the easy to read/write syntax of Treafik ,however I feel like I’m missing a lot of important networking knowledge while avoiding Nginx !

    Maybe one day when I’m too bored I will switch everything to Nginx, see how it goes !

  • PunkiBas@lemmy.world
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Congratulations!

    It feels really good when you learn something new and get it working the way you like.

    If you want more challenges take a look at this:

    Immich-public-proxy

    This would be useful if you ever wanted to share albums with other people outside your tailscale network and that lack an account for your immich server.

  • ramenshaman@lemmy.world
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Can someone ELI5? I’m a noob who aspires to set up immich in the near future. I only recently started making efforts to separate myself from the cloud. So far I’ve got a wireguard server set up and I’ve disconnected both my Bambu printers from the cloud and I’m currently setting up some home assistant stuff. Pretty soon I’m hoping to set up a NAS, Immich, Plex (or similar) and replace my google nest cameras.

    • randombullet@programming.devOP
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      Pretty much I have caddy on a VPS that’s pointing to my internal IP using a tailscale tunnel. You are still exposing the web gui to the Internet so I just changed authentication to OAuth to mitigate since risk. There is still a possibility of attacks via zero days, but my immich is on a VM and I’m creating firewall rules to just allow certain ports out.

      • ramenshaman@lemmy.world
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 month ago

        I appreciate the extra details but I still don’t know what “caddy”, “VPS”, “tailscale tunnel”, or “zero days” are, but I can look it up.

        • randombullet@programming.devOP
          link
          fedilink
          English
          arrow-up
          0
          ·
          1 month ago

          It’s hard to explain from scratch.

          Caddy is a reverse proxy software that essentially redirects traffic from a certain port to another port. For example external:port => internal:port. It also enables SSL encryption meaning everything will be encrypted en route between the external and the user.

          VPS is a virtual private server. Just someone else’s computer you can expose to the Internet.

          Tailscale is a mesh VPN that uses wire guard as its transport. I use this to tunnel between my VPS and my Immich server to hide my home IP and to allow encrypted traffic between my Immich server and my VPS.

          A zero-day (also known as a 0-day) is a vulnerability in software or hardware that is typically unknown to the vendor and for which no patch or other fix is available. The vendor thus has zero days to prepare a patch, as the vulnerability has already been described or exploited.

          There’s no fix other than security through layers.

    • Nibodhika@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      I’ll try to ELI5, if there’s something you don’t understand ask me.

      Op has a home server where he’s running immich, that’s only accessible when he’s at home via the IP, so something like http://192.168.0.3:3000/, so he installed Tailscale on that server. Tailscale is a VPN (Virtual Private Network) that allows you to connect to your stuff remotely, it’s a nice way to do it because it is P2P (peer-to-peer) which means that in theory only he can access that network, whereas if he were using one of the many VPNs people use for other reasons, other people on the same VPN could access his server.

      Ok, so now he can access his immich instance away from home, all he has to do is connect to the VPN on his phone or laptop and he’ll be able to access it with something like http://my_server:3000 since Tailscale adds a DNS (Domain Name System) which resolves the hostnames to whatever IP they have on the Tailscale network.

      But if you want to give your family access it’s hard to explain to them that they need to connect to this VPN, so he rented a VPS (Virtual Private Server) on some company like DigitalOcean or Vultr and connected that machine to the Tailscale network. He probably also got a domain name from somewhere like namecheap, and pointed that domain name to his VPS. Só now he can access his VPS by using ssh user@myserver.com. Now all he needs to do is have something on the VPS which redirects everything that comes to a certain address into the Tailscale machine, Caddy is a nice way to do this, but the more traditional approach is ngnix, so if he puts Caddy on that VPS a config like this:

      immich.myserver.com {
          handle {
              reverse_proxy my_server.tailscale.network.name:3000
          }
      }
      

      Then any requests that come to https://immich.myserver.com/ will get redirected to the home server via Tailscale.

      It is a really nice setup, plus OP also added authentication and some other stuff to make it a bit more secure against attacks directly on immich.

  • 4am@lemm.ee
    link
    fedilink
    English
    arrow-up
    0
    ·
    edit-2
    1 month ago

    Quick, now lean a firewall with a good IDS

    and fail2ban

  • perishthethought@lemm.ee
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Wow, so my understanding of the terms ‘reverse proxy’ and Tailscale must be wrong then, because I thought they were mutually exclusive. I’ll go do some more research, unless someone feels like explaining how you can do both at the same time.

    Also, I think the ‘Risks’ section of this page is informative:

    https://en.m.wikipedia.org/wiki/Reverse_proxy

    • Lambda@lemmy.ca
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      I think self hosting the proxy with the services at hobbyist scale mitigates most of the security risks. The single point of failure risk is another matter. I once had to effectively reverse-hack my services by uploading a Jenkins test job through an existing java project to regain access. Ever since then, I maintain a separate ddns address that’s just used for emergency ssh access.

  • kat@orbi.camp
    link
    fedilink
    English
    arrow-up
    0
    ·
    edit-2
    1 month ago

    Just be sure to read up on network security and set yourself up for success! Even tunnels can still be an attack surface. Always keep everything up to date! And plan for the worst case.

    • ikidd@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      This is necessary for CGNat ISPs. That or cloudflared or ngrok or the like. Because you aren’t really routable on a CGNAT address.

      • kratoz29@lemm.ee
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 month ago

        In a nutshell, CGNAT users must spend money for something that people with IPv4 addresses can do for free 😔

        • Overshoot2648@lemm.ee
          link
          fedilink
          English
          arrow-up
          0
          ·
          1 month ago

          We wouldn’t be in this mess if we switched to ipv6, but nOoOooOo… we can’t possibly do that…

  • ch00f@lemmy.world
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    I just finally got it this weekend when I got Matrix-synapse and Pixelfed working on the same box.

    All I can say is good for you! It wasn’t easy. And it’s so powerful.

  • happydoors@lemm.ee
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Congrats! I just pulled off the same thing last week using cloudflare tunneling? The phrase “reverse proxy” scared me too much lol. So props to you.

  • Noggog@programming.dev
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 month ago

    Just out of curiosity, is the tail scale part of this required? If i just reverse proxy things and have them only protected from there by the login screen of the app being shown, that’s obviously less safe. But the attackers would still need to brute force my passwords to get any access? If they did, then they could do nasty things within the app, but limited to that app. Are there other vulnerabilities I’m not thinking about?

    • ikidd@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      The attack surface might be an entire API, not just your login screen. You have no idea what that first page implements that could be used to gain access.

      You can improve this by putting a basic auth challenge at least in front of the applications webpage. That would drastically reduce the potential endpoints.

      • Noggog@programming.dev
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 month ago

        Thanks for the insight! Does running this in a docker container help limit the damage at all? Seems like they’d only be able to access the few folders I have the container access to?

        • ikidd@lemmy.world
          link
          fedilink
          English
          arrow-up
          0
          ·
          edit-2
          1 month ago

          Maybe a bit, but if you’re not running rootless docker if they get out of that container they’ll have the run of your docker host. It is a lot of layers to crack, but sometimes they’ve got nothing but time, or it’s been so long since the containers been updated that its trivial. That’s why rootless docker or podman, and Watchtower are your friends.

          Also, vlan off your exposed surface and build firewall rules for the VPN and LAN inbound to it, and specific outbound rules if you need those servers to reach into those networks themselves.

    • Nibodhika@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      1 month ago

      It’s not required, but probably OP has a home server with Immich and a VPS which exposes it to the internet. In that setup you need Tailscale for the VPS to access your home server. Sometimes you can’t directly expose your home server for different reasons, e.g. ISP doesn’t give you an external IP directly (I’ve had this, where my router would get a 10.x IP so I couldn’t port forward because the internet IP was being shared between multiple houses), or the ISP gives you a dynamic IP so there’s no guarantee that your IP won’t change next time you reset the router, etc.

      Also it provides an extra layer of separation, so for example a DDOS would hit the VPS which probably has automatic countermeasures, and even if someone were to gain access to the VPS they still need an extra jump to get to the home server (obviously if they exploit something on immich they would get direct access to the home server).

      • Noggog@programming.dev
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 month ago

        Gotcha. Thanks for the insight!

        It’s annoying, as I’d like to expose things for other people in my family (like Overseerr or whatever) without hassling them to also start a VPN or other stumbling block steps.

        I was hoping that reverse proxy to overseerrs login screen would be safe enough. 8(

        Does docker help limit things at all? I’m running my services through docker, which seems to limit the folders the container can hit. Feels like that would limit the damage someone could do even if they bypassed the login page of Overseerr or whatever app it is?

        • Nibodhika@lemmy.world
          link
          fedilink
          English
          arrow-up
          0
          ·
          1 month ago

          First of all let me make this absolutely clear, docker is not expected to be secure to that level. While they try to make it hard for someone to escape a container, it’s not their main concern so expect that there are vulnerabilities that would allow an attacker to escape.

          Now the second thing, the Overseer login screen might be secure enough for your case, the problem is that login is hard to do right, and Overseer are doing several other stuff as well, so they might not give it enough emphasis, and even if they do, maybe Immich devs don’t, or any one of the dozens of other services, so there are dozen of possible points of failure. Things like Authelia or Google OAuth are focused on authentication, so they do that absolutely right, and then they become the only point of failure for authentication.

          To be fair, if you keep things updated it’s unlikely not having auth would be a problem. Mostly because most hackers won’t even know of your server to begin with. And most systems are secure enough for most casual hacks. But it’s an investment worth the time if you plan on making something available to the internet.