Telefon care incarca poze pe un server Immich self-hosted care ruleaza pe un VPS
Self-hosting

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.

Cum ruleaza Immich pe VPS-ul tauTelefon + browsercereri HTTPSFirewall (ufw)22, 80, 443 deschiseProxy Caddycertificat TLSPortul 2283doar localhostStack Docker Compose in /opt/immichimmich-server127.0.0.1:2283machine-learningcautare, fetePostgreSQLmetadate, vectoriValkeycoada de joburiPe discul VPS-uluimodel-cachevolum DockerDB_DATA_LOCATIONdoar SSD localUPLOAD_LOCATIONpoze si clipuriBackup off-siterestic, criptat
Doar Caddy este expus in internet. Immich asculta pe localhost, iar folderul bibliotecii este cel pe care il salvam off-site.

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.

Consum aproximativ de RAM pe componenta Immichimmich-server0,8 GBmachine-learning1,5 GBPostgreSQL0,5 GBValkey0,05 GBTotal cu ML2,85 GBTotal fara ML1,35 GB00,51,01,52,02,53,0RAM in GB (aproximativ, in timpul indexarii)Componenta
Valori aproximative pentru o biblioteca mica de familie, in timpul indexarii. Cifrele tale vor varia in functie de marimea bibliotecii si de modele.

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:

ElementDimensiune aproximativa
O poza de pe telefon (HEIC sau JPEG)2 pana la 6 MB
Un minut de video 1080p de pe telefon100 pana la 130 MB
Un minut de video 4K de pe telefon170 pana la 400 MB
Miniaturi si previzualizari5 pana la 10% din biblioteca de poze
Clipuri transcodate10 pana la 30% din biblioteca video
Baza de datecativa 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.

Instalarea Immich in 8 pasi1Pregatire VPSupdate, firewall2Instalare Dockerrepository oficial3Fisiere Composecompose + .env4Configurare .envcai, parola5Pornire stackdocker compose up6HTTPSproxy Caddy7Admin + telefonbackup automat8Backup daterestic off-sitePasii 1 pana la 5: instalare si pornire. Pasii 6 pana la 8: publicare, conectare, protectie.
Pasii 1 pana la 8 corespund titlurilor numerotate de mai jos. Nu sari peste pasul 8: o biblioteca foto fara backup este un punct unic de esec.

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_LOCATION este 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_LOCATION contine fisierele PostgreSQL. Tine-l pe SSD-ul local.
  • TZ seteaza fusul orar, ca datele si joburile programate sa aiba sens.
  • IMMICH_VERSION=v2 fixeaza tag-ul imaginii pe linia 2.x. Tag-ul implicit release urmeaza mereu ultima versiune, care intr-o zi poate fi o versiune majora noua cu schimbari incompatibile. Cu v2 primesti corecturi si functii noi, fara upgrade-uri majore surpriza. Pentru control maxim, poti fixa o versiune exacta de forma v2.x.y din pagina de release-uri si o poti creste constient.
  • DB_PASSWORD este 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:

  1. Instaleaza aplicatia Immich si introdu adresa serverului https://poze.exemplu.ro.
  2. Autentifica-te cu contul tau.
  3. Deschide ecranul de backup (iconita de nor din partea de sus) si alege albumele de salvat, de obicei “Camera” sau “Recents”.
  4. 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_LOCATION indica spre un share de retea. Foloseste doar litere si cifre si un disc local. Tine minte ca schimbarea DB_PASSWORD dupa 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 ps si 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.1 de la pasul 4. Testeaza de pe alt calculator cu curl http://ip-vps:2283 si corecteaza fisierul Compose.
  • Discul s-a umplut. Verifica cu df -h si sudo 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.

Avem Incredere & Suntem Membri

Suntem membri ai principalelor organizatii de infrastructura internet.

RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX