1
0
Fork 0
mirror of https://github.com/alangrainger/immich-public-proxy.git synced 2024-12-28 03:41:58 +00:00
Share your Immich photos and albums in a safe way without exposing your Immich instance to the public.
Find a file
niklastasler@gmail.com 9c85edbf76 chore: merge upstream
2024-10-31 08:13:13 +01:00
.github Update .github/workflows/ci.yaml 2024-10-31 08:10:10 +01:00
docs Update docs 2024-10-31 07:53:56 +01:00
public Update docs 2024-10-30 20:47:54 +01:00
src Removed API key requirement thanks to #3 2024-10-31 07:09:11 +01:00
views Update docs 2024-10-30 11:12:51 +01:00
.dockerignore feat(ci): add docker build&publish pipeline 2024-10-30 16:27:48 +00:00
.env.example Removed API key requirement thanks to #3 2024-10-30 20:21:12 +01:00
.eslintrc Convert to Typescript 2024-10-28 09:56:11 +01:00
.gitignore chore: merge upstream 2024-10-31 08:13:13 +01:00
docker-compose.yml refactor: docker-compose file to use registry image 2024-10-30 19:20:47 +01:00
Dockerfile feat(ci): add docker build&publish pipeline 2024-10-30 16:27:48 +00:00
LICENSE Add license 2024-10-28 10:26:27 +01:00
package.json Fix for non-200 responses 2024-10-30 20:31:41 +01:00
README.md Update docs 2024-10-31 07:53:56 +01:00
tsconfig.json Convert to Typescript 2024-10-28 09:56:11 +01:00

Immich Public Proxy

Share your Immich photos and albums in a safe way without exposing your Immich instance to the public.

Immich is a wonderful bit of software, but since it holds all your private photos it's best to keep it fully locked down. This presents a problem when you want to share a photo or a gallery with someone.

Immich Public Proxy provides a barrier of security between the public and Immich, and only allows through requests which you have publicly shared. When it receives a valid request, it talks to Immich locally via API and returns only those shared images.

It exposes no ports, allows no incoming data, and has no API to exploit.

Live demo

Why not simply put Immich behind a reverse proxy and only expose the /share/ path to the public?

To view a shared album in Immich, you need access to the /api/ path. If you're sharing a gallery with the public, you need to make that path public. Any existing or future vulnerabilities could compromise your Immich instance.

The ideal setup is to have Immich secured privately behind VPN or mTLS, and only allow public access to Immich Public Proxy.

Here is an example setup for securing Immich behind mTLS.

How to install with Docker

  1. Clone the repo:
git clone https://github.com/alangrainger/immich-public-proxy.git
  1. Create a .env file to configure the app.
IMMICH_URL=http://localhost:2283
PORT=3000
CACHE_AGE=2592000
  • IMMICH_URL is the URL to access Immich in your local network. This is not your public URL.
  • CACHE_AGE this is setting the cache-control header, to tell the browser to cache the assets. Set to 0 to disable caching.
  1. Start the docker container:
docker-compose up -d
  1. Set the "External domain" in your Immich Server Settings to be the same as the public URL for your Immich Public Proxy:

Now whenever you share an image or gallery through Immich, it will automatically create the correct public path for you.

How it works

You share your photos/videos as normal through Immich. Because you have set the External domain in Immich settings to be the URL for your proxy app, the links that Immich generates will automaticaly have the correct URL.

When the proxy receives a request, it will come as a link like this:

https://your-proxy-url.com/share/ffSw63qnIYMtpmg0RNvOui0Dpio7BbxsObjvH8YZaobIjIAzl5n7zTX5d6EDHdOYEvo

The part after /share/ is Immich's shared link public ID (called the key in the docs).

Immich Public Proxy takes that key and makes an API call to your Immich instance over your local network, to ask what photos or videos are shared in that share URL.

If it is a valid share URL, the proxy fetches just those assets via local API and returns them to the visitor as an individual image or gallery.

If the shared link has expired or any of the assets have been put in the Immich trash, it will not return those.

Configuration

The gallery is created using lightGallery. You can change various settings to change how your gallery displays by updating the lightGallery section in /views/gallery.ejs:

lightGallery(document.getElementById('lightgallery'), {
  plugins: [lgZoom, lgThumbnail, lgVideo, lgFullscreen],
  speed: 500
})

For example to disable the download button for images, you would add download: false:

lightGallery(document.getElementById('lightgallery'), {
  plugins: [lgZoom, lgThumbnail, lgVideo, lgFullscreen],
  download: false,
  speed: 500
})

You can find all of lightGallery's settings here:

https://www.lightgalleryjs.com/docs/settings/

Feature requests

You can add feature requests here, however my goal with this project is to keep it as lean as possible.

Due to the sensitivity of data contained within Immich, I want anyone with a bit of coding knowledge to be able to read this codebase and fully understand everything it is doing.

D