Docker Tips

Providing Assets

Mount static assets using volumes:

-v ~/my-custom-logo.svg:/app/src/assets/logo.svg

Running Commands

Use exec to run commands inside a container:

docker exec -it domain-locker-app /bin/sh

To view running containers:

docker ps

Healthchecks

Domain Locker defines healthchecks for the app and database. View health status:

docker inspect --format '{{json .State.Health}}' domain-locker-app

Use Autoheal to restart unhealthy containers:

docker run -d \
  --name autoheal \
  --restart=always \
  -e AUTOHEAL_CONTAINER_LABEL=all \
  -v /var/run/docker.sock:/var/run/docker.sock \
  willfarrell/autoheal

Logs and Performance

Logs

docker logs domain-locker-app --follow

Stats

docker stats

Use cAdvisor, Prometheus, or Grafana for container metrics.


Auto-Start at Boot

All containers use restart: unless-stopped to start after reboot or crash.


Updating

Manual Update

docker compose pull

docker compose up -d

Auto Updates

Use Watchtower:

docker run -d \
  --name watchtower \
  --restart=unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower

Backing Up

Back up the Postgres data volume:

docker run --rm \
  -v domain_locker_postgres_data:/volume \
  -v /tmp:/backup alpine \
  tar -cjf /backup/pgdata.tar.bz2 -C /volume .

Automate with cron or use offen/docker-volume-backup for scheduled backups.

And store backups offsite using rclone, restic, or S3-compatible services.


Secrets Management

Avoid hardcoding secrets in docker-compose.yml. Use a .env file:

DL_PG_PASSWORD=strongpassword
DL_JWT_SECRET=random-long-token

Restrict .env file permissions to prevent leaks:

chmod 600 .env

For production, consider Docker Secrets or Kubernetes Secrets.


Authentication

Domain Locker supports Supabase Auth. Enable RLS and secure JWT handling. Set DL_JWT_SECRET and use HTTPS in production.


Remote Access

Use secure tools for access:


SSL Certificates

Use a reverse proxy with automatic HTTPS:

With Traefik

Labels:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.domainlocker.rule=Host(`locker.example.com`)"
  - "traefik.http.routers.domainlocker.entrypoints=https"
  - "traefik.http.routers.domainlocker.tls=true"
  - "traefik.http.services.domainlocker.loadbalancer.server.port=3000"

Ensure acme and a certResolver are configured in Traefik.

With Caddy

locker.example.com {
  reverse_proxy localhost:3000
}

Caddy will handle certs via Let's Encrypt automatically.


Custom Domain

Set an A or CNAME record pointing to your server.

Use the domain in your proxy config (e.g. Traefik or Caddy).

Optionally edit /etc/hosts for local testing:

127.0.0.1 locker.local

Monitoring

Recommended tools:


Metrics and Observability

Expose metrics for dashboards and alerting:

  • Add Prometheus exporter sidecars
  • Log to file, and ship to Grafana Loki or ELK stack
  • Consider OpenTelemetry if integrating with external tools

Compose Management

Starting

docker compose up -d

Stopping

docker compose down

Use --env-file to override env vars:

docker compose --env-file .env.production up -d

Kubernetes Setup (Optional)

Use Helm for deploys. Define:

  • Separate deployments for app, db, and updater
  • Use ConfigMaps for config and Secrets for sensitive values
  • Ingress controller (e.g. Traefik or NGINX) with TLS enabled
  • PersistentVolumeClaim for Postgres storage
  • HorizontalPodAutoscaler for load-based scaling

Running a Modified Version

  1. Clone the repo
  2. Install dependencies:
yarn install
  1. Build:
yarn build
  1. Build Docker image:
docker build -t domain-locker .
  1. Run locally:
docker run -p 3000:3000 domain-locker

CI/CD Recommendations

  • Use GitHub Actions or GitLab CI to build and push Docker images
  • Pin image versions in production
  • Run vulnerability scans with Trivy or Snyk
  • Publish images to DockerHub and GHCR

Security Best Practices

  • Never run containers as root
  • Set user with USER appuser
  • Use read-only file systems where possible
  • Keep your base images minimal (e.g. Alpine)
  • Limit exposed ports
  • Enable logging and monitoring
  • Regularly rotate secrets

Helpful Tools

  • Portainer – GUI for container management
  • Lazydocker – Terminal UI for Docker
  • Watchtower – Auto-updates
  • Uptime Kuma – Status monitoring
  • pgAdmin / Postico – Database browsing
  • Snyk / Trivy – Image scanning
  • Caddy – Simple TLS reverse proxy

Hey there! 👋

I hope you're finding Domain Locker useful. If you'd like to support my work, consider becoming a sponsor on GitHub Sponsors. Every contribution however small is greatly appreciated and helps me keep these tools running and open source.
Either way, thanks for being here—you're awesome! 🚀

Initializing

We're just getting everything ready for you. This shouldn't take a moment...