include: - ./docker-compose.infra.yml services: api: container_name: api image: ghcr.io/ever-co/gauzy-api:latest environment: API_HOST: ${API_HOST:-api} API_PORT: ${API_PORT:-3000} NODE_ENV: ${NODE_ENV:-development} DB_HOST: db API_BASE_URL: ${API_BASE_URL:-http://localhost:3000} CLIENT_BASE_URL: ${CLIENT_BASE_URL:-http://localhost:4200} # Origins the API may put in sign-in, invite and verification e-mail links besides CLIENT_BASE_URL: the # Ever Teams web app of this stack (published on 3030) EMAIL_LINK_ALLOWED_ORIGINS: ${EMAIL_LINK_ALLOWED_ORIGINS:-http://localhost:3030} CLOUD_PROVIDER: ${CLOUD_PROVIDER:-} SENTRY_DSN: ${SENTRY_DSN:-} SENTRY_HTTP_TRACING_ENABLED: ${SENTRY_HTTP_TRACING_ENABLED:-} SENTRY_POSTGRES_TRACKING_ENABLED: ${SENTRY_POSTGRES_TRACKING_ENABLED:-} SENTRY_PROFILING_ENABLED: ${SENTRY_PROFILING_ENABLED:-} JITSU_SERVER_URL: ${JITSU_SERVER_URL:-} OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: ${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-} OTEL_EXPORTER_OTLP_HEADERS: ${OTEL_EXPORTER_OTLP_HEADERS:-} OTEL_ENABLED: ${OTEL_ENABLED:-} OTEL_PROVIDER: ${OTEL_PROVIDER:-} JITSU_SERVER_WRITE_KEY: ${JITSU_SERVER_WRITE_KEY:-} GAUZY_GITHUB_CLIENT_ID: ${GAUZY_GITHUB_CLIENT_ID:-} GAUZY_GITHUB_CLIENT_SECRET: ${GAUZY_GITHUB_CLIENT_SECRET:-} GAUZY_GITHUB_WEBHOOK_URL: ${GAUZY_GITHUB_WEBHOOK_URL:-} GAUZY_GITHUB_WEBHOOK_SECRET: ${GAUZY_GITHUB_WEBHOOK_SECRET:-} GAUZY_GITHUB_APP_PRIVATE_KEY: ${GAUZY_GITHUB_APP_PRIVATE_KEY:-} GAUZY_GITHUB_APP_ID: ${GAUZY_GITHUB_APP_ID:-} GAUZY_GITHUB_APP_NAME: ${GAUZY_GITHUB_APP_NAME:-} GAUZY_GITHUB_POST_INSTALL_URL: ${GAUZY_GITHUB_POST_INSTALL_URL:-} GAUZY_GITHUB_OAUTH_CLIENT_ID: ${GAUZY_GITHUB_OAUTH_CLIENT_ID:-} GAUZY_GITHUB_OAUTH_CLIENT_SECRET: ${GAUZY_GITHUB_OAUTH_CLIENT_SECRET:-} GAUZY_GITHUB_OAUTH_CALLBACK_URL: ${GAUZY_GITHUB_OAUTH_CALLBACK_URL:-} MAGIC_CODE_EXPIRATION_TIME: ${MAGIC_CODE_EXPIRATION_TIME:-} APP_NAME: ${APP_NAME:-} APP_LOGO: ${APP_LOGO:-} APP_SIGNATURE: ${APP_SIGNATURE:-} APP_LINK: ${APP_LINK:-} APP_EMAIL_CONFIRMATION_URL: ${APP_EMAIL_CONFIRMATION_URL:-} APP_MAGIC_SIGN_URL: ${APP_MAGIC_SIGN_URL:-} COMPANY_LINK: ${COMPANY_LINK:-} COMPANY_NAME: ${COMPANY_NAME:-} env_file: - .env.compose entrypoint: "./entrypoint.compose.sh" command: ["node", "main.js"] restart: on-failure depends_on: db: condition: service_healthy zipkin: condition: service_started redis: condition: service_started minio: condition: service_started minio_create_buckets: condition: service_started elasticsearch: condition: service_healthy cube: condition: service_started links: - db:${DB_HOST:-db} - cube:${CUBE_HOST:-cube} - redis:${REDIS_HOST:-redis} - minio:${MINIO_HOST:-minio} - elasticsearch:${ES_HOST:-elasticsearch} # volumes: # - webapp_node_modules:/srv/gauzy/node_modules # - api_node_modules:/srv/gauzy/apps/api/node_modules ports: - "3000:${API_PORT:-3000}" networks: - overlay webapp: container_name: webapp image: ghcr.io/ever-co/ever-teams-webapp:latest # Runtime configuration: the image bakes nothing deployment-specific, so every variable below (NEXT_PUBLIC_* # and branding included) is read by the container at runtime; change it and recreate the container, no rebuild. # An empty value means unset (built-in default). Full reference: .env.docker environment: # This file starts a Gauzy API of its own (service "api" above), so the webapp points at it rather # than at Ever's SaaS: a `docker compose up` with no .env must not authenticate against # api.ever.team. The two values differ on purpose. The first is read inside this container, which # reaches the API by service name on the overlay network, on the container port, hence API_PORT. # The second is read by the browser, which reaches it through the published host port, fixed at # 3000 by the api service above. # # localhost in the public value assumes the browser runs on this host, which is the case this # file is for. Serving remote browsers means either publishing the API under a reachable origin # and setting NEXT_PUBLIC_GAUZY_API_SERVER_URL to it, or leaving that variable empty so the # browser calls the API through this app's own /api proxy on its own origin. GAUZY_API_SERVER_URL: ${GAUZY_API_SERVER_URL:-http://api:${API_PORT:-3000}} # No colon on purpose: an explicitly empty value stays empty (proxy mode, as described above); only an # unset variable gets the default. NEXT_PUBLIC_GAUZY_API_SERVER_URL: ${NEXT_PUBLIC_GAUZY_API_SERVER_URL-http://localhost:3000} NODE_ENV: ${NODE_ENV:-development} # Demo mode (password login with one-click demo accounts) only makes sense against a Gauzy API seeded # with the demo accounts (e.g. apidemo.ever.team). The previous image ignored this value (demo was baked # off), so it defaults to "false" to keep that behaviour; set NEXT_PUBLIC_DEMO=true to enable it. NEXT_PUBLIC_DEMO: ${NEXT_PUBLIC_DEMO:-false} # App Branding Variables APP_NAME: ${APP_NAME:-Ever Teams} APP_SIGNATURE: ${APP_SIGNATURE:-Ever Teams} APP_LOGO_URL: ${APP_LOGO_URL:-/assets/ever-teams.png} APP_LINK: ${APP_LINK:-https://app.ever.team} APP_SLOGAN_TEXT: ${APP_SLOGAN_TEXT:-Real-Time Clarity, Real-Time Reality™.} COMPANY_NAME: ${COMPANY_NAME:-Ever Co. LTD} COMPANY_LINK: ${COMPANY_LINK:-https://ever.co} TERMS_LINK: ${TERMS_LINK:-https://ever.team/tos} PRIVACY_POLICY_LINK: ${PRIVACY_POLICY_LINK:-https://ever.team/privacy} MAIN_PICTURE: ${MAIN_PICTURE:-/assets/cover/auth-bg-cover.png} MAIN_PICTURE_DARK: ${MAIN_PICTURE_DARK:-/assets/cover/auth-bg-cover-dark.png} # Site Metadata Variables NEXT_PUBLIC_SITE_NAME: ${NEXT_PUBLIC_SITE_NAME:-Ever Teams} NEXT_PUBLIC_SITE_TITLE: ${NEXT_PUBLIC_SITE_TITLE:-Open Work and Project Management Platform} NEXT_PUBLIC_SITE_DESCRIPTION: ${NEXT_PUBLIC_SITE_DESCRIPTION:-All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!} NEXT_PUBLIC_SITE_KEYWORDS: ${NEXT_PUBLIC_SITE_KEYWORDS:-time tracking, open-work, project management, software development, task management, team collaboration, agile, kanban, scrum, gantt chart, resource management, project management, work items tracking, agile, scrum, collaboration} NEXT_PUBLIC_WEB_APP_URL: ${NEXT_PUBLIC_WEB_APP_URL:-https://app.ever.team/} NEXT_PUBLIC_TWITTER_USERNAME: ${NEXT_PUBLIC_TWITTER_USERNAME:-ever-teams} # Hosts outside the list the image was built with are served without Next.js image optimization NEXT_PUBLIC_IMAGES_HOSTS: ${NEXT_PUBLIC_IMAGES_HOSTS:-dummyimage.com,res.cloudinary.com,gauzy.sfo2.digitaloceanspaces.com,cdn-icons-png.flaticon.com,api.gauzy.co,apida.gauzy.co,apicw.gauzy.co,apicivo.gauzy.co,apidev.gauzy.co,apidemo.gauzy.co,apidemocw.gauzy.co,apidemodt.gauzy.co,apidemodts.gauzy.co,apidemocivo.gauzy.co,apidemoda.gauzy.co,apistage.gauzy.co,apistagecivo.gauzy.co,apistagecw.gauzy.co,apistageda.gauzy.co,apistagedt.gauzy.co,apistagedts.gauzy.co,api.ever.team,app.ever.team,apidev.ever.team,gauzy.s3.wasabisys.com,gauzystage.s3.wasabisys.com} # OAuth Configuration NEXT_PUBLIC_GOOGLE_APP_NAME: ${NEXT_PUBLIC_GOOGLE_APP_NAME:-Ever Teams} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} # Also the slug of the GitHub App behind the GitHub integration, which offers no install link while it is empty # (Ever-operated: ever-github) NEXT_PUBLIC_GITHUB_APP_NAME: ${NEXT_PUBLIC_GITHUB_APP_NAME:-} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-} NEXT_PUBLIC_FACEBOOK_APP_NAME: ${NEXT_PUBLIC_FACEBOOK_APP_NAME:-Ever Teams} FACEBOOK_CLIENT_ID: ${FACEBOOK_CLIENT_ID:-} FACEBOOK_CLIENT_SECRET: ${FACEBOOK_CLIENT_SECRET:-} NEXT_PUBLIC_TWITTER_APP_NAME: ${NEXT_PUBLIC_TWITTER_APP_NAME:-Ever Teams} TWITTER_CLIENT_ID: ${TWITTER_CLIENT_ID:-} TWITTER_CLIENT_SECRET: ${TWITTER_CLIENT_SECRET:-} # Ever ID sign-in: off unless the app name, issuer, client id and client secret are all set (see .env.docker) NEXT_PUBLIC_EVER_ID_APP_NAME: ${NEXT_PUBLIC_EVER_ID_APP_NAME:-} EVER_ID_ISSUER_URL: ${EVER_ID_ISSUER_URL:-} EVER_ID_CLIENT_ID: ${EVER_ID_CLIENT_ID:-} EVER_ID_CLIENT_SECRET: ${EVER_ID_CLIENT_SECRET:-} EVER_PLATFORM_PROJECT_ID: ${EVER_PLATFORM_PROJECT_ID:-} EVER_ID_TEAMS_AUTO_PROVISION: ${EVER_ID_TEAMS_AUTO_PROVISION:-false} # Ever Platform (optional, see .env.docker): anonymous usage statistics (on unless false; silent unless the Gauzy # API serves teams in EVER_STATS_SERVES and its statistics are on) and the settings' connection parts (off) EVER_STATS_ENABLED: ${EVER_STATS_ENABLED:-} EVER_STATS_API_URL: ${EVER_STATS_API_URL:-} EVER_INSTALL_SOURCE: ${EVER_INSTALL_SOURCE:-} EVER_STATS_COUNTRY: ${EVER_STATS_COUNTRY:-} EVER_INSTANCE_ID: ${EVER_INSTANCE_ID:-} EVER_STATS_PRIVATE_KEY: ${EVER_STATS_PRIVATE_KEY:-} NEXT_PUBLIC_EVER_CONNECT_ENABLED: ${NEXT_PUBLIC_EVER_CONNECT_ENABLED:-} # Additional Configuration NEXT_PUBLIC_CAPTCHA_TYPE: ${NEXT_PUBLIC_CAPTCHA_TYPE:-recaptcha} NEXT_PUBLIC_CAPTCHA_SITE_KEY: ${NEXT_PUBLIC_CAPTCHA_SITE_KEY:-} NEXT_PUBLIC_MEET_TYPE: ${NEXT_PUBLIC_MEET_TYPE:-Jitsi} # Your Jitsi server domain (Ever-operated: meet.ever.team) NEXT_PUBLIC_MEET_DOMAIN: ${NEXT_PUBLIC_MEET_DOMAIN:-} LIVEKIT_API_SECRET: ${LIVEKIT_API_SECRET:-} LIVEKIT_API_KEY: ${LIVEKIT_API_KEY:-} NEXT_PUBLIC_LIVEKIT_URL: ${NEXT_PUBLIC_LIVEKIT_URL:-} INVITE_CALLBACK_URL: ${INVITE_CALLBACK_URL:-} VERIFY_EMAIL_CALLBACK_URL: ${VERIFY_EMAIL_CALLBACK_URL:-} SMTP_PORT: ${SMTP_PORT:-587} NEXT_PUBLIC_DISABLE_AUTO_REFRESH: ${NEXT_PUBLIC_DISABLE_AUTO_REFRESH:-false} # false turns team presence (Online / Idle badges and their heartbeat) off; empty = on NEXT_PUBLIC_EMPLOYEE_PRESENCE_ENABLED: ${NEXT_PUBLIC_EMPLOYEE_PRESENCE_ENABLED:-} SENTRY_LOG_LEVEL: ${SENTRY_LOG_LEVEL:-error} NEXT_PUBLIC_SENTRY_DSN: ${NEXT_PUBLIC_SENTRY_DSN:-} NEXT_PUBLIC_POSTHOG_KEY: ${NEXT_PUBLIC_POSTHOG_KEY:-} NEXT_PUBLIC_POSTHOG_HOST: ${NEXT_PUBLIC_POSTHOG_HOST:-} # The next 3 are build-time settings: no effect on the running prebuilt image NEXT_IGNORE_ESLINT_ERROR_ON_BUILD: ${NEXT_IGNORE_ESLINT_ERROR_ON_BUILD:-true} ANALYZE: ${ANALYZE:-false} RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED: ${RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED:-false} LOG_FOLDER_MAX_SIZE: ${LOG_FOLDER_MAX_SIZE:-10} NEXT_PUBLIC_LOG_FOLDER_MAX_SIZE: ${NEXT_PUBLIC_LOG_FOLDER_MAX_SIZE:-10} ACTIVE_LOCAL_LOG_SYSTEM: ${ACTIVE_LOCAL_LOG_SYSTEM:-false} NEXT_PUBLIC_ACTIVE_LOCAL_LOG_SYSTEM: ${NEXT_PUBLIC_ACTIVE_LOCAL_LOG_SYSTEM:-false} IS_DESKTOP_APP: ${IS_DESKTOP_APP:-false} # Desktop app download link of the empty screenshots, apps and visited sites sections; empty = no link NEXT_PUBLIC_DESKTOP_APP_DOWNLOAD_URL: ${NEXT_PUBLIC_DESKTOP_APP_DOWNLOAD_URL:-} # Board and Firebase: your own whiteboard deployment; empty = whiteboard off (Ever-operated: # https://board.ever.team and https://jsonboard.ever.team/api/v2/post/) NEXT_PUBLIC_BOARD_APP_DOMAIN: ${NEXT_PUBLIC_BOARD_APP_DOMAIN:-} NEXT_PUBLIC_BOARD_BACKEND_POST_URL: ${NEXT_PUBLIC_BOARD_BACKEND_POST_URL:-} NEXT_PUBLIC_BOARD_FIREBASE_CONFIG: ${NEXT_PUBLIC_BOARD_FIREBASE_CONFIG:-} # Analytics and Tracking NEXT_PUBLIC_GA_MEASUREMENT_ID: ${NEXT_PUBLIC_GA_MEASUREMENT_ID:-} NEXT_PUBLIC_JITSU_BROWSER_URL: ${NEXT_PUBLIC_JITSU_BROWSER_URL:-} NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY: ${NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY:-} NEXT_PUBLIC_CHATWOOT_API_KEY: ${NEXT_PUBLIC_CHATWOOT_API_KEY:-} # Cookie Configuration (not read: the app sets host-only cookies) NEXT_PUBLIC_COOKIE_DOMAINS: ${NEXT_PUBLIC_COOKIE_DOMAINS:-} # Server Configuration JITSU_SERVER_URL: ${JITSU_SERVER_URL:-} JITSU_SERVER_WRITE_KEY: ${JITSU_SERVER_WRITE_KEY:-} AUTH_SECRET: ${AUTH_SECRET:-} # AUTH_URL (public origin for next-auth OAuth callbacks behind a proxy): set it in .env.compose. It is not # listed here on purpose: an empty value here would override the env_file one (and NEXTAUTH_URL). CAPTCHA_SECRET_KEY: ${CAPTCHA_SECRET_KEY:-} SMTP_FROM_ADDRESS: ${SMTP_FROM_ADDRESS:-} SMTP_HOST: ${SMTP_HOST:-} SMTP_SECURE: ${SMTP_SECURE:-true} SMTP_USERNAME: ${SMTP_USERNAME:-} SMTP_PASSWORD: ${SMTP_PASSWORD:-} MEET_JWT_APP_ID: ${MEET_JWT_APP_ID:-} MEET_JWT_APP_SECRET: ${MEET_JWT_APP_SECRET:-} SENTRY_ORG: ${SENTRY_ORG:-} SENTRY_PROJECT: ${SENTRY_PROJECT:-} SENTRY_AUTH_TOKEN: ${SENTRY_AUTH_TOKEN:-} NEXT_PUBLIC_SENTRY_DEBUG: ${NEXT_PUBLIC_SENTRY_DEBUG:-false} POSTMARK_SERVER_API_TOKEN: ${POSTMARK_SERVER_API_TOKEN:-} MAILCHIMP_API_KEY: ${MAILCHIMP_API_KEY:-} MAILCHIMP_LIST_ID: ${MAILCHIMP_LIST_ID:-} env_file: - .env.compose restart: on-failure links: - db:${DB_HOST:-db} - api:${API_HOST:-api} - cube:${CUBE_HOST:-cube} - redis:${REDIS_HOST:-redis} - minio:${MINIO_HOST:-minio} - elasticsearch:${ES_HOST:-elasticsearch} depends_on: db: condition: service_healthy redis: condition: service_started minio: condition: service_started minio_create_buckets: condition: service_started elasticsearch: condition: service_healthy api: condition: service_started # volumes: # - webapp_node_modules:/srv/gauzy/node_modules ports: - "3030:${UI_PORT:-3030}" networks: - overlay