EinVault logo

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.