156 lines
6.4 KiB
Markdown
156 lines
6.4 KiB
Markdown
---
|
|
title: Immich Public Proxy
|
|
created: 2026-06-06
|
|
updated: 2026-06-06
|
|
type: app
|
|
tags: [catalogue, reverse-proxy, immich, partage-public, photos, go]
|
|
confidence: high
|
|
contested: false
|
|
sources: [https://selfh.st/apps/?tag=Reverse+Proxy, https://github.com/alangrainger/immich-public-proxy]
|
|
---
|
|
|
|
# 🖼️ Immich Public Proxy
|
|
|
|
> **Reverse proxy spécialisé pour partager publiquement des photos Immich sans exposer l'instance complète**. Réputation : le moyen le plus sûr d'utiliser Immich comme portfolio photo public.
|
|
|
|
## 📋 Informations Générales
|
|
|
|
| Champ | Valeur |
|
|
| :--- | :--- |
|
|
| **Site web** | [github.com/alangrainger/immich-public-proxy](https://github.com/alangrainger/immich-public-proxy) |
|
|
| **GitHub** | [alangrainger/immich-public-proxy](https://github.com/alangrainger/immich-public-proxy) |
|
|
| **License** | MIT |
|
|
| **Langage** | Go |
|
|
| **Étoiles GitHub** | 1.9k ⭐ |
|
|
| **Dernière MAJ** | 2026-04 |
|
|
| **Catégorie** | [[cat-reverse-proxy\|Reverse Proxy]], Photo, Immich |
|
|
|
|
## 📝 Description
|
|
|
|
**Immich Public Proxy** est un reverse proxy léger en **Go** qui se place devant une instance **[[app-immich]]** et n'autorise le passage que des requêtes correspondant à des **albums que vous avez explicitement marqués comme publics**. Toutes les autres requêtes sont rejetées en 404/403.
|
|
|
|
Le problème résolu est subtil mais important : Immich dispose d'un système de partage natif (liens publics pour les albums), mais pour rendre ces liens accessibles depuis Internet il faut exposer Immich derrière un reverse proxy. Or, exposer Immich tel quel, même avec une bonne configuration, **révèle des endpoints d'API** (login, utilisateurs, bibliothèque complète) que des attaquants peuvent sonder. **Immich Public Proxy agit comme une whitelist** : seules les URLs des albums partagés passent, tout le reste est bloqué.
|
|
|
|
Fonctionnalités notables :
|
|
- **Whitelist par album ID** ou par user
|
|
- **Authentification optionnelle** par shared link Immich
|
|
- **Proxy du flux RSS** pour les galeries
|
|
- **Cache** des thumbnails pour réduire la charge sur Immich
|
|
- **Statistiques d'accès** (consultations par album)
|
|
- **Image d'exemple** : aucun endpoint `/api/*` n'est proxifié
|
|
|
|
**Public cible** : utilisateurs Immich qui veulent **partager publiquement** un portfolio photo (photographes, familles, communautés) sans risquer de compromettre l'instance privée.
|
|
|
|
## 🚀 Installation
|
|
|
|
### Option 1 : Docker Compose (standard)
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
immich-public-proxy:
|
|
image: alangrainger/immich-public-proxy:latest
|
|
container_name: immich-public-proxy
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8080:8080"
|
|
environment:
|
|
- IMMICH_URL=http://immich-server:2283
|
|
- ALLOWED_ALBUMS=album-uuid-1,album-uuid-2
|
|
- PUBLIC_URL=https://photos.example.com
|
|
- SHOW_DONATE_LINK=false
|
|
networks:
|
|
- proxy
|
|
|
|
networks:
|
|
proxy:
|
|
external: true
|
|
```
|
|
|
|
> ⚠️ `ALLOWED_ALBUMS` peut être vide pour autoriser tous les albums marqués publics côté Immich, ou restrictif pour une whitelist manuelle.
|
|
|
|
### Option 2 : Variante Traefik
|
|
|
|
```yaml
|
|
# Labels Traefik sur le proxy
|
|
services:
|
|
immich-public-proxy:
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.immich-public.rule=Host(`photos.example.com`)"
|
|
- "traefik.http.routers.immich-public.entrypoints=websecure"
|
|
- "traefik.http.routers.immich-public.tls.certresolver=cloudflare"
|
|
- "traefik.http.services.immich-public.loadbalancer.server.port=8080"
|
|
```
|
|
|
|
> ⚠️ **Important** : dans une architecture à 2 niveaux, **Traefik expose** `photos.example.com` publiquement, et **Immich Public Proxy** filtre en aval. **Ne pas exposer Immich directement**.
|
|
|
|
## ⚙️ Configuration Initiale
|
|
|
|
1. **Créer un album** dans Immich et le marquer **Public** (partage de lien)
|
|
2. **Récupérer l'UUID** de l'album (URL de partage)
|
|
3. **Configurer** `IMMICH_URL` vers l'instance Immich (interne, pas publique)
|
|
4. **Optionnel** : restreindre avec `ALLOWED_ALBUMS=uuid1,uuid2`
|
|
5. **Lancer** : `docker compose up -d`
|
|
6. **Tester** : `http://localhost:8080` doit afficher la liste des albums publics
|
|
|
|
```bash
|
|
# Vérifier que les endpoints sensibles sont bloqués
|
|
curl -I http://localhost:8080/api/server/ping
|
|
# → attendu : 404 ou 403, pas 200
|
|
|
|
# Vérifier qu'un album public est accessible
|
|
curl -I http://localhost:8080/albums/UUID-ICI
|
|
# → attendu : 200
|
|
```
|
|
|
|
## 🔀 Alternatives
|
|
|
|
### Open Source
|
|
- **Partage natif Immich** : fonctionnel, mais nécessite d'exposer Immich directement (risqué)
|
|
- **[[app-caddy]]** avec restriction d'URL : possible, mais à configurer à la main
|
|
- **Cloudflare Access devant Immich** : Zero Trust, mais plus complexe
|
|
- **Lychee / Piwigo** : alternatives à Immich orientées partage public
|
|
|
|
### Comparaison Immich Public Proxy vs partage natif
|
|
|
|
| Critère | Immich Public Proxy | Partage natif Immich exposé |
|
|
| :--- | :--- | :--- |
|
|
| Endpoints `/api/*` exposés | ❌ Bloqués | ✅ Tous exposés |
|
|
| Whitelist par album | ✅ | ❌ (auth sur chaque lien) |
|
|
| Authentification | ❌ (URL = secret) | ✅ Token dans URL |
|
|
| Cache thumbnails | ✅ | ❌ |
|
|
| Statistiques | ✅ | ❌ |
|
|
| Simplicité de setup | ⚠️ Conteneur de plus | ✅ |
|
|
| Sécurité | ✅ | ⚠️ Surface large |
|
|
|
|
### Propriétaires (ce que ça remplace)
|
|
- **Adobe Portfolio** + Lightroom Cloud
|
|
- **Google Photos public albums** (limités)
|
|
- **SmugMug / Pixieset** pour photographes pros
|
|
|
|
## 🔒 Sécurité
|
|
|
|
- ✅ **Aucune route API** d'Immich n'est proxifiée (vérifié dans le code)
|
|
- ✅ **URLs d'albums = secret** : la sécurité repose sur l'aléatoire de l'UUID
|
|
- ✅ **Pas de stockage** : proxy stateless, reboot = safe
|
|
- ✅ **Image minimaliste** (Go, ~10 MB)
|
|
- ⚠️ **Pas de rate limiting natif** : prévoir un WAF ou un rate-limiter en amont
|
|
- ⚠️ **URLs shareables immuables** : changer l'UUID = régénérer les liens
|
|
- ⚠️ **Si Immich est compromis** derrière : le proxy ne peut rien faire (mais limite la surface)
|
|
|
|
## 📚 Ressources
|
|
|
|
- [README GitHub](https://github.com/alangrainger/immich-public-proxy)
|
|
- [Documentation Immich - Partage public](https://immich.app/docs/features/sharing/)
|
|
- [Wiki selfh.st](https://selfh.st/apps/?tag=Reverse+Proxy)
|
|
|
|
## 🔗 Pages Liées
|
|
|
|
- [[cat-reverse-proxy]] — Catégorie Reverse Proxy
|
|
- [[app-immich]] — Application sous-jacente
|
|
- [[app-traefik]] — Reverse proxy en amont
|
|
- [[app-caddy]] — Alternative
|
|
- [[comparatif-reverse-proxy]] — Comparaison détaillée
|
|
- [[securisation-home-lab]] — Sécurité
|