services: web: build: . restart: unless-stopped environment: # Next binds to localhost without HOSTNAME, and Traefik then 404s. HOSTNAME: "0.0.0.0" PORT: "3000" OPENAI_API_KEY: ${OPENAI_API_KEY} BOT_MODEL: ${BOT_MODEL} BOT_EFFORT: ${BOT_EFFORT} DATABASE_URL: ${DATABASE_URL} WAPI_BASE_URL: ${WAPI_BASE_URL} WAPI_API_KEY: ${WAPI_API_KEY} WAPI_WEBHOOK_SECRET: ${WAPI_WEBHOOK_SECRET} # Account-level, and only used to reconnect a dropped session. Optional: without it the # bot works but cannot bring itself back after the session drops. WAPI_PAT: ${WAPI_PAT} WAPI_SESSION_ID: ${WAPI_SESSION_ID} BOT_REPLY_TO_DMS: ${BOT_REPLY_TO_DMS} BOT_RATE_LIMIT_PER_MINUTE: ${BOT_RATE_LIMIT_PER_MINUTE} # Reminders need it: "nine in the morning" is meaningless on a UTC server. BOT_TIMEZONE: ${BOT_TIMEZONE} BOT_SUMMARY_MODEL: ${BOT_SUMMARY_MODEL} BOT_SUPPORTER_RATE_LIMIT: ${BOT_SUPPORTER_RATE_LIMIT} BUYMEACOFFEE_TOKEN: ${BUYMEACOFFEE_TOKEN} BUYMEACOFFEE_WEBHOOK_SECRET: ${BUYMEACOFFEE_WEBHOOK_SECRET} # Left empty in production — the image installs Chromium at the path the renderer # already looks in. The `:-` default is what keeps compose from warning about an # unset variable on every deploy; it exists only so it *can* be overridden. CHROMIUM_PATH: ${CHROMIUM_PATH:-} # The dashboard shows memories, stickers and spend, so it is behind a sign-in. ADMIN_USER: ${ADMIN_USER} ADMIN_PASSWORD_HASH: ${ADMIN_PASSWORD_HASH} AUTH_SECRET: ${AUTH_SECRET} BOT_IMAGE_MODEL: ${BOT_IMAGE_MODEL} # Naming a sticker is a narrow task, so it can run on a cheaper tier than replies. BOT_VISION_MODEL: ${BOT_VISION_MODEL} # Only needed to price a model with no published rate built in. OPENAI_PRICE_INPUT: ${OPENAI_PRICE_INPUT} OPENAI_PRICE_OUTPUT: ${OPENAI_PRICE_OUTPUT} # Optional: enables writing to Google Sheets. Reading a public sheet needs nothing. GOOGLE_SERVICE_ACCOUNT_JSON: ${GOOGLE_SERVICE_ACCOUNT_JSON} # Notion is optional; unset, its tools are simply not offered. NOTION_CLIENT_ID: ${NOTION_CLIENT_ID} NOTION_CLIENT_SECRET: ${NOTION_CLIENT_SECRET} # Used to build the OAuth redirect, so it has to match the integration's registered URI. APP_URL: ${APP_URL} # The public vote board the bot follows, and our project's slug on it. Optional: unset, # the leaderboard tool is not offered and no group is told anything. LEADERBOARD_URL: ${LEADERBOARD_URL:-} LEADERBOARD_SLUG: ${LEADERBOARD_SLUG:-} # Where to vote, and where the board's interesting part ends. Both optional. LEADERBOARD_VOTE_URL: ${LEADERBOARD_VOTE_URL:-} LEADERBOARD_CROP: ${LEADERBOARD_CROP:-} expose: - "3000"