Self-Hosting
The HomeLab Media & Personal Cloud Stack
Your photos, your files, your video streaming and your saved articles — all on your own server, without relying on Google Photos, Dropbox or Netflix for your own media collection.
Combined minimum RAM
~5.3GB
Estimated savings
Digital sovereignty for your photos, streaming and files
Overlapping tools
- Alternatives to each other for Pocket: Linkwarden, wallabag. You may only need one of them.
Tools in this pack (5)
Immich
AI-powered photo and video backup, a self-hosted alternative to Google Photos.
Storage100% FOSS🔴 Full · ~2GB
docker-compose.yml
version: "3.9"
services:
immich-server:
image: ghcr.io/immich-app/immich-server:release
restart: unless-stopped
ports:
- "2283:2283"
environment:
- DB_HOSTNAME=immich-db
- DB_USERNAME=immich
- DB_PASSWORD=change-me-db-password # REQUIRED: generate a random secret before first run
- REDIS_HOSTNAME=immich-redis
volumes:
- immich_uploads:/usr/src/app/upload # CHANGE THIS to a real disk path with enough space for your photo library
depends_on:
- immich-db
- immich-redis
immich-db:
image: tensorchord/pgvecto-rs:pg15-v0.2.0
restart: unless-stopped
environment:
- POSTGRES_USER=immich
- POSTGRES_PASSWORD=change-me-db-password # must match DB_PASSWORD above
- POSTGRES_DB=immich
volumes:
- immich_pg_data:/var/lib/postgresql/data
immich-redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
immich_uploads:
immich_pg_data:
Nextcloud
File cloud and collaboration, an alternative to Google Drive.
StorageOpen-Core🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
nextcloud:
image: nextcloud:35.0.1
restart: unless-stopped
ports:
- "8080:80"
environment:
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.yourdomain.com # CHANGE THIS TO YOUR DOMAIN
- MYSQL_HOST=nextcloud-db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=change-me-db-password # REQUIRED: generate a random secret before first run
volumes:
- nextcloud_data:/var/www/html
depends_on:
- nextcloud-db
nextcloud-db:
image: mariadb:11
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=change-me-root-password # REQUIRED: generate a random secret before first run
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=change-me-db-password # must match MYSQL_PASSWORD above
volumes:
- nextcloud_db_data:/var/lib/mysql
volumes:
nextcloud_data:
nextcloud_db_data:
Jellyfin
Personal media streaming server, a free alternative to Plex.
Storage100% FOSS🟢 Lightweight · ~256MB
docker-compose.yml
services:
jellyfin:
image: jellyfin/jellyfin:12.1
restart: unless-stopped
ports:
- "8096:8096"
volumes:
- jellyfin_config:/config
- jellyfin_cache:/cache
- /path/to/your/media:/media # point this at your media library folder
volumes:
jellyfin_config:
jellyfin_cache:
Linkwarden
Bookmark manager with page archiving, an alternative to Raindrop.io.
Productivity100% FOSS🟡 Standard · ~1GB
docker-compose.yml
services:
linkwarden:
image: ghcr.io/linkwarden/linkwarden:v2.16.3
restart: unless-stopped
ports:
- "3000:3000"
environment:
NEXTAUTH_SECRET: change-me-super-secret # REQUIRED: generate a random secret before first run
NEXTAUTH_URL: http://localhost:3000 # CHANGE THIS TO YOUR DOMAIN
DATABASE_URL: "postgresql://linkwarden:change-me-postgres-password@linkwarden-db:5432/linkwarden" # must match POSTGRES_PASSWORD below
volumes:
- linkwarden_data:/data/data
depends_on:
- linkwarden-db
linkwarden-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: linkwarden
POSTGRES_PASSWORD: change-me-postgres-password # REQUIRED: generate a random secret before first run
POSTGRES_DB: linkwarden
volumes:
- linkwarden_pg_data:/var/lib/postgresql/data
volumes:
linkwarden_data:
linkwarden_pg_data:
wallabag
Save articles to read later offline, an alternative to Pocket.
Productivity100% FOSS🟡 Standard · ~1GB
docker-compose.yml
services:
wallabag:
image: wallabag/wallabag
restart: unless-stopped
ports:
- "8080:80"
environment:
SYMFONY__ENV__DATABASE_DRIVER: pdo_mysql
SYMFONY__ENV__DATABASE_HOST: wallabag-db
SYMFONY__ENV__DATABASE_NAME: wallabag
SYMFONY__ENV__DATABASE_USER: wallabag
SYMFONY__ENV__DATABASE_PASSWORD: change-me-mysql-password # REQUIRED: generate a random secret before first run
SYMFONY__ENV__DOMAIN_NAME: http://localhost:8080 # CHANGE THIS TO YOUR DOMAIN
SYMFONY__ENV__SECRET: change-me-super-secret # REQUIRED: generate a random secret before first run
depends_on:
- wallabag-db
wallabag-db:
image: mysql:8
restart: unless-stopped
environment:
MYSQL_DATABASE: wallabag
MYSQL_USER: wallabag
MYSQL_PASSWORD: change-me-mysql-password # must match SYMFONY__ENV__DATABASE_PASSWORD above
MYSQL_ROOT_PASSWORD: change-me-mysql-root-password # REQUIRED: generate a random secret before first run
volumes:
- wallabag_db_data:/var/lib/mysql
volumes:
wallabag_db_data: