Repository navigation
Expand file tree
/
Copy pathcompose.dev.yaml
More file actions
145 lines (139 loc) · 5.31 KB
/
Copy pathcompose.dev.yaml
File metadata and controls
145 lines (139 loc) · 5.31 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
services:
web:
build:
context: ./apps/web
dockerfile: Dockerfile.dev
# Faz o contêiner parado encerrar na hora no `down`.
init: true
ports:
- "3000:3000"
volumes:
- ./apps/web:/app
environment:
# A web chama a API sempre pelo servidor, pelo nome do serviço.
API_URL: http://api:3000
# O ambiente local usa HTTP, e o navegador descartaria um cookie `Secure`.
COOKIE_SECURE: "false"
# Autoriza a web a repassar à API o IP do navegador. É o mesmo valor do apps/api/.env.example.
INTERNAL_API_SECRET: segredo-interno-so-do-ambiente-local
healthcheck:
# O arquivo é criado quando a instalação das dependências termina.
test: ["CMD", "test", "-f", "/tmp/web-ready"]
interval: 5s
timeout: 3s
retries: 5
start_period: 10m
# Durante a preparação, confere a cada segundo, para o `up --wait` não esperar à toa.
start_interval: 1s
api:
build:
context: ./apps/api
dockerfile: Dockerfile.dev
init: true
ports:
# Na máquina a API fica na 3001; entre contêineres, em http://api:3000.
- "3001:3000"
volumes:
- ./apps/api:/app
# O repositório inteiro, só para leitura, para o Node do harness (scripts/node-in-api.sh) ler
# os scripts, os arquivos de aceite e os relatórios das apps sem cópia. As escritas continuam
# em /app.
- .:/repo:ro
# O .git do repositório fica coberto por uma pasta vazia: nada no contêiner usa o Git, e assim o
# histórico, os hooks e a configuração dele ficam fora do alcance do que roda aqui.
- type: tmpfs
target: /repo/.git
read_only: true
depends_on:
# As migrações rodam na subida do contêiner, então o banco precisa aceitar conexões antes.
postgres:
condition: service_healthy
mailpit:
condition: service_started
storage:
condition: service_healthy
healthcheck:
# O arquivo é criado no fim da preparação (dependências, .env, chaves e migrações).
test: ["CMD", "test", "-f", "/tmp/api-ready"]
interval: 5s
timeout: 3s
retries: 5
start_period: 10m
# Durante a preparação, confere a cada segundo, para o `up --wait` não esperar à toa.
start_interval: 1s
playwright:
# Os navegadores vêm na imagem. A versão é a mesma do `@playwright/test` do
# apps/web/package.json: ao atualizar uma, atualize a outra.
image: mcr.microsoft.com/playwright:v1.64.0-noble
init: true
# O Chromium usa memória compartilhada, e os 64 MB padrão do Docker não bastam para a suíte em paralelo.
ipc: host
# O mesmo usuário do contêiner `web`, para os relatórios não nascerem como root na máquina.
user: "1000:1000"
working_dir: /app
volumes:
- ./apps/web:/app
environment:
WEB_URL: http://web:3000
MAILPIT_URL: http://mailpit:8025
# O banco da API que a web usa, para os testes gravarem Itens como preparação até o
# upload existir (apps/web/AGENTS.md, "Testes no navegador").
DATABASE_URL: postgresql://app:app@postgres:5432/app
# A API, para os testes criarem o envio e pedirem a URL de leitura (POST /uploads e GET /items/{id}/download-url).
API_URL: http://api:3000
depends_on:
# Usa a `node_modules` que o contêiner `web` instala.
web:
condition: service_healthy
mailpit:
condition: service_started
postgres:
condition: service_healthy
# Fica parado, como `web` e `api`. Os testes são rodados com `docker compose exec`.
command: ["tail", "-f", "/dev/null"]
postgres:
image: postgres:17
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
# Por TCP, e não pelo socket: na primeira subida a imagem roda um servidor
# temporário, só no socket, para criar o banco, e ele ainda não é o definitivo.
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U app -d app"]
interval: 5s
timeout: 3s
retries: 5
start_period: 1m
start_interval: 1s
mailpit:
image: axllent/mailpit:v1.30
ports:
# Tela e API HTTP dos e-mails capturados. O SMTP (1025) só é usado entre contêineres.
- "8025:8025"
storage:
# Emulador do Cloud Storage. A versão é fixa: o comportamento do emulador está medido
# contra ela (docs/lld.md, seção 4.6).
image: fsouza/fake-gcs-server:1.56.1
init: true
ports:
# É a porta que o navegador de quem desenvolve alcança (STORAGE_PUBLIC_URL).
- "4443:4443"
# O emulador monta o endereço da sessão e serve a URL assinada pelo `Host` da requisição,
# e só atende a URL assinada quando ele é o `-public-host`. O bucket nasce da pasta
# /data/app-files, que o entrypoint cria antes de iniciar o emulador.
entrypoint:
- sh
- -c
- mkdir -p /data/app-files && exec /bin/fake-gcs-server -data /data -scheme http -backend memory -port 4443 -public-host localhost:4443
healthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:4443/storage/v1/b/app-files"]
interval: 5s
timeout: 3s
retries: 5
start_period: 30s
start_interval: 1s
volumes:
postgres-data: