# ───────────────────────────────────────────────────────────── # media-vault — configuration # Copy to `.env` and fill in. NEVER commit your real .env. # ───────────────────────────────────────────────────────────── # ---- Database (Postgres) ---- POSTGRES_USER=mediavault POSTGRES_PASSWORD=change-me-in-prod POSTGRES_DB=mediavault POSTGRES_HOST=db POSTGRES_PORT=5432 # ---- Backend ---- # Port the API listens on (inside the container / locally) BACKEND_PORT=4000 # Secret used to sign session cookies. OPTIONAL — leave blank and one is # auto-generated and saved to the data volume on first boot. Only set your own # if you want to (e.g. from: openssl rand -base64 32). SESSION_SECRET= # Public origin of the frontend, used for CORS + cookie settings. APP_ORIGIN=http://localhost:8080 # Set to "production" behind TLS so session cookies are marked Secure. NODE_ENV=development # Default household user, created on first boot to own the seeded 513-game list. # Log in with these, then change the password from the UI. SEED_USER_EMAIL=admin@media-vault.local SEED_USER_PASSWORD=changeme SEED_USER_NAME=Collector # Open registration. Keep false on a network-exposed instance (the seed user above # always exists). Set true only if you want new people to self-register accounts. ALLOW_REGISTRATION=false # ---- Frontend (nginx) exposed port ---- FRONTEND_PORT=8080 # ───────────────────────────────────────────────────────────── # Metadata sources — bring your own free API keys. # Enrichment stays idle for any source whose keys are blank. # ───────────────────────────────────────────────────────────── # IGDB (games) — via a Twitch developer app. # 1. https://dev.twitch.tv/console/apps → Register Your Application # 2. OAuth Redirect URL: http://localhost (any valid URL; unused by us) # 3. Category: Application Integration # 4. Copy the Client ID, then "New Secret" for the Client Secret. IGDB_CLIENT_ID= IGDB_CLIENT_SECRET= # TMDB (movies) — https://www.themoviedb.org/settings/api # Use the API Read Access Token (v4 auth), a long "eyJ..." bearer token. TMDB_ACCESS_TOKEN= # Language for movie titles/descriptions, e.g. en-US or de-DE. TMDB_LANGUAGE=en-US # Discogs (vinyl LP / single / CD) — https://www.discogs.com/settings/developers # OPTIONAL: leave all three blank and music is matched via MusicBrainz + Cover # Art Archive instead (no key needed). Discogs adds liner notes + valuation. # Two options (either works for read-only metadata): # (a) "Generate new token" → personal access token → set DISCOGS_TOKEN, or # (b) register an app → Consumer Key + Secret → set DISCOGS_KEY + DISCOGS_SECRET. DISCOGS_TOKEN= DISCOGS_KEY= DISCOGS_SECRET= # Discogs requires a descriptive User-Agent identifying your app. DISCOGS_USER_AGENT=media-vault/0.1 (+https://github.com/halvar20000/media-vault) # ---- Valuation ---- # Game valuation via PriceCharting. NOTE: their API requires a PAID subscription # token (https://www.pricecharting.com/api-documentation) — there is no free game # price API. Leave blank to disable game valuation. Music valuation uses Discogs # (your key above); movies have no automatic price source (manual only). PRICECHARTING_TOKEN= # Game valuation via eBay — FREE. Register an app at https://developer.ebay.com # (Application Keyset → Production) and paste the App ID (Client ID) + Cert ID # (Client Secret). When set, games are valued from eBay used-listing prices and # eBay takes priority over PriceCharting. Marketplace picks the site/currency: # EBAY_DE (EUR), EBAY_FR (EUR), EBAY_GB (GBP), EBAY_US (USD), EBAY_IT, EBAY_ES… EBAY_CLIENT_ID= EBAY_CLIENT_SECRET= EBAY_MARKETPLACE_ID=EBAY_DE # Steam import — a Steam Web API key (https://steamcommunity.com/dev/apikey) lets # you import your owned Steam games via Add → Steam. Read-only; your Steam profile's # "Game details" must be set to Public. Can also be set in the app's ⚙ Settings. STEAM_API_KEY= # Currency for Discogs marketplace prices, e.g. EUR, USD, GBP. VALUATION_CURRENCY=EUR # ---- Second-hand marketplace(s) ---- # Which marketplace(s) the "find deals / bundles" buttons search. Comma-separated # — each value adds its own search button, so you can offer several at once. # Titles and bundle/lot phrasing come out in each site's language. Values: # leboncoin (France), kleinanzeigen (Germany), ebay-de, ebay-com, ebay-uk, # ebay-fr, marktplaats (Netherlands), wallapop (Spain), medimops (German # used-media shop), easycash (French used-goods shop), gamestop (US game shop), # craigslist (US classifieds — needs CRAIGSLIST_SITE below), or none. # Example (several at once): MARKETPLACE=leboncoin,easycash,medimops,kleinanzeigen # US example: MARKETPLACE=gamestop,craigslist,ebay-com MARKETPLACE=leboncoin # Optional: pin Easy Cash results to one physical store. Use the store's exact # facet value (department code + name), e.g. "68 - Mulhouse". Blank = all stores. EASYCASH_STORE= # Craigslist is per-city: set your site subdomain, e.g. newyork, sfbay, losangeles. # Required for Craigslist links (it has no national search). Blank = Craigslist hidden. CRAIGSLIST_SITE=