Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
261 lines (258 loc) · 14.6 KB
/
Copy pathdocker-compose.yml
File metadata and controls
261 lines (258 loc) · 14.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
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}
# Prints sign-in codes and e-mail links on this API's console, so the stack works without a mail server. The API
# honours it only with NODE_ENV=development and both base URLs on localhost; set it to false to turn it off
PRINT_EMAIL_CODES: ${PRINT_EMAIL_CODES:-true}
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}
# Demo mode only: where the demo banner sends people to open a real account (unset = APP_LINK + /auth/signup)
NEXT_PUBLIC_DEMO_SIGN_UP_URL: ${NEXT_PUBLIC_DEMO_SIGN_UP_URL:-}
# 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:-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:-}
# App switcher links (id=url pairs separated by commas); empty = no app switcher
NEXT_PUBLIC_EVER_APP_LINKS: ${NEXT_PUBLIC_EVER_APP_LINKS:-}
# 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