
Immich cu Docker Compose: alternativa la Google Photos pe VPS
Telefonul tau contine probabil cele mai valoroase date pe care le ai: ani intregi de poze de familie, bonuri fotografiate in graba, filmulete cu copiii pe care nu le mai poti filma a doua oara. Cei mai multi dintre noi le dam pe toate unui mare furnizor de cloud, platim un abonament lunar cand se termina spatiul gratuit si speram ca termenii si conditiile nu se schimba. Immich propune altceva: o aplicatie care arata si se comporta ca Google Photos, face backup automat din telefon, recunoaste fete si te lasa sa cauti “caine pe plaja”, doar ca ruleaza pe un server pe care il controlezi tu. In ghidul asta il instalam pas cu pas cu Docker Compose pe un VPS proaspat, il punem in spatele HTTPS, conectam aplicatia de pe telefon si planificam spatiul pe disc si backup-urile, ca amintirile tale sa fie cu adevarat in siguranta.
Immich este open source (AGPL-3.0), dezvoltat public pe github.com/immich-app/immich , cu documentatia pe immich.app . Dupa o perioada lunga de beta, proiectul a ajuns la linia stabila 2.x la finalul lui 2025, ceea ce il face o alegere mult mai linistita pentru arhiva foto a unei familii sau a unei firme mici.
Ce este Immich si de ce sa-ti gazduiesti singur pozele
Immich este o platforma de gestionare a pozelor si a clipurilor video, formata din trei parti: o interfata web pe care o deschizi in browser, aplicatii mobile pentru Android si iOS care urca galeria foto in fundal, si un server care stocheaza fisierele, genereaza miniaturi, converteste clipurile in formate pe care le poate reda orice dispozitiv si ruleaza modele de machine learning pentru cautare si recunoastere faciala.
De ce ai rula asa ceva singur, in loc sa platesti stocare in cloud? Cateva motive sincere:
- Confidentialitate. Pozele raman pe un server pe care il inchiriezi, intr-un data center pe care il stii, in Romania. Nimeni nu antreneaza modele pe ele si nu le scaneaza pentru reclame.
- Cost previzibil. Un VPS cu cateva sute de GB costa la fel fie ca ai 10.000, fie 60.000 de poze, iar toata familia il poate folosi cu conturi separate.
- Fara lock-in. Immich pastreaza fisierele originale neatinse pe disc, in foldere obisnuite. Daca renunti vreodata la el, pozele tale sunt tot simple fisiere.
Compromisul este responsabilitatea: de acum tu esti cel care se ocupa de actualizari si de backup. Exact de aceea jumatate din articol vorbeste despre planificare si protejarea datelor, nu doar despre pornit containere.
Cativa termeni inainte sa incepem
Un container este un pachet izolat care contine o aplicatie si tot ce ii trebuie ca sa ruleze, asa ca se comporta la fel pe orice server Linux. Docker este motorul care ruleaza containerele, iar Docker Compose este unealta care porneste mai multe containere inrudite dintr-un singur fisier YAML. Immich nu e un singur program, ci patru servicii care lucreaza impreuna, deci Compose este modul natural de a-l rula.
Un port este o “usa” numerotata a serverului, la care un program asteapta conexiuni. Immich asculta pe portul 2283. Un reverse proxy este un server web pus in fata aplicatiei: primeste traficul HTTPS pe porturile standard 80 si 443, se ocupa de certificatul TLS si trimite cererile mai departe catre Immich, intern. Un volum este spatiu de stocare aflat in afara containerului, ca datele sa supravietuiasca atunci cand containerele sunt recreate sau actualizate.
De ce ai nevoie
- Un VPS KVM cu Debian 13 sau Ubuntu 24.04, minimum 2 vCPU si 4 GB RAM (6 pana la 8 GB daca vrei ca partea de machine learning sa mearga confortabil), plus suficient disc pentru biblioteca ta (vezi sectiunea de planificare de mai jos).
- Un utilizator cu drepturi sudo si acces SSH.
- Un domeniu sau subdomeniu (de exemplu
poze.exemplu.ro) cu o inregistrare A catre IP-ul VPS-ului. - Aplicatia mobila Immich din Google Play, App Store sau F-Droid.
- Ideal, o a doua locatie pentru backup: alt VPS, un storage box sau un NAS acasa.
O nota despre containere in containere: Docker poate rula pe un VPS LXC neprivilegiat doar daca e activat nesting pentru container, si chiar si atunci unele lucruri se comporta diferit (reguli de firewall, swap, contabilizarea memoriei). Pentru o biblioteca foto pe care vrei s-o pastrezi ani de zile, iti recomandam un VPS KVM, unde tot ce e in ghidul asta functioneaza exact cum e scris.
Cum se leaga piesele Immich pe un VPS
Inainte sa tastam comenzi, ajuta sa vedem componentele. Telefonul si browserul vorbesc HTTPS cu serverul. Firewall-ul lasa sa treaca doar SSH si traficul web. Caddy, reverse proxy-ul nostru, se ocupa de TLS si trimite cererile catre containerul serverului Immich, care asculta doar pe 127.0.0.1, adica nu poate fi accesat direct din internet. In spatele lui stau trei containere ajutatoare, iar toate datele importante ajung in doua foldere pe discul VPS-ului.
Cele patru containere sunt:
- immich-server: API-ul, interfata web si workerii din fundal care genereaza miniaturi si transcodeaza clipurile.
- immich-machine-learning: un serviciu Python care ruleaza modelele pentru cautarea inteligenta, detectia si recunoasterea fetelor.
- database: o imagine PostgreSQL construita de echipa Immich, cu extensii pentru cautare vectoriala, folosita pentru metadate si pentru “amprentele” care fac posibila cautarea.
- redis: in versiunile actuale este de fapt Valkey, un store open source compatibil Redis, folosit drept coada de joburi.
Planificarea RAM-ului si a discului inainte de instalare
Immich nu e o aplicatie mica. Recomandarea oficiala este 6 GB RAM (mai bine 8 GB) si 4 nuclee de CPU, cu 4 GB si 2 nuclee ca minim realist. Cea mai mare parte a memoriei e folosita de machine learning cat timp iti indexeaza biblioteca, deci primele zile dupa un import mare sunt cele mai solicitante. Dupa aceea, serverul sta mai mult in repaus pana apar poze noi.
La spatiul pe disc, originalele sunt doar o parte din poveste. Immich mai stocheaza miniaturi, copii transcodate ale clipurilor si baza de date. Regulile de mai jos sunt aproximative, dar suficient de bune pentru planificare:
| Element | Dimensiune aproximativa |
|---|---|
| O poza de pe telefon (HEIC sau JPEG) | 2 pana la 6 MB |
| Un minut de video 1080p de pe telefon | 100 pana la 130 MB |
| Un minut de video 4K de pe telefon | 170 pana la 400 MB |
| Miniaturi si previzualizari | 5 pana la 10% din biblioteca de poze |
| Clipuri transcodate | 10 pana la 30% din biblioteca video |
| Baza de date | cativa GB pentru o biblioteca mare |
Un exemplu concret: o familie de patru persoane, cu 40.000 de poze si aproximativ 1.000 de clipuri scurte, are nevoie de circa 160 GB pentru poze, 100 GB pentru clipuri si inca 30 GB pentru miniaturi, transcodari si baza de date, deci aproximativ 290 GB azi. Adauga 30 pana la 50% rezerva pentru urmatorii doi ani si ajungi la 400 GB sau mai mult. O regula importanta din documentatia Immich: baza de date trebuie sa stea pe un SSD local, niciodata pe un share de retea. Biblioteca de poze poate sta pe un disc mai mare si mai lent, daca ai unul atasat.
Instalarea Immich cu Docker Compose, pas cu pas
Iata procedura completa. Fiecare pas de mai jos corespunde unei casete din diagrama, ca sa stii mereu unde te afli.
Pasul 1: Pregatirea VPS-ului
Pornim de la un sistem complet actualizat. Conecteaza-te prin SSH cu utilizatorul tau sudo si ruleaza:
sudo apt update && sudo apt full-upgrade -y
Comanda reimprospateaza lista de pachete si instaleaza toate actualizarile in asteptare. Daca s-a instalat un kernel nou, reporneste serverul. Pe Ubuntu, sistemul te anunta creand un fisier marcaj, pe care il poti verifica asa:
[ -f /var/run/reboot-required ] && echo "Reboot needed" || echo "No reboot flag"
Pe Debian acest fisier nu este creat in mod normal, asa ca daca ai vazut un pachet linux-image in output-ul de upgrade, ruleaza pur si simplu sudo reboot si conecteaza-te din nou.
Urmeaza firewall-ul. Ubuntu vine cu ufw instalat, Debian 13 nu, deci instaleaza-l intai daca e nevoie. Permite intotdeauna SSH inainte sa activezi firewall-ul, altfel iti tai singur accesul:
sudo apt install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
Output-ul ar trebui sa arate porturile 22, 80 si 443 cu ALLOW. Daca serverul SSH asculta pe alt port, foloseste acel port in loc de 22. Observa ca nu deschidem portul 2283. Asa cum vom vedea, Docker poate ocoli ufw pentru porturile publicate, deci vom proteja Immich intr-un mod mai bun la pasul 4. Intr-un container LXC neprivilegiat, ufw poate sa nu reuseasca sa-si incarce regulile; in cazul asta bazeaza-te pe firewall-ul din panoul furnizorului.
Pasul 2: Instalarea Docker
Pachetele Docker din arhivele Debian si Ubuntu sunt adesea mai vechi, asa ca folosim repository-ul oficial Docker. Comenzile de mai jos functioneaza pe ambele distributii, pentru ca citesc numele distributiei (debian sau ubuntu) si numele de cod (trixie sau noble) din /etc/os-release:
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/${ID}/gpg" -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Primele linii descarca cheia de semnare Docker, ca apt sa poata verifica autenticitatea pachetelor. Apoi adaugam repository-ul si instalam motorul plus pluginul Compose v2. Daca ai instalat anterior docker.io din distributie, sterge-l intai cu sudo apt remove docker.io docker-compose, ca sa eviti conflictele. Verifica daca totul merge:
sudo docker run --rm hello-world
sudo docker compose version
Ar trebui sa vezi mesajul “Hello from Docker!” si o versiune Compose care incepe cu v2 sau mai noua. In tot ghidul folosim explicit sudo docker. Ai putea adauga utilizatorul in grupul docker, dar tine minte ca apartenenta la acest grup inseamna practic acces de root.
Pasul 3: Descarcarea fisierelor Compose pentru Immich
Echipa Immich publica, la fiecare versiune, un docker-compose.yml gata facut si un fisier exemplu de variabile de mediu. Folosind fisierele lor, in loc sa le scriem noi, setup-ul nostru se potriveste cu ce testeaza dezvoltatorii. Le tinem in /opt/immich:
sudo mkdir -p /opt/immich
cd /opt/immich
sudo curl -fsSL -o docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo curl -fsSL -o .env https://github.com/immich-app/immich/releases/latest/download/example.env
ls -la
ls -la ar trebui sa arate doua fisiere, docker-compose.yml si .env (punctul il face ascuns, de aceea folosim -a). Daca deschizi fisierul Compose, vei vedea aproximativ structura de mai jos. Este un extras scurtat, ca sa intelegi ce contine, nu ceva de copiat:
name: immich
services:
immich-server:
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- '2283:2283'
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- model-cache:/cache
redis:
# imagine Valkey, fixata prin digest
database:
# imagine PostgreSQL Immich cu extensii vectoriale, fixata prin digest
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
volumes:
model-cache:
Valorile din ${...} vin din fisierul .env, pe care il editam acum. Imaginile pentru baza de date si Valkey sunt fixate la versiuni exacte de echipa Immich, iar cele doua imagini Immich urmeaza variabila IMMICH_VERSION.
Pasul 4: Configurarea .env, a cailor de stocare si a portului
Mai intai creeaza folderele pentru poze si pentru baza de date si genereaza o parola puternica pentru baza de date. Parola trebuie sa contina doar litere si cifre, pentru ca unele caractere speciale strica sirul de conectare:
sudo mkdir -p /srv/immich/library /srv/immich/postgres
openssl rand -hex 24
Copiaza sirul aleator afisat de openssl. Acum editeaza fisierul de mediu:
sudo nano /opt/immich/.env
Fa-l sa arate asa (pastreaza celelalte linii care exista deja):
UPLOAD_LOCATION=/srv/immich/library
DB_DATA_LOCATION=/srv/immich/postgres
TZ=Europe/Bucharest
IMMICH_VERSION=v2
DB_PASSWORD=lipeste-aici-valoarea-generata
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
Ce inseamna fiecare linie:
UPLOAD_LOCATIONeste locul unde vor ajunge toate pozele, clipurile, miniaturile si dump-urile automate ale bazei de date. Daca atasezi un disc mare separat, indica-l aici.DB_DATA_LOCATIONcontine fisierele PostgreSQL. Tine-l pe SSD-ul local.TZseteaza fusul orar, ca datele si joburile programate sa aiba sens.IMMICH_VERSION=v2fixeaza tag-ul imaginii pe linia 2.x. Tag-ul implicitreleaseurmeaza mereu ultima versiune, care intr-o zi poate fi o versiune majora noua cu schimbari incompatibile. Cuv2primesti corecturi si functii noi, fara upgrade-uri majore surpriza. Pentru control maxim, poti fixa o versiune exacta de formav2.x.ydin pagina de release-uri si o poti creste constient.DB_PASSWORDeste parola tocmai generata. Se seteaza doar la prima creare a bazei de date, deci alege-o acum.
Salveaza cu Ctrl+O, Enter, iesi cu Ctrl+X si restrictioneaza permisiunile fisierului, ca alti utilizatori sa nu poata citi parola:
sudo chmod 600 /opt/immich/.env
Acum portul. Implicit, fisierul Compose publica portul 2283 pe toate interfetele de retea. Docker isi scrie propriile reguli de firewall, care se aplica inaintea celor din ufw, deci un port publicat e accesibil din internet chiar daca ufw spune altceva. Solutia curata este sa il publicam doar pe localhost, unde il poate accesa doar Caddy:
cd /opt/immich
sudo sed -i "s/- '2283:2283'/- '127.0.0.1:2283:2283'/" docker-compose.yml
grep -n "2283" docker-compose.yml
Output-ul grep trebuie sa arate - '127.0.0.1:2283:2283'. Daca apare tot linia veche (de exemplu pentru ca s-au schimbat ghilimelele intr-o versiune noua), deschide fisierul cu sudo nano docker-compose.yml si modifica linia de mana.
Pasul 5: Pornirea stack-ului
E momentul sa pornim totul:
cd /opt/immich
sudo docker compose up -d
Prima rulare descarca cativa GB de imagini, asa ca lasa-i cateva minute. Optiunea -d ruleaza containerele in fundal. Apoi verifica starea lor:
sudo docker compose ps
Redus la coloanele relevante, un rezultat sanatos arata asa:
NAME STATUS
immich_machine_learning Up 2 minutes (healthy)
immich_postgres Up 2 minutes (healthy)
immich_redis Up 2 minutes (healthy)
immich_server Up 2 minutes (healthy)
Imediat dupa pornire, statusul poate arata (health: starting) timp de un minut. Confirma ca serverul raspunde local:
curl -s http://127.0.0.1:2283/api/server/ping
Raspunsul asteptat este {"res":"pong"}. Daca ceva nu merge, citeste logurile cu sudo docker compose logs -f immich-server (apasa Ctrl+C ca sa nu le mai urmaresti). Datorita setarii restart: always din fisierul Compose, containerele pornesc automat si dupa un reboot.
Pasul 6: HTTPS cu Caddy
Asigura-te ca inregistrarea DNS (de exemplu poze.exemplu.ro) indica deja spre VPS, pentru ca Caddy are nevoie de ea ca sa obtina un certificat gratuit Let’s Encrypt. Caddy exista ca pachet atat in Debian 13, cat si in Ubuntu 24.04 (in Ubuntu vine din componenta universe, activata implicit pe imaginile cloud):
sudo apt install -y caddy
sudo nano /etc/caddy/Caddyfile
Inlocuieste continutul fisierului cu aceste trei linii, folosind domeniul tau:
poze.exemplu.ro {
reverse_proxy 127.0.0.1:2283
}
Asta e toata configuratia: Caddy asculta pe 80 si 443, obtine si reinnoieste singur certificatul, redirectioneaza HTTP catre HTTPS si trimite totul catre Immich. Implicit nu are limita pentru dimensiunea upload-urilor, ceea ce conteaza, pentru ca un clip de pe telefon poate avea cativa GB. Valideaza si reincarca:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo journalctl -u caddy --no-pager -n 30
In loguri ar trebui sa apara o linie care spune ca certificatul a fost obtinut cu succes. Daca preferi Nginx, merge si el, dar trebuie sa setezi client_max_body_size 50000M;, sa activezi header-ele pentru WebSocket si sa cresti timeout-urile proxy-ului, altfel upload-urile mari esueaza.
Pasul 7: Contul de admin si conectarea telefonului
Fa asta imediat dupa pasul 6. Primul cont inregistrat pe o instanta Immich noua devine administrator, deci nu vrei sa lasi o instanta proaspata, publica, nerevendicata. Daca vrei risc zero, o poti revendica inainte de pasul 6 printr-un tunel SSH: ruleaza ssh -L 2283:127.0.0.1:2283 utilizator@ip-vps de pe calculatorul tau si deschide http://localhost:2283 in browser.
Deschide https://poze.exemplu.ro, apasa “Getting Started” si creeaza utilizatorul admin cu o parola lunga si unica. Ghidul de configurare initiala pune cateva intrebari (tema, sablonul de stocare, setari de confidentialitate); le poti schimba pe toate mai tarziu.
Pentru restul familiei, mergi la Administration > Users si creeaza cate un cont pentru fiecare persoana. Tot aici poti seta o cota de stocare pe utilizator, o metoda buna sa nu lasi un pasionat de video 4K sa umple discul. Fiecare persoana isi vede doar propriile poze, cu exceptia albumelor partajate sau a partajarii cu partenerul.
Pe telefon:
- Instaleaza aplicatia Immich si introdu adresa serverului
https://poze.exemplu.ro. - Autentifica-te cu contul tau.
- Deschide ecranul de backup (iconita de nor din partea de sus) si alege albumele de salvat, de obicei “Camera” sau “Recents”.
- Activeaza backup-ul automat si decide daca ruleaza doar pe Wi-Fi si doar in timp ce telefonul se incarca.
Pentru primul upload, care poate insemna zeci de GB, lasa telefonul pe Wi-Fi si la incarcat peste noapte, cu aplicatia deschisa. Pe Android, exclude Immich de la optimizarea bateriei, altfel sistemul poate opri upload-urile din fundal. Pe iOS, activitatea in fundal e limitata de sistemul de operare, deci activeaza Background App Refresh pentru Immich si deschide aplicatia din cand in cand, ca sa recupereze.
Pasul 8: Backup pentru biblioteca foto si baza de date
Immich pe un singur VPS este o copie a pozelor tale, nu inca un backup. Urmeaza ideea clasica 3-2-1: trei copii ale datelor, pe doua medii diferite, una dintre ele in alta locatie. Telefonul (pana stergi pozele de pe el), VPS-ul si un repository off-site iti dau exact asta.
Immich te ajuta deja cu partea de baza de date. Creeaza dump-uri automate ale bazei de date in fiecare noapte (implicit la 02:00, pastrand ultimele 14) in UPLOAD_LOCATION/backups. Le poti verifica sau ajusta in Administration > Settings > Backup Settings. Asta inseamna ca un singur folder, /srv/immich/library, contine atat fisierele originale, cat si o copie consistenta a bazei de date. Nu te baza niciodata pe copierea folderului brut /srv/immich/postgres cat timp baza de date ruleaza: copia poate fi corupta.
Folosim restic, care cripteaza, deduplica si versioneaza backup-urile, si le stocheaza pe alt server prin SFTP. Mai intai il instalam, cream un fisier cu parola si o cheie SSH pentru root, apoi copiem cheia pe serverul de backup:
sudo apt install -y restic
sudo sh -c 'openssl rand -base64 32 > /root/.restic-pass && chmod 600 /root/.restic-pass'
sudo mkdir -p -m 700 /root/.ssh
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""
sudo ssh-copy-id -i /root/.ssh/id_ed25519.pub backup@backup.exemplu.ro
sudo restic -r sftp:backup@backup.exemplu.ro:/srv/restic/immich --password-file /root/.restic-pass init
Pastreaza o copie a fisierului /root/.restic-pass in managerul tau de parole. Fara el, backup-ul nu mai poate fi decriptat, nici de tine, nici de altcineva. Acum creeaza scriptul de backup:
sudo nano /usr/local/sbin/immich-backup.sh
#!/bin/sh
set -eu
export RESTIC_REPOSITORY="sftp:backup@backup.exemplu.ro:/srv/restic/immich"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
restic backup /srv/immich/library /opt/immich/docker-compose.yml /opt/immich/.env \
--exclude /srv/immich/library/thumbs \
--exclude /srv/immich/library/encoded-video
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Excludem miniaturile si clipurile transcodate pentru ca Immich le poate regenera, ceea ce economiseste mult spatiu de backup. Fa scriptul executabil si programeaza-l la 03:30, dupa dump-ul de noapte al bazei de date:
sudo chmod 700 /usr/local/sbin/immich-backup.sh
echo '30 3 * * * root /usr/local/sbin/immich-backup.sh >> /var/log/immich-backup.log 2>&1' | sudo tee /etc/cron.d/immich-backup
sudo /usr/local/sbin/immich-backup.sh
Ubuntu are cron instalat implicit; pe imaginile minimale de Debian 13 s-ar putea sa lipseasca, asa ca ruleaza sudo apt install -y cron daca folderul /etc/cron.d nu exista. Ultima comanda ruleaza primul backup de mana, ceea ce poate dura mult pentru o biblioteca mare. Dupa aceea, listeaza snapshot-urile cu sudo restic -r sftp:backup@backup.exemplu.ro:/srv/restic/immich --password-file /root/.restic-pass snapshots si, macar o data, exerseaza o restaurare intr-un folder de test cu restic restore latest --target /tmp/restore-test. Un backup netestat este doar o speranta.
Caile de stocare si sablonul de stocare
In UPLOAD_LOCATION vei gasi mai multe foldere: upload (fisierele proaspat urcate), library (fisierele organizate dupa sablonul de stocare, daca e activat), thumbs, encoded-video, profile si backups. Nu muta si nu redenumi fisiere de mana acolo; Immich tine evidenta fiecarei cai in baza de date.
Implicit, fisierele sunt stocate dupa ID-uri interne, ceea ce e eficient, dar greu de citit. Daca activezi sablonul de stocare in Administration > Settings > Storage Template, Immich aranjeaza originalele in foldere usor de inteles, de exemplu pe ani si date. Asa, biblioteca se navigheaza usor cu orice manager de fisiere si se recupereaza usor chiar si fara Immich. Dupa activare, ruleaza jobul “Storage Template Migration” ca sa mute fisierele existente.
Ai deja ani de poze in foldere? Foloseste o biblioteca externa in loc sa le urci din nou. Adauga un mount doar in citire la serviciul immich-server din docker-compose.yml, in lista lui volumes::
- /srv/poze-vechi:/mnt/poze-vechi:ro
Ruleaza sudo docker compose up -d ca sa aplici schimbarea, apoi in Administration > External Libraries creeaza o biblioteca cu calea de import /mnt/poze-vechi. Immich indexeaza fisierele acolo unde sunt si nu le modifica niciodata, datorita optiunii :ro.
Machine learning: cautare inteligenta, fete si cand sa-l opresti
Containerul de machine learning sta in spatele functiilor care fac Immich sa para o aplicatie foto moderna:
- Cautare inteligenta: scrii “masina rosie noaptea” sau “tort aniversar” si Immich gaseste pozele potrivite, cu ajutorul modelelor CLIP care leaga imaginile de text.
- Recunoastere faciala: fetele sunt detectate si grupate pe persoane, pe care le poti numi.
- Detectarea duplicatelor: pozele foarte asemanatoare sunt semnalate, ca sa faci curatenie.
Setarile sunt in Administration > Settings > Machine Learning Settings. Modelul implicit pentru cautare functioneaza cel mai bine cu cautari in engleza. Daca vrei sa cauti in romana, alege unul dintre modelele multilingve oferite in lista, apoi ruleaza din nou jobul “Smart Search” pentru toate fisierele, din Administration > Jobs. Modelele mai mari dau rezultate mai bune, dar cer mai mult RAM si timp de procesor.
Pe un VPS fara GPU, totul ruleaza pe procesor, ceea ce e in regula dupa ce indexarea initiala s-a terminat. Ca serverul sa ramana responsiv in timpul unui import mare, scade concurenta pentru “Smart Search”, “Face Detection” si “Thumbnail Generation” in setarile joburilor. Containerul ML descarca si modelele din memorie dupa cateva minute de inactivitate (controlat de MACHINE_LEARNING_MODEL_TTL, implicit 300 de secunde), deci consumul scade din nou cand nu lucreaza.
Pe un VPS de 4 GB ai doua variante. Adaugi swap, ca varfurile sa nu omoare containerele:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Sau opresti complet machine learning: comentezi tot blocul immich-machine-learning din docker-compose.yml cu #, rulezi sudo docker compose up -d --remove-orphans si dezactivezi machine learning din setarile de admin, ca joburile sa nu tot esueze. Backup-ul, timeline-ul, albumele si partajarea merg in continuare. Retine ca, de obicei, swap-ul nu poate fi configurat din interiorul unui container LXC.
Cum tii Immich la zi
Immich evolueaza repede, asa ca citeste notele de release de pe GitHub inainte de fiecare actualizare, mai ales sectiunea “breaking changes”. Cu IMMICH_VERSION=v2, o actualizare inseamna:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune -f
pull descarca imaginile noi pentru tag-ul fixat, up -d recreeaza doar containerele care s-au schimbat, iar prune sterge imaginile vechi ca sa elibereze spatiu. Cand apare o versiune majora noua, notele de release iti vor spune daca trebuie sa descarci si un docker-compose.yml nou. Asigura-te ca ai un snapshot restic proaspat inainte de orice upgrade major.
Depanare si greseli frecvente
- Containerul postgres tot reporneste. De obicei parola contine caractere speciale sau
DB_DATA_LOCATIONindica spre un share de retea. Foloseste doar litere si cifre si un disc local. Tine minte ca schimbareaDB_PASSWORDdupa prima pornire nu schimba parola dintr-o baza de date deja creata. - 502 Bad Gateway de la Caddy. Immich nu a pornit inca sau a cazut. Verifica
sudo docker compose pssi logurile serverului. La prima pornire, asteapta pana toate containerele sunt healthy. - Clipurile mari nu se incarca. Daca folosesti Nginx sau alt proxy in fata, creste limita pentru dimensiunea cererii si timeout-urile. La Caddy nu trebuie schimbat nimic.
- Containerele mor cu exit code 137. Inseamna ca le-a oprit kernelul din lipsa de memorie. Adauga swap, scade concurenta joburilor sau dezactiveaza machine learning.
- Telefonul nu mai urca poze in fundal. Exclude aplicatia de la optimizarea bateriei pe Android, activeaza Background App Refresh pe iOS si deschide aplicatia periodic.
- Portul 2283 este accesibil din exterior. Ai sarit peste legarea pe
127.0.0.1de la pasul 4. Testeaza de pe alt calculator cucurl http://ip-vps:2283si corecteaza fisierul Compose. - Discul s-a umplut. Verifica cu
df -hsisudo du -sh /srv/immich/library/*. Clipurile transcodate si miniaturile cresc in timp; planifica marirea discului inainte sa treci de 85% ocupare. - Cautarea nu gaseste nimic. Probabil jobul de cautare inteligenta inca ruleaza. Urmareste progresul in Administration > Jobs.
Note de securitate
- Tine portul 2283 privat. Docker ocoleste ufw pentru porturile publicate, deci legarea pe localhost este protectia ta reala. Doar Caddy trebuie sa fie public.
- Revendica imediat contul de admin, asa cum am descris la pasul 7, si foloseste parole lungi si unice pentru fiecare utilizator.
- Ai grija la linkurile de partajare. Linkurile publice catre albume sunt comode, dar seteaza o data de expirare si o parola, si sterge linkurile de care nu mai ai nevoie.
- Ia in calcul autentificarea centralizata. Immich suporta OAuth, deci il poti conecta la un furnizor de identitate pe care il folosesti deja si poti impune autentificare in doi pasi acolo.
- Actualizeaza regulat atat sistemul de operare (
apt), cat si Immich, dupa ce citesti notele de release. - Cripteaza backup-urile si protejeaza cheia. restic cripteaza tot, dar fisierul cu parola este cheia catre intreaga ta istorie foto: pastreaza-l si in afara VPS-ului.
- Foloseste chei SSH pentru VPS si dezactiveaza autentificarea cu parola dupa ce cheile functioneaza.
Deci, merita sa-ti rulezi singur Immich?
Daca te-ai saturat sa platesti tot mai mult in fiecare an pentru stocarea pozelor in cloud, sau pur si simplu vrei amintirile familiei pe un server pe care il controlezi, Immich este azi cea mai completa alternativa self-hosted la Google Photos. Cu Docker Compose, instalarea propriu-zisa dureaza mai putin de o jumatate de ora; munca reala este sa alegi un server cu suficient RAM si disc si sa configurezi backup-ul din prima zi. Fa asta si primesti backup automat din telefon, cautare inteligenta, recunoastere faciala si albume partajate, fara ca altcineva sa se uite la pozele tale.
Poti incepe pe un VPS de la noi, in data center-ul nostru din Romania, si poti mari discul pe masura ce creste biblioteca. Daca nu vrei sa te ocupi de Docker, certificate si scripturi de backup, echipa noastra de administrare servere poate instala, securiza, monitoriza si salva Immich pentru tine.
Intrebari frecvente
Pot rula Immich pe un VPS cu 2 GB RAM?
Nu confortabil. Doar containerele au nevoie de peste 1 GB fara machine learning, iar importurile provoaca varfuri. Considera 4 GB cu swap si machine learning dezactivat drept minim, si 6 pana la 8 GB drept marimea confortabila.
Pozele raman la calitatea originala?
Da. Immich stocheaza fisierele originale exact asa cum au fost urcate. Miniaturile si clipurile transcodate sunt copii suplimentare pentru navigare rapida; originalele nu sunt niciodata comprimate.
Pot tine biblioteca pe object storage, de tip S3?
Immich se asteapta la un sistem de fisiere obisnuit. Baza de date trebuie sa ramana pe un SSD local; biblioteca de poze poate sta pe un disc separat, mai mare, atasat la VPS. Poti face backup pe object storage cu restic, dar nu il monta ca biblioteca activa.
Ce se intampla cu pozele daca Immich nu mai functioneaza?
Raman fisiere obisnuite in UPLOAD_LOCATION. Cu sablonul de stocare activat, sunt chiar sortate in foldere usor de citit, pe ani si date, deci le poti copia oriunde.
Merge Docker intr-un VPS LXC pentru Immich?
Poate merge, daca e activat nesting pentru container, dar regulile de firewall, swap-ul si limitele de memorie se comporta diferit. Pentru o arhiva foto pe termen lung, un VPS KVM este alegerea mai simpla si mai previzibila.