# Copy this file to .env and fill in the values before running the application. # Public origin. Also decides the environment when APP_ENV is not set: # dev http://localhost:3102 or https://esports-dev.vash.software # staging https://esports-staging.vash.software # prod https://esports.vash.software ORIGIN="http://localhost:3102" # dev | staging | prod. Dev and staging prefix page titles, show an environment # badge, and enable the simulation lab. Leave unset to derive it from ORIGIN. APP_ENV="" # Postgres in the shared instance, one database and login role per environment: # vash (prod), vash_staging, vash_dev on 127.0.0.1:5440. DB_URL="postgresql://vash_dev:password@127.0.0.1:5440/vash_dev" DATABASE_URL="postgresql://vash_dev:password@127.0.0.1:5440/vash_dev" # Lobbies: simulator | irc. Unset means irc in production and simulator # everywhere else, so dev and staging never log production's osu! account out. BANCHO_MODE="simulator" # One object per osu! account. A normal account hosts 4 tournament lobbies; # add friends' accounts to host more at once. botAccount raises rate limits. # OSU_IRC_ACCOUNTS='[{"id":"main","username":"player","password":"irc-password","maxLobbies":4}]' # Single-account shorthand (https://osu.ppy.sh/home/account/edit#legacy-api): OSU_IRC_USERNAME="" OSU_IRC_PASSWORD="" # osu! account signed in to the autonomous tourney streamer; Vash adds it as a room referee. OSU_TOURNEY_ACCOUNT="" # Another IRC server, such as a private Bancho or a local fake. Defaults to irc.ppy.sh:6667. # OSU_IRC_HOST="" # OSU_IRC_PORT="" # Stable Better Auth user ID of the root admin. The migration stores this role # in the database; no OAuth or email-shaped identity is used for authorization. ROOT_ADMIN_USER_ID="" # Better Auth secret: 32+ random characters, e.g. `openssl rand -hex 32`. BETTER_AUTH_SECRET="" # Email registration, verification, recovery, and email changes become available # when both are set. Social sign-in does not require either value. RESEND_API_KEY="" EMAIL_FROM="Vash Esports " # Cloudflare R2 image storage (team avatars, tournament icons and banners). # The bucket needs public access at R2_PUBLIC_URL. R2_ACCOUNT_ID="" R2_ACCESS_KEY_ID="" R2_SECRET_ACCESS_KEY="" R2_BUCKET="vash-esports-images" R2_PUBLIC_URL="https://cdn.esports.vash.software" # osu! OAuth application: https://osu.ppy.sh/home/account/edit#oauth # Callback: /api/auth/oauth2/callback/osu OSU_CLIENT_ID="" OSU_CLIENT_SECRET="" # "Sign in with Discord" application (not the bot). DISCORD_CLIENT_ID="" DISCORD_CLIENT_SECRET="" # The notification bot. Several environments may share one token: the bot only # posts. Point dev and staging at a private channel such as #dev-channel. DISCORD_BOT_TOKEN="" # Optional; read from the token when unset. Used for the "Add bot" link on /admin. DISCORD_BOT_CLIENT_ID="" DISCORD_GUILD_ID="" # Match results (no pings) and stream announcements (@everyone in a channel that # members with the "no stream notifications" role cannot read). DISCORD_MATCH_CHANNEL_ID="" DISCORD_STREAM_CHANNEL_ID="" # Google OAuth: https://console.cloud.google.com/apis/credentials GOOGLE_CLIENT_ID="" GOOGLE_CLIENT_SECRET="" # Sentry error tracking (https://sentry.io) PUBLIC_SENTRY_DSN="" # Only CI needs this, to upload source maps. Keep it out of local builds. SENTRY_AUTH_TOKEN="" # Fraction of requests traced. Defaults to 0.1 in prod and 0 elsewhere. SENTRY_TRACES_SAMPLE_RATE="" # Logging: LOG_LEVEL=debug for more detail, LOG_SQL=1 to log every query. LOG_LEVEL="info" LOG_SQL="" # Encrypts streaming platform keys (Broadcast → Stream). Defaults to BETTER_AUTH_SECRET; # set it separately to rotate the auth secret without re-entering stream keys. # STREAM_KEY_SECRET=""