LIVEReading: Self-Host Encrypted Photo Backup with EnteTotal time: 12 minSteps: 6Worked first time: 65% LIVEReading: Self-Host Encrypted Photo Backup with EnteTotal time: 12 minSteps: 6Worked first time: 65%
CBW
Self-Host Encrypted Photo Backup with Ente
Mediumgithub.com/ente/ente2026-07-03

Self-Host Encrypted Photo Backup with Ente

Run your own end-to-end encrypted photo backup server at home using Ente's official Docker setup. Your photos never touch anyone else's cloud.

// Build stats

  • Total time12 min
  • Number of steps6
  • DifficultyMedium
  • Worked first time65%
// Before you start

What you need

  • A computer or home server running Linux, macOS, or Windows with Docker installed
  • Docker Desktop (or Docker Engine + Docker Compose) — download at docker.com
  • At least 10 GB of free disk space for photos and server data
  • Basic comfort opening a terminal / command prompt
  • A stable internet connection if you want remote access
01
Step 1 of 6

Download the Ente server files

3 min

Git clones the entire Ente repository to your machine. You only need the 'server' folder, but cloning everything is the safest way to get the exact files the Docker setup expects. If you don't have Git, you can also download the ZIP from GitHub and unzip it.

Terminal · mac
$ git clone https://github.com/ente-io/ente.git && cd ente/server
What you should see
A folder called 'ente' appears in your current directory. Your terminal prompt now shows you are inside 'ente/server'.
This might happen

'git' is not recognised as a command

Install Git from git-scm.com, restart your terminal, then retry.

02
Step 2 of 6

Copy the sample environment file

2 min

The server needs a configuration file that tells it things like secret keys and storage paths. A ready-made sample file ships with the repo. You copy it to create your own live config. You do NOT need to edit it to get started — the defaults work for a local test.

Terminal · mac
$ cp scripts/compose/.env.sample scripts/compose/.env
What you should see
No output means success. A new file called '.env' now exists inside 'scripts/compose/'.
This might happen

On Windows Command Prompt, 'cp' is not available

Use 'copy scripts\compose\.env.sample scripts\compose\.env' instead, or use Git Bash which supports 'cp'.

03
Step 3 of 6

Start the server with Docker Compose

5 min

This single command downloads all the required Docker images (the Ente server, a Postgres database, and a MinIO object store) and starts them together. The '-d' flag runs everything in the background so your terminal stays free. The first run takes a few minutes because it downloads several hundred megabytes.

Terminal · mac
$ docker compose -f scripts/compose/docker-compose.yml up -d
What you should see
Docker prints lines like 'Pulling ...', then 'Creating ...' or 'Started ...'. Finally you see 'Container ente-server-1 Started'. No red ERROR lines.
This might happen

Port 8080 or 3200 is already in use — Docker reports 'address already in use'

Open scripts/compose/.env and change the conflicting port numbers (ENTE_SERVER_PORT, MINIO_PORT) to unused ports like 8181 and 3201, then re-run the command.

04
Step 4 of 6

Confirm the server is running

1 min

This quick health-check hits the server's status endpoint. If you get a JSON response back, the server is alive and accepting connections. If you get 'connection refused', the containers are still starting — wait 30 seconds and try again.

Terminal · mac
$ curl http://localhost:8080/ping
What you should see
You see something like: {"message":"pong"}
This might happen

'curl' is not installed on Windows

Open a browser and visit http://localhost:8080/ping — you should see the same JSON text in the browser window.

05
Step 5 of 6

Connect the Ente Photos app to your server

5 min

Install the Ente Photos app on your phone (iOS App Store or Google Play) or download the desktop app from ente.io/download. On the sign-up / login screen, look for a small 'server' or 'endpoint' option — it is usually a tiny icon or link at the bottom of the screen. Enter your server address (e.g. http://YOUR-COMPUTER-IP:8080). Create a new account. All your photos will now back up to your own machine instead of Ente's cloud.

Terminal · mac
$ docker logs ente-server-1 --tail 20
What you should see
Recent log lines from the server. When the app connects you will see lines containing 'GET /ping' or 'POST /users' confirming the app is talking to your server.
This might happen

The app cannot reach the server from your phone

Your phone and computer must be on the same Wi-Fi network. Use your computer's local IP address (find it with 'ipconfig' on Windows or 'ifconfig' on Mac/Linux) instead of 'localhost'.

06
Step 6 of 6

Stop or restart the server when needed

1 min

When you want to shut everything down cleanly — for example before restarting your computer — run the stop command. To bring it back up later, use the same 'up -d' command from Step 3. Your data is stored in Docker volumes and will survive restarts.

Terminal · mac
$ docker compose -f scripts/compose/docker-compose.yml down
What you should see
Lines like 'Container ente-server-1 Stopped' and 'Container ente-db-1 Stopped'. No errors.
// Status

cooked. baked. worked.

A fully working Ente Photos server running on your own machine, with the mobile or desktop app backing up photos to it in end-to-end encrypted form — no third-party cloud involved.

// the honest bit

The honest part

This guide sets up a local development/personal server using the defaults from the repo. It is NOT hardened for public internet exposure — do not open port 8080 to the internet without adding HTTPS (a reverse proxy like Caddy or Nginx) and changing the default secrets in the .env file. The self-hosted server does not include Ente's paid storage tiers; you manage your own disk space. Mobile apps connect easily on local Wi-Fi, but remote access over the internet requires extra networking steps (port forwarding or a VPN) not covered here. Ente Auth and Ente Locker can also point to a self-hosted server, but setup steps differ slightly.