The first deployments died building on the target: four images, and the webmail build alone was enough to sink it on a small arm64 host - the build step was killed with no BuildKit error, which is what an exhausted or overloaded machine looks like from the outside. The images already exist. CI publishes all four to GHCR for amd64 and arm64 on every merge, and they are the ones the suite ran against, so rebuilding them on the deploy target is slower, heavier and less trustworthy than pulling them. docker-compose.yaml therefore carries no build definitions, and docker-compose.build.yaml is the overlay that adds them for local development and for CI - which does have to exercise the branch rather than the published images. Both paths were run before committing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
59 lines
2.2 KiB
Makefile
59 lines
2.2 KiB
Makefile
.PHONY: up down logs test lint migrate-up migrate-down gen-dev-cert seed preflight create-admin reset-password
|
|
|
|
# Local development builds from source; production pulls what CI published.
|
|
up:
|
|
docker compose -f docker-compose.yaml -f docker-compose.build.yaml --env-file .env up --build
|
|
|
|
down:
|
|
docker compose down -v
|
|
|
|
logs:
|
|
docker compose logs -f
|
|
|
|
test:
|
|
cd services/protocols && go test ./...
|
|
cd services/auth && npm test
|
|
cd services/storage && npm test
|
|
cd services/webmail && npm test
|
|
|
|
lint:
|
|
cd services/protocols && go vet ./...
|
|
node scripts/lang-lint.mjs
|
|
|
|
migrate-up:
|
|
docker run --rm -v $(PWD)/migrations:/migrations --network host \
|
|
migrate/migrate -path=/migrations -database "$$DATABASE_URL" up
|
|
|
|
migrate-down:
|
|
docker run --rm -v $(PWD)/migrations:/migrations --network host \
|
|
migrate/migrate -path=/migrations -database "$$DATABASE_URL" down 1
|
|
|
|
gen-dev-cert:
|
|
mkdir -p local/certs
|
|
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
|
|
-keyout local/certs/key.pem -out local/certs/cert.pem \
|
|
-days 365 -nodes -subj "/CN=mail.localhost"
|
|
|
|
seed:
|
|
docker compose exec -T db psql -U $${POSTGRES_USER:-lambdamail} -d $${POSTGRES_DB:-lambdamail} < scripts/dev-seed.sql
|
|
|
|
# Environment diagnostics (PLAN.md section 15). Run this before pointing DNS at
|
|
# the host: it reports outbound port 25, PTR/FCrDNS, RBL listings and the
|
|
# Cloudflare token scope.
|
|
preflight:
|
|
docker compose run --rm --entrypoint /app/lambdamail-protocols protocols preflight
|
|
|
|
# First login on a fresh deployment. Nothing else creates a mailbox, so without
|
|
# this there is no way into the admin console.
|
|
# make create-admin EMAIL=you@example.com PASSWORD='...'
|
|
create-admin:
|
|
@test -n "$(EMAIL)" || (echo "EMAIL is required" && exit 1)
|
|
@test -n "$(PASSWORD)" || (echo "PASSWORD is required" && exit 1)
|
|
docker compose run --rm --entrypoint node auth dist/cli.js create-admin "$(EMAIL)" "$(PASSWORD)"
|
|
|
|
# Recovers a locked-out account. Every session it had is signed out.
|
|
reset-password:
|
|
@test -n "$(EMAIL)" || (echo "EMAIL is required" && exit 1)
|
|
@test -n "$(PASSWORD)" || (echo "PASSWORD is required" && exit 1)
|
|
docker compose run --rm --entrypoint node auth dist/cli.js reset-password "$(EMAIL)" "$(PASSWORD)"
|