Dead-simple static homepage for your server. YAML config, no database. Shows all services as beautiful tiles with icons and status.
User --> Homer (:8080) --> YAML Config
|
Service Tiles
Icons
Status Checks
Custom CSS
services:
homer:
image: b4bz/homer:latest
container_name: homer
volumes:
- ./config:/www/assets
ports:
- "8080:8080"
restart: unless-stopped
# Main dashboard - can be root domain
example.com {
reverse_proxy homer:8080
}
Backup config/ directory (YAML + icons)
curl -s http://localhost:8080/ | grep -q Homer
Modern fully-featured app dashboard. Auto-discovers Docker containers, integrates 100+ services, real-time stats, weather, calendar widgets.
User --> Homepage (:3000) --> Docker Socket
|
Auto-Discovery
Widgets
100+ Integrations
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "3000:3000"
restart: unless-stopped
dashboard.example.com {
reverse_proxy homepage:3000
}
Backup config/ directory (YAML files)
curl -s http://localhost:3000/ | grep -q Homepage
Continuous file synchronization between devices. No cloud needed - VPS acts as always-on relay node. Sync folders with encryption.
Laptop <-> Syncthing VPS (:8384) <-> Phone
|
Always-on
Relay Node
Encrypted
P2P Sync
services:
syncthing:
image: syncthing/syncthing:latest
container_name: syncthing
hostname: vps-sync
environment:
PUID: 1000
PGID: 1000
volumes:
- ./syncthing-data:/var/syncthing
- ./shared:/var/syncthing/shared
ports:
- "8384:8384"
- "22000:22000/tcp"
- "22000:22000/udp"
- "21027:21027/udp"
restart: unless-stopped
sync.example.com {
reverse_proxy syncthing:8384
}
Backup syncthing-data/ for config. Shared files are synced across devices.
curl -s http://localhost:8384/rest/system/status
Sync reading progress, highlights, and notes for e-books across devices. Paired with Calibre-web for personal e-book library.
KoReader App --> Sync Server (:8090) --> KoReader App
|
Reading Progress
Highlights
Notes
services:
koreader-sync:
image: ghcr.io/koreader/koreader-sync-server:latest
container_name: koreader-sync
volumes:
- ./koreader-data:/data
ports:
- "8090:8090"
restart: unless-stopped
koreader.example.com {
reverse_proxy koreader-sync:8090
}
Backup koreader-data/ directory
curl -s http://localhost:8090/
AI-powered photo management. Face recognition, object detection, geolocation, search. Beautiful web UI. Needs swap on 1GB VPS.
User --> PhotoPrism (:2342) --> Photos DB
|
AI Analysis
Face Recognition
Object Detection
Geo Location
services:
photoprism:
image: photoprism/photoprism:latest
container_name: photoprism
environment:
PHOTOPRISM_ADMIN_PASSWORD: changeme
PHOTOPRISM_HTTP_PORT: 2342
PHOTOPRISM_ORIGINALS_PATH: /photoprism/originals
PHOTOPRISM_STORAGE_PATH: /photoprism/storage
volumes:
- ./photoprism-storage:/photoprism/storage
- /path/to/photos:/photoprism/originals
ports:
- "2342:2342"
restart: unless-stopped
photos.example.com {
reverse_proxy photoprism:2342
}
Backup photoprism-storage/ (DB, cache, settings). Photos in originals/.
curl -s http://localhost:2342/api/v1/status
Free media server for movies, TV, music, books. Streams to any device. Without transcoding, runs fine on 1GB VPS.
User --> Jellyfin (:8096) --> Media Files
|
Direct Play
(No Transcode)
Libraries
Metadata
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
volumes:
- ./jellyfin-config:/config
- ./jellyfin-cache:/cache
- /path/to/media:/media:ro
ports:
- "8096:8096"
restart: unless-stopped
media.example.com {
reverse_proxy jellyfin:8096
}
Backup jellyfin-config/ (settings, DB). Media files separate.
curl -s http://localhost:8096/health
Read-later plus RSS reader. Single Go binary. Tags, collections, full-text search. Clean, fast, no bloat.
User --> Readeck (:8080) --> SQLite DB
|
Content Extraction
RSS Feeds
Tags
Collections
services:
readeck:
image: codeberg.org/readeck/readeck:latest
container_name: readeck
environment:
READECK_SECRET_KEY: your-secret-key
volumes:
- ./readeck-data:/readeck/data
ports:
- "8080:8080"
restart: unless-stopped
readeck.example.com {
reverse_proxy readeck:8080
}
Backup readeck-data/ directory (SQLite DB + extracted content)
curl -s http://localhost:8080/api/bookmarks
Lightweight Matrix chat server in Rust. Federated, E2E encrypted, bridges to IRC/Discord/Telegram. Your own Slack/WhatsApp.
Users --> Conduit (:8448) --> Matrix Network
|
E2E Encryption
Federation
Bridges
Rooms
services:
conduit:
image: matrixconduit/matrix-conduit:latest
container_name: conduit
environment:
CONDUIT_SERVER_NAME: matrix.example.com
CONDUIT_DATABASE_PATH: /var/lib/conduit/conduit.db
CONDUIT_PORT: 8448
volumes:
- ./conduit-data:/var/lib/conduit
ports:
- "8448:8448"
restart: unless-stopped
matrix.example.com {
reverse_proxy conduit:8448
}
Backup conduit-data/ directory (SQLite DB)
curl -s http://localhost:8448/_matrix/key/v2/server
Low-latency, high-quality voice chat server. Crystal clear audio, positional audio for games, certificate-based auth.
Users --> Mumble Server (:64738) --> Channels
|
Low Latency
Certificate Auth
Positional Audio
services:
mumble-server:
image: mumblevoip/mumble-server:latest
container_name: mumble
environment:
MUMBLE_CONFIG_password: changeme
MUMBLE_CONFIG_welcometext: Welcome!
volumes:
- ./mumble-data:/data
ports:
- "64738:6478/tcp"
- "64738:6478/udp"
restart: unless-stopped
# Not proxied - Mumble uses custom TCP/UDP protocol
Backup mumble-data/ directory (config + DB)
Check with Mumble client connection
Beautiful modern wiki with Markdown, Git storage, and full-text search. Personal notes, docs, knowledge base, or team wiki.
User --> Wiki.js (:3000) --> PostgreSQL
|
Markdown Editor
Git Sync
Full-text Search
Multi-user
services:
wikijs:
image: ghcr.io/requarks/wiki:latest
container_name: wiki
environment:
DB_TYPE: postgres
DB_HOST: wiki-db
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: changeme
DB_NAME: wikijs
volumes:
- ./wiki-data:/wiki/data
ports:
- "3000:3000"
depends_on: [wiki-db]
restart: unless-stopped
wiki-db:
image: postgres:15-alpine
container_name: wiki-db
environment:
POSTGRES_DB: wikijs
POSTGRES_USER: wikijs
POSTGRES_PASSWORD: changeme
volumes:
- ./wiki-db:/var/lib/postgresql/data
restart: unless-stopped
wiki.example.com {
reverse_proxy wiki:3000
}
pg_dump wikijs > wiki_backup.sql
curl -s http://localhost:3000/graphql -X POST -H 'Content-Type: application/json' -d '{"query":"{pages{total}}"}'
Flat-file wiki - no database needed! PHP-based, ~15 MB RAM. Perfect for personal notes, documentation. Battle-tested since 2004.
User --> DokuWiki (:80) --> File System
|
Plain Text Files
Markup Syntax
Plugins
ACL
services:
dokuwiki:
image: linuxserver/dokuwiki:latest
container_name: dokuwiki
environment:
PUID: 1000
PGID: 1000
volumes:
- ./dokuwiki-data:/config
ports:
- "8080:80"
restart: unless-stopped
dokuwiki.example.com {
reverse_proxy dokuwiki:80
}
Backup dokuwiki-data/ directory (flat files, super simple)
curl -s http://localhost:8080/ | grep -q DokuWiki
Paper server for friends! With 1GB, limit to 4-5 players and use Aikar flags. Add Geyser for Bedrock cross-play.
Players --> Paper Server (:25565) --> World Data
|
Optimized
Plugins
Geyser (Bedrock)
Aikar Flags
services:
minecraft:
image: itzg/minecraft-server:latest
container_name: minecraft
environment:
EULA: "TRUE"
TYPE: PAPER
MEMORY: 768M
ENABLE_RCON: "true"
RCON_PASSWORD: changeme
DIFFICULTY: normal
MAX_PLAYERS: 5
MOTD: My Server
volumes:
- ./minecraft-data:/data
ports:
- "25565:25565"
- "19132:19132/udp"
restart: unless-stopped
# Not proxied - Minecraft uses custom protocol # RCON can be proxied if needed
Backup minecraft-data/ directory (world + config). Use tar or rsync.
rcon-cli list
Host custom bots for Telegram, Discord, or Matrix. RSS feed bots, reminder bots, chatbots, translation bots.
Telegram/Discord --> Bot Process (:port) --> Actions
|
Message Handler
Webhooks
Scheduled Tasks
services:
telegram-bot:
image: python:3.11-slim
container_name: telegram-bot
working_dir: /app
volumes:
- ./bot-code:/app
environment:
BOT_TOKEN: your-telegram-bot-token
command: python bot.py
restart: unless-stopped
# Example: RSS-to-Telegram bot
rss-bot:
image: python:3.11-slim
container_name: rss-bot
working_dir: /app
volumes:
- ./rss-bot:/app
environment:
TELEGRAM_TOKEN: your-token
CHAT_ID: your-chat-id
command: python rss_to_telegram.py
restart: unless-stopped
# Bots connect outbound to Telegram/Discord APIs # No inbound proxy needed
Backup bot-code/ directory. Tokens stored in environment/secrets.
Check bot logs: docker logs telegram-bot
Self-hosted, ad-free, privacy-respecting Google search proxy. No JavaScript, no ads, no tracking, no AMP.
User --> Whoogle (:5000) --> Google Search
|
Strip Ads
Strip Tracking
No JS
No AMP
services:
whoogle:
image: benbusby/whoogle-search:latest
container_name: whoogle
environment:
WHOOGLE_CONFIG_LANGUAGE: lang_en
WHOOGLE_CONFIG_COUNTRY: US
ports:
- "5000:5000"
restart: unless-stopped
search.example.com {
reverse_proxy whoogle:5000
}
Stateless - no data to backup.
curl -s http://localhost:5000/healthz
Full VS Code in browser. Code from anywhere - tablet, phone, Chromebook. IDE in the cloud.
User --> code-server (:8080) --> VS Code
|
Extensions
Terminal
Git
File Editor
services:
code-server:
image: codercom/code-server:latest
container_name: code-server
environment:
PASSWORD: changeme
SUDO_PASSWORD: changeme
volumes:
- ./code-server-data:/home/coder/.local
- ./projects:/home/coder/project
ports:
- "8080:8080"
restart: unless-stopped
code.example.com {
reverse_proxy code-server:8080
}
Backup code-server-data/ and projects/ directories
curl -s http://localhost:8080/healthz
Generate RSS feeds for sites that dont have them. Follow YouTube, Twitter, subreddits, any website as RSS. 300+ bridges built-in.
User --> RSS Bridge (:3000) --> Source Sites
|
300+ Bridges
Feed Generation
Caching
services:
rss-bridge:
image: rssbridge/rss-bridge:latest
container_name: rss-bridge
volumes:
- ./rss-bridge-config:/config
ports:
- "3000:80"
restart: unless-stopped
rss.example.com {
reverse_proxy rss-bridge:3000
}
Stateless mostly. Backup rss-bridge-config/ for custom settings.
curl -s http://localhost:3000/ | grep -q 'RSS-Bridge'
Minimal bookmark manager with clean fast UI. Tag-based org, search, import/export, browser extension.
User --> Linkding (:9090) --> SQLite DB
|
Tags
Search
Import/Export
services:
linkding:
image: sissbruecker/linkding:latest
container_name: linkding
volumes:
- ./linkding-data:/etc/linkding/data
ports:
- "9090:9090"
restart: unless-stopped
bookmarks.example.com {
reverse_proxy linkding:9090
}
Backup linkding-data/ directory (SQLite DB)
curl -s http://localhost:9090/bookmarks/