A Docker-based home server setup managing multiple services via docker-compose.
| Service | Description | Access | Data Location |
|---|---|---|---|
| Joplin | Open-source note-taking app with sync | joplin.marceloborges.dev | ./volumes/joplin |
| Vaultwarden | Self-hosted password manager (Bitwarden compatible) | vaultwarden.marceloborges.dev | ./volumes/vaultwarden |
| AdGuard Home | Network-wide ad and tracker blocking DNS server | adguard.marceloborges.dev | ./volumes/adguardhome |
| Paperless-ngx | Document management system with OCR | paperless.marceloborges.dev | ./volumes/paperless/* |
| Caddy | Reverse proxy and SSL manager | N/A | ./Caddyfile |
| Cloudflare DDNS | Dynamic DNS updater for Cloudflare domains | N/A | N/A |
| Uptime Kuma | Self-hosted monitoring tool | uptime.marceloborges.dev | ./volumes/uptime-kuma |
- Docker and Docker Compose
- DNS configuration for domains
- Clone repo and navigate to directory
- Create
.envfile with required environment variables - Create
docker-compose.envfile for Paperless-ngx configuration - Set Joplin permissions:
sudo chmod -R 777 volumes/joplin - Create directories for AdGuard Home:
mkdir -p volumes/adguardhome/work volumes/adguardhome/conf - Start services:
docker-compose up -d
- Start:
docker-compose up -d - Stop:
docker-compose down
All services auto-restart unless manually stopped. SSL certificates are managed automatically by Caddy.
After initial deployment, access the AdGuard Home setup wizard at adguard.marceloborges.dev to complete configuration. The service uses port 53 for DNS queries, so ensure no other DNS service is running on your host machine.
To use AdGuard Home as your DNS server:
- Complete the setup wizard
- Configure your router's DHCP to use your server's IP address as the DNS server
- Alternatively, configure individual devices to use your server's IP for DNS
After initial deployment, access Uptime Kuma at uptime.marceloborges.dev to complete setup. On first access, you'll be prompted to create an administrator account.
To monitor your services:
- Complete the initial setup by creating an admin account
- Add monitors for your websites and services
- Configure notification methods (email, Telegram, Discord, etc.)
- Optionally set up status pages to share with others
The Cloudflare DDNS service automatically updates your domain's DNS records with your current IP address. This is useful if your ISP assigns you a dynamic IP address.
To set up Cloudflare DDNS:
- Create a Cloudflare API token with Edit Zone DNS permissions
- Add the token to your
.envfile asCLOUDFLARE_API_TOKEN - Configure the domains to update in the
docker-compose.ymlfile under thecloudflare-ddnsservice
MIT License
# Token for Vaultwarden admin access
VAULTWARDEN_ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$your_generated_hash'
# Token for Cloudflare Edit Zone DNS API token
CLOUDFLARE_API_TOKEN=your_generated_edit_zone_dns_api_token
# Project name for docker-compose (prefixes containers, isolates networks)
COMPOSE_PROJECT_NAME=homeserver
###############################################################################
# Paperless-ngx settings #
###############################################################################
# See http://docs.paperless-ngx.com/configuration/ for all available options.
# The UID and GID of the user used to run paperless in the container. Set this
# to your UID and GID on the host so that you have write access to the
# consumption directory.
USERMAP_UID=1000
USERMAP_GID=1000
# This is required if you will be exposing Paperless-ngx on a public domain
PAPERLESS_URL=https://paperless.marceloborges.dev
# Adjust this key if you plan to make paperless available publicly. It should
# be a very long sequence of random characters.
PAPERLESS_SECRET_KEY=
# Use this variable to set a timezone for the Paperless Docker containers.
PAPERLESS_TIME_ZONE=Europe/Lisbon
# The default language to use for OCR.
PAPERLESS_OCR_LANGUAGE=eng
# Additional languages to install for text recognition
PAPERLESS_OCR_LANGUAGES=por fra deu