-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathcompose.yml
More file actions
284 lines (267 loc) · 8.25 KB
/
compose.yml
File metadata and controls
284 lines (267 loc) · 8.25 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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
---
services:
# Main application service (build with: docker bake app)
app:
image: ghcr.io/netresearch/timetracker:production
environment:
- TRUSTED_PROXY_ALL
- TRUSTED_PROXY_LIST
- APP_ENV=${APP_ENV:-prod}
- APP_DEBUG=${APP_DEBUG:-0}
volumes:
# Production volumes (named volumes for data persistence)
- app-pub:/var/www/html/public
- app-cache:/var/www/html/var/cache
- app-logs:/var/www/html/var/log
depends_on:
- db
restart: always
profiles:
- prod
- production
# Development app service (build with: docker bake app-dev)
# LDAP and other config read from .env files (Symfony dotenv)
app-dev:
image: ghcr.io/netresearch/timetracker:dev
environment:
- APP_ENV=dev
- APP_DEBUG=1
- TRUSTED_PROXY_ALL
- TRUSTED_PROXY_LIST
volumes:
# Development volumes (bind mounts for live editing)
- .:/var/www/html
- ./public:/var/www/html/public
- ./var/cache:/var/www/html/var/cache
- ./var/log:/var/www/html/var/log
- /usr/local/share/ca-certificates/:/usr/local/share/ca-certificates/host
# PHP test config with increased memory limit (2G)
- ./docker/php/test.ini:/usr/local/etc/php/conf.d/99-test.ini:ro
depends_on:
- db
- db-test
restart: "no"
profiles:
- dev
- development
# Development tools service (build with: docker bake app-tools)
# Static analysis, linting - no DB dependencies
app-tools:
image: ghcr.io/netresearch/timetracker:tools
environment:
- APP_ENV=${APP_ENV:-dev}
- APP_DEBUG=${APP_DEBUG:-1}
volumes:
# Tools volumes (bind mounts for source code access only)
- .:/var/www/html
- ./var/cache:/var/www/html/var/cache
- ./var/log:/var/www/html/var/log
# PHP test config with increased memory limit (2G)
- ./docker/php/test.ini:/usr/local/etc/php/conf.d/99-test.ini:ro
restart: "no"
profiles:
- tools
- dev-tools
# Production web server
httpd:
image: nginx:1.28-alpine
volumes:
- app-pub:/var/www/html/public
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
restart: always
ports:
- ${HTTP_PORT:-8765}:80
profiles:
- prod
- production
# Development web server
httpd-dev:
image: nginx:1.28-alpine
volumes:
- ./public:/var/www/html/public
- ./docker/nginx/dev.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app-dev
restart: "no"
ports:
- ${HTTP_PORT:-8765}:80
profiles:
- dev
- development
# Production database
db:
image: mariadb:12.1
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD:-global123}
- MYSQL_USER=${DB_USER:-timetracker}
- MYSQL_PASSWORD=${DB_PASSWORD:-timetracker}
- MYSQL_DATABASE=${DB_NAME:-timetracker}
volumes:
- db-data:/var/lib/mysql
- ./sql/full.sql:/docker-entrypoint-initdb.d/001_full.sql
# Test data for dev/E2E testing (fixed date 2024-01-15 for deterministic tests)
- ./sql/testdata.sql:/docker-entrypoint-initdb.d/002_testdata.sql
restart: always
profiles:
- prod
- production
- dev
- development
- test
# Test database (for unit/integration tests)
db-test:
image: mariadb:12.1
environment:
- MYSQL_ROOT_PASSWORD=${TEST_DB_ROOT_PASSWORD:-global123}
- MYSQL_USER=${TEST_DB_USER:-unittest}
- MYSQL_PASSWORD=${TEST_DB_PASSWORD:-unittest}
- MYSQL_DATABASE=${TEST_DB_NAME:-unittest}
volumes:
- db-test-data:/var/lib/mysql
- ./sql/unittest/001_testtables.sql:/docker-entrypoint-initdb.d/001_testtables.sql
- ./sql/unittest/002_testdata.sql:/docker-entrypoint-initdb.d/002_testdata.sql
restart: always
healthcheck:
test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD || mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD"]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
profiles:
- dev
- development
- test
# Unit test database (for PHPUnit tests)
db_unittest:
image: mariadb:12.1
environment:
- MYSQL_ROOT_PASSWORD=${UNITTEST_DB_ROOT_PASSWORD:-global123}
- MYSQL_USER=${UNITTEST_DB_USER:-unittest}
- MYSQL_PASSWORD=${UNITTEST_DB_PASSWORD:-unittest}
- MYSQL_DATABASE=${UNITTEST_DB_NAME:-unittest}
volumes:
- db-unittest-data:/var/lib/mysql
- ./sql/unittest/001_testtables.sql:/docker-entrypoint-initdb.d/001_testtables.sql
- ./sql/unittest/002_testdata.sql:/docker-entrypoint-initdb.d/002_testdata.sql
restart: always
profiles:
- dev
- development
- test
# E2E test database (separate from dev to avoid data conflicts)
db-e2e:
image: mariadb:12.1
environment:
- MYSQL_ROOT_PASSWORD=${E2E_DB_ROOT_PASSWORD:-global123}
- MYSQL_USER=${E2E_DB_USER:-timetracker}
- MYSQL_PASSWORD=${E2E_DB_PASSWORD:-timetracker}
- MYSQL_DATABASE=${E2E_DB_NAME:-timetracker}
volumes:
- db-e2e-data:/var/lib/mysql
- ./sql/full.sql:/docker-entrypoint-initdb.d/001_full.sql
- ./sql/testdata.sql:/docker-entrypoint-initdb.d/002_testdata.sql
restart: "no"
healthcheck:
test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD"]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
profiles:
- e2e
# E2E test app service (build with: docker bake app-e2e)
# Uses separate db-e2e to avoid conflicts with dev database
app-e2e:
image: ghcr.io/netresearch/timetracker:e2e
environment:
- APP_ENV=test
- APP_DEBUG=1
- TRUSTED_PROXY_ALL
- TRUSTED_PROXY_LIST
# Frozen time for deterministic E2E tests - matches test data in sql/testdata.sql
- APP_FROZEN_TIME=2024-01-15 12:00:00
# Use separate E2E database to avoid conflicts with dev
- DATABASE_URL=mysql://timetracker:timetracker@db-e2e:3306/timetracker?serverVersion=mariadb-12.1.0&charset=utf8mb4
# Coverage collection (set COVERAGE_ENABLED=1 XDEBUG_MODE=coverage to enable)
- COVERAGE_ENABLED=${COVERAGE_ENABLED:-0}
- XDEBUG_MODE=${XDEBUG_MODE:-off}
volumes:
- .:/var/www/html
- ./public:/var/www/html/public
- ./var/cache:/var/www/html/var/cache
- ./var/log:/var/www/html/var/log
depends_on:
- db-e2e
- ldap-dev
restart: "no"
profiles:
- e2e
# E2E test web server (port 8766 to avoid conflict with dev)
httpd-e2e:
image: nginx:1.28-alpine
volumes:
- ./public:/var/www/html/public
- ./docker/nginx/e2e.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app-e2e
restart: "no"
ports:
- ${E2E_HTTP_PORT:-8766}:80
profiles:
- e2e
# Development LDAP server
ldap-dev:
image: osixia/openldap:1.5.0
environment:
- LDAP_ORGANISATION=Development Company
- LDAP_DOMAIN=dev.local
- LDAP_BASE_DN=dc=dev,dc=local
- LDAP_ADMIN_PASSWORD=admin123
- LDAP_READONLY_USER=true
- LDAP_READONLY_USER_USERNAME=readuser
- LDAP_READONLY_USER_PASSWORD=readuser
# Keep bootstrap files instead of deleting them after processing
- LDAP_REMOVE_CONFIG_AFTER_SETUP=false
volumes:
- ldap-dev-data:/var/lib/ldap
- ldap-dev-config:/etc/ldap/slapd.d
# Copy LDIF to a directory that allows modification (use entrypoint to copy)
- ./docker/ldap/users-only.ldif:/ldif-source/users.ldif:ro
entrypoint: ["/bin/bash", "-c", "cp /ldif-source/users.ldif /container/service/slapd/assets/config/bootstrap/ldif/custom/users.ldif 2>/dev/null || true && exec /container/tool/run"]
ports:
- "3389:389"
restart: "no"
profiles:
- dev
- development
- test
- e2e
networks:
default:
driver: "bridge"
volumes:
# Production volumes
app-pub:
driver: local
app-cache:
driver: local
app-logs:
driver: local
db-data:
driver: local
# Test volumes
db-test-data:
driver: local
# Unit test volume
db-unittest-data:
driver: local
# E2E test volume (separate from dev)
db-e2e-data:
driver: local
# Development LDAP volumes
ldap-dev-data:
driver: local
ldap-dev-config:
driver: local