EinVault
Self-hosted animal companion health and care tracker for homelabs
Alternative to: petdesk, 11pets, petnoter
EinVault is a private, self-hosted health and care tracker for pets and other animal companions. It lets households log vet visits, medications, vaccinations, weight, and daily activities such as walks, meals, and grooming, alongside a journal with photo and video uploads. Built with SvelteKit and SQLite, it supports role-based access for multiple household members and calendar/reminder integration.
EinVault Docker Compose example
Self-host EinVault on your own server, homelab, or VPS starting from this Docker Compose example.
It runs EinVault in Docker containers using the official ghcr.io/davefatkin/einvault:latest image, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
einvault:
image: ghcr.io/davefatkin/einvault:latest
restart: unless-stopped
# The app runs unprivileged as UID/GID 1000; the data volume is owned to match.
user: "1000:1000"
volumes:
- data:/data
environment:
# Your public URL — must match the address you access EinVault from.
# Used for CSRF protection; the app rejects form submissions without it.
ORIGIN: "http://localhost:3000"
NODE_ENV: "production"
# SQLite database path inside the mounted data volume.
DATABASE_URL: "/data/einvault.db"
# Local timezone so dates and times display correctly (e.g. Europe/London).
TZ: "UTC"
# Maximum image upload size in MB. BODY_SIZE_LIMIT is derived automatically.
UPLOAD_MAX_MB: "10"
# Maximum journal video upload size in MB (stored as-is, no transcoding).
VIDEO_MAX_MB: "100"
# Maximum journal photos and videos (combined) per companion per day.
MAX_DAILY_MEDIA: "5"
# Maximum documents (uploads and Paperless references) per companion.
MAX_DOCUMENTS_PER_COMPANION: "200"
# Default undo window (seconds) for dismissing a Reminder. 0 disables it.
REMINDER_UNDO_SECONDS: "7"
# Optional two-factor authentication. 32-byte base64 key that encrypts
# stored TOTP secrets; required to enable 2FA. Generate with:
# openssl rand -base64 32. Leave empty to keep 2FA disabled.
TWOFA_ENC_KEY: ""
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp:mode=1777,size=64m
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/api/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
volumes:
data: Prefer a managed setup? WinterFlow installs, configures, and updates EinVault for you using this same Docker Compose configuration.