[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"seo-verification":3,"blog-host-photoprism-on-your-own-vps-ma-en":6,"promo-bar-likely":187},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-host-photoprism-on-your-own-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":129,"ctaBody":130,"ctaButton":131,"ctaUrl":132,"relatedPosts":133},83,"host-photoprism-on-your-own-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-photoprism","استضافة-photoprism-على-خادمك-الافتراضي-الخاص-vps","alojar-photoprism-en-un-vps","Host PhotoPrism on Your Own VPS","Deploy PhotoPrism on your VPS: a self-hosted photo manager with AI tagging, search and SSL via Docker. Complete guide.",8,0,false,"2026-03-29T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-photoprism-poster.svg",{"categorySlug":34,"appSlug":35},"collaboration-productivity","photoprism","PhotoPrism is a self-hosted photo manager that automatically sorts your pictures by location, content and color thanks to embedded machine learning. On your own VPS, it turns a disorganized collection into a searchable library, without any external cloud service. This guide covers full installation, nginx reverse proxy configuration, ML performance tuning on a modest VPS, troubleshooting common errors, and a solid backup strategy.",[38,42,52,55,74,77,80,83,86,126],{"type":39,"title":40,"body":41},"h2","Why self-host PhotoPrism on a VPS","Where Immich aims for the full cloud experience with real-time mobile backup, PhotoPrism focuses on indexing and organizing an existing photo library, often large, sitting on a file system. It analyzes your folders, sorts photos by labels (mountain, beach, car), detects faces, reads EXIF and geocodes pictures. All of this runs locally via embedded TensorFlow. Hosting it on a VPS has a twofold benefit: centralizing photo archives scattered on a disk accessible from anywhere, and getting automatic tagging without ever transmitting the images to a third-party service. PhotoPrism works with MariaDB for good performance and directly reads an `originals` folder that you fill via WebDAV, rsync or a mount.",{"type":43,"title":44,"items":45},"ul","The strengths of a self-hosted PhotoPrism",[46,47,48,49,50,51],"Automatic tagging by local AI: search by keywords, locations and colors without a cloud.","Indexing of existing archives placed on disk, via WebDAV, rsync or network mount.","Detection of duplicates and similar photos to clean up a cluttered collection.","Interactive maps based on the GPS coordinates extracted from EXIF metadata.","Read-only mode available: PhotoPrism indexes without ever modifying your original files.","Installable PWA interface, accessible from any browser on your network.",{"type":39,"title":53,"body":54},"Exact requirements: RAM, CPU, storage and networking","PhotoPrism is memory-hungry as soon as TensorFlow is involved. Here are the thresholds to respect to avoid unpleasant surprises. Without a GPU and with the ML engine active, plan for **2 GB of RAM minimum**: below that, the indexing process triggers an OOM (out of memory) and the container restarts in a loop. With ML fully active (face detection, scene classification), **4 GB of RAM are recommended** — the comfortable level for a library of 10,000 to 50,000 photos. A **minimum 1 vCPU** is enough for browsing, but the initial indexing of a large archive benefits from 2 to 4 cores: PhotoPrism distributes work via `PHOTOPRISM_WORKERS`. The default port is **2342**; remember to open it temporarily for a first test before placing the reverse proxy. On the storage side, provision your `originals` (the actual size of your library) **plus 30 to 40%** for multi-resolution thumbnails, cache and the MariaDB index. A library of 100 GB of originals typically generates between 20 and 35 GB of derived data. Add a **2 GB minimum swap partition** if your VPS has less than 4 GB of RAM: it absorbs indexing spikes without crashes, at the cost of slight slowness.",{"type":56,"title":57,"steps":58},"steps","Deploy PhotoPrism step by step",[59,62,65,68,71],{"title":60,"body":61},"Prepare the VPS and volumes","Install Docker, then create two persistent folders: `\u002Fopt\u002Fphotoprism\u002Foriginals` for your photos and `\u002Fopt\u002Fphotoprism\u002Fstorage` for the cache and the index database. Separating these volumes simplifies backups.",{"title":63,"body":64},"Declare PhotoPrism and MariaDB","In `docker-compose.yml`, add a `mariadb` service with a dedicated volume and a `photoprism` service (image `photoprism\u002Fphotoprism:latest`). Link them via `PHOTOPRISM_DATABASE_DRIVER=mysql` and point `PHOTOPRISM_ORIGINALS_PATH` to your photo folder.",{"title":66,"body":67},"Set the administrator and the indexing mode","Set `PHOTOPRISM_ADMIN_PASSWORD` and enable `PHOTOPRISM_READONLY=true` if you want it to index without touching the originals. Then launch the stack with `docker compose up -d`.",{"title":69,"body":70},"Import and run the first indexing","Copy your photos into the `originals` folder via `rsync` or WebDAV, then trigger the analysis from the interface or on the command line with `docker compose exec photoprism photoprism index`. This is where the AI generates labels and thumbnails.",{"title":72,"body":73},"Configure nginx as a reverse proxy with SSL Certbot","Install nginx and certbot on the host. Create a server block in `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fphotoprism.conf` that listens on port 80, redirects to 443, and proxies to `http:\u002F\u002F127.0.0.1:2342`. Add the directives `proxy_set_header Host $host`, `proxy_set_header X-Real-IP $remote_addr` and `proxy_set_header X-Forwarded-Proto $scheme` so PhotoPrism correctly detects the HTTPS scheme. Obtain the certificate with `certbot --nginx -d gallery.yourdomain.com`. Automatic renewal is handled by the certbot systemd timer — check with `systemctl status certbot.timer`.",{"type":39,"title":75,"body":76},"Mobile access: iOS and Android app","PhotoPrism does not offer a native automatic backup app like Immich, but its PWA (Progressive Web App) interface is mobile-optimized: add it to your home screen from Safari (iOS) or Chrome (Android) for a near-native experience. For browsing and searching, this is sufficient. If you want access outside the local network, enable HTTPS (see the reverse proxy step): the PWA only installs in a secure context. For backup from the phone, the usual complementary solution is **Syncthing** or **rclone**: configure them to send the DCIM folder to `\u002Fopt\u002Fphotoprism\u002Foriginals` on the VPS, then schedule automatic re-indexing via a cron running `docker compose exec -T photoprism photoprism index --cleanup`.",{"type":39,"title":78,"body":79},"ML optimization on a VPS without GPU: key variables","On a standard VPS (no dedicated GPU), TensorFlow runs in CPU mode. Three environment variables let you adjust the quality\u002Fresource balance. `PHOTOPRISM_WORKERS` controls the number of parallel indexing threads — set it to the number of available vCPUs (2 or 4) to speed up initial indexing without saturating the CPU. On a single-vCPU VPS, force it to `1` to avoid contention. `PHOTOPRISM_DISABLE_TENSORFLOW` (value `true`) completely disables the ML engine: no more automatic classification or face detection, but indexing is 3 to significantly faster for indexing and RAM consumption drops below 1 GB. Useful for an initial migration of a very large archive — re-enable ML afterwards to re-run the analysis. `PHOTOPRISM_DETECT_NSFW` (value `true`) enables the inappropriate content filter, at the cost of an extra model pass on each image: only enable it if you genuinely need it, as it significantly slows indexing. For VPSes between 2 and 4 GB of RAM, the recommended configuration is `PHOTOPRISM_WORKERS=2`, `PHOTOPRISM_DETECT_NSFW=false` and TensorFlow active — you get ML without OOM risk.",{"type":39,"title":81,"body":82},"Troubleshooting: the most common errors","**OOM (Out of Memory) at startup or during indexing.** This is the first error on VPSes with 1 GB of RAM. The Docker log signature: `Killed` or `signal: killed` on the photoprism process. Immediate fix: add swap (`fallocate -l 2G \u002Fswapfile && chmod 600 \u002Fswapfile && mkswap \u002Fswapfile && swapon \u002Fswapfile`) and add the line to `\u002Fetc\u002Ffstab` for persistence. Lasting fix: move to a VPS with at least 2 GB. **Endless indexing that never finishes.** On a library of 50,000 photos on a 2-vCPU VPS, the first complete indexing (with ML) can take 6 to 24 hours. This is normal. Follow progress in the logs with `docker compose logs -f photoprism`. If the process seems stuck for more than an hour, check CPU usage: `docker stats photoprism`. If it is at 0%, restart the service. **Permission problems on volumes.** PhotoPrism runs as UID 1000 by default. If `\u002Fopt\u002Fphotoprism\u002Foriginals` is owned by root, access silently fails. Fix with `chown -R 1000:1000 \u002Fopt\u002Fphotoprism`. Also verify that the `storage` volume is writable: this is where PhotoPrism writes thumbnails and the local index. **Interface loads but photos do not appear.** Check that indexing was actually triggered (`photoprism index`) and not just the service started. The initial import is not automatic.",{"type":39,"title":84,"body":85},"Backup strategy: originals, storage and database","An effective PhotoPrism backup distinguishes three components with different needs. **The `originals` folder** contains your master files (JPEG, RAW, videos): this is the irreplaceable part. Back it up first with an off-site copy — `rclone sync \u002Fopt\u002Fphotoprism\u002Foriginals remote:backup\u002Foriginals` to object storage (Backblaze B2, S3) works well and supports incremental resumption. Recommended frequency: daily. **The `storage` folder** contains generated thumbnails, cache and sidecar data. It can be **fully rebuilt** by re-indexing (`photoprism index --force`): back it up only if you want to avoid re-running a long indexing after an incident. A weekly snapshot is sufficient. **The MariaDB database** stores the metadata index, albums, manual labels and identified faces — all the curation work you have done manually. Back it up separately with a regular dump: `docker compose exec mariadb mysqldump -u photoprism -p photoprism > \u002Fopt\u002Fbackup\u002Fphotoprism-db-$(date +%Y%m%d).sql`. Schedule this dump in cron and encrypt it before off-site transfer. If you use SQLite instead of MariaDB, simply copy the `.db` file after stopping PhotoPrism to guarantee consistency.",{"type":87,"title":88,"headers":89,"rows":93},"comparison","PhotoPrism or Immich: which to choose",[90,91,92],"Criterion","PhotoPrism","Immich",[94,98,102,106,110,114,118,122],[95,96,97],"Main objective","Index and organize an existing photo library","Full photo cloud with mobile backup",[99,100,101],"Mobile app","PWA, no native automatic backup","iOS\u002FAndroid apps with automatic backup",[103,104,105],"Database","MariaDB or SQLite","PostgreSQL with vector extension",[107,108,109],"AI search","TensorFlow labels by content and color","Semantic search and advanced facial recognition",[111,112,113],"Recommended RAM","4 GB (2 GB minimum without GPU)","6 to 8 GB",[115,116,117],"File model","Reads an originals folder, read-only mode available","Manages its own upload tree",[119,120,121],"Multi-user","Limited, geared toward a single collection","Isolated libraries per user",[123,124,125],"Ideal use case","Archive and search large photo folders","Replace Google Photos day to day",{"type":127,"body":128},"tip","Mount your `originals` folder read-only (`:ro` in the Docker volume) and enable `PHOTOPRISM_READONLY=true`. PhotoPrism will index and generate labels and thumbnails in the separate `storage` volume, without ever risking modifying or deleting an original file. This way you can safely point to a precious archive, and even synchronize that folder via rsync from another server.","Organize your photo archives with full autonomy","The ServOrbit Cloud VPS provides the RAM, storage and Docker required by PhotoPrism, its TensorFlow engine and MariaDB. Index thousands of pictures and find them again in a few keywords, without a third-party cloud.","Deploy PhotoPrism on a Cloud VPS","\u002Fapplications\u002Fcollaboration-productivity\u002Fphotoprism",[134,153,170],{"id":135,"slug":136,"slugs":137,"title":141,"excerpt":142,"readTime":143,"views":144,"isPinned":19,"noindex":19,"publishedAt":145,"updatedAt":146,"category":147,"categories":148,"featuredImage":30,"bgImage":31,"posterImage":150,"relatedSolution":151},71,"hosting-nextcloud-on-your-own-vps",{"fr":138,"en":136,"ar":139,"es":140},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","alojar-nextcloud-en-su-propio-vps","Self-Host Nextcloud on VPS: NC 35, PHP 8.3 and MariaDB 11 Guide","Host Nextcloud on a VPS: Docker Compose, Redis, MariaDB backup, uploads over 40 GB behind Cloudflare and an alternative to Office 2021.",20,1,"2026-04-10T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[149],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":152},"nextcloud",{"id":154,"slug":155,"slugs":156,"title":160,"excerpt":161,"readTime":162,"views":144,"isPinned":19,"noindex":19,"publishedAt":163,"updatedAt":21,"category":164,"categories":165,"featuredImage":30,"bgImage":31,"posterImage":167,"relatedSolution":168},72,"hosting-ghost-on-your-own-vps",{"fr":157,"en":155,"ar":158,"es":159},"heberger-ghost","استضافة-ghost-على-خادمك-الـvps-الخاص","alojar-ghost-en-un-vps","Hosting Ghost on your own VPS: complete 2026 guide","Deploy Ghost v6 on your VPS with Caddy, MySQL, Ghost CLI and Stripe Tax: installation, TLS reverse proxy, updates and troubleshooting common startup errors.",10,"2026-04-09T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[166],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":25,"appSlug":169},"ghost",{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":23,"views":18,"isPinned":19,"noindex":19,"publishedAt":179,"updatedAt":180,"category":181,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},73,"host-wordpress-on-your-own-vps",{"fr":174,"en":172,"ar":175,"es":176},"heberger-wordpress","استضافة-wordpress-على-خادم-vps-الخاص-بك","alojar-wordpress-en-un-vps","Host WordPress on your own VPS","Host WordPress on your VPS for maximum performance and control: Docker, MariaDB, caching, reverse proxy and SSL.","2026-04-08T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[183],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-wordpress-poster.svg",{"categorySlug":25,"appSlug":186},"wordpress",true,1794270414562]