-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
136 lines (113 loc) · 4.58 KB
/
Copy pathMakefile
File metadata and controls
136 lines (113 loc) · 4.58 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
# Makefile
.PHONY: dev dev-frontend dev-all up down full full-down build migrate-up migrate-down migrate-create sqlc test test-db seed backup backup-full restore restore-db backup-list backup-before-deploy
# Start Docker services (db + redis only)
up:
docker compose up -d
# Stop Docker services
down:
docker compose down
# Run API in development mode (db + redis in Docker, API locally)
dev: up
cd api && go run main.go
# Run web frontend in development mode
dev-frontend:
cd web && pnpm dev
# Run backend + frontend in parallel (db + redis in Docker)
dev-all: up
$(MAKE) dev & $(MAKE) dev-frontend
# Start full stack in Docker (db + redis + backend)
full:
docker compose --profile full up -d --build
# Stop full stack
full-down:
docker compose --profile full down
# Build backend Docker image
build:
docker compose --profile full build
# Run migrations up
migrate-up: up
cd api && goose -dir db/migrations postgres "$(DATABASE_URL)" up
# Run migrations down one step
migrate-down:
cd api && goose -dir db/migrations postgres "$(DATABASE_URL)" down
# Create a new migration
migrate-create:
cd api && goose -dir db/migrations create $(name) sql
# Generate sqlc code
sqlc:
cd api && sqlc generate
# Create test database (idempotent — safe to run repeatedly)
test-db: up
@echo "Creating test database..."
@docker compose exec -T db psql -U courtcommand -d postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'courtcommand_test'" | grep -q 1 || \
docker compose exec -T db psql -U courtcommand -d postgres -c "CREATE DATABASE courtcommand_test OWNER courtcommand;"
@echo "Test database ready."
# Run tests (creates test-db first, migrations run automatically via TestDB)
test: test-db
cd api && go test ./... -v -count=1
# Seed development data (all entity types — run after migrations)
seed: up
@echo "Seeding development data..."
docker compose exec -T db psql -U courtcommand -d courtcommand < api/db/seed.sql
@echo "Done! Login with admin@courtcommand.com / TestPass123!"
# ---- Backup & Restore ----
# Backup database only (quick, for routine saves)
backup:
@mkdir -p backups
@TIMESTAMP=$$(date +%Y%m%d-%H%M%S); \
docker compose exec -T db pg_dump -U courtcommand courtcommand > backups/db-$$TIMESTAMP.sql && \
echo "Database backup: backups/db-$$TIMESTAMP.sql ($$(wc -c < backups/db-$$TIMESTAMP.sql | tr -d ' ') bytes)"
# Full backup: database + uploaded files (for before deploys or major changes)
backup-full:
@mkdir -p backups
@TIMESTAMP=$$(date +%Y%m%d-%H%M%S); \
docker compose exec -T db pg_dump -U courtcommand courtcommand > backups/db-$$TIMESTAMP.sql && \
echo "Database backup: backups/db-$$TIMESTAMP.sql"; \
if [ -d api/uploads ] && [ "$$(ls -A api/uploads 2>/dev/null)" ]; then \
tar czf backups/uploads-$$TIMESTAMP.tar.gz -C api uploads && \
echo "Uploads backup: backups/uploads-$$TIMESTAMP.tar.gz"; \
else \
echo "No uploads to backup"; \
fi; \
echo "Full backup complete: $$TIMESTAMP"
# Pre-deploy backup (alias — always run before deploying updates)
backup-before-deploy: backup-full
@echo "Pre-deploy backup complete. Safe to deploy."
# Restore database from a backup file (usage: make restore-db FILE=backups/db-20260417-123456.sql)
restore-db:
@if [ -z "$(FILE)" ]; then \
echo "Usage: make restore-db FILE=backups/db-YYYYMMDD-HHMMSS.sql"; \
echo "Available backups:"; \
ls -la backups/db-*.sql 2>/dev/null || echo " No database backups found"; \
exit 1; \
fi
@echo "WARNING: This will replace ALL data in the database with the backup."
@echo "File: $(FILE)"
@read -p "Type YES to confirm: " confirm; \
if [ "$$confirm" = "YES" ]; then \
docker compose exec -T db psql -U courtcommand -d courtcommand -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" && \
docker compose exec -T db psql -U courtcommand courtcommand < $(FILE) && \
echo "Database restored from $(FILE)"; \
else \
echo "Restore cancelled."; \
fi
# Restore uploads from a backup file (usage: make restore-uploads FILE=backups/uploads-20260417-123456.tar.gz)
restore-uploads:
@if [ -z "$(FILE)" ]; then \
echo "Usage: make restore-uploads FILE=backups/uploads-YYYYMMDD-HHMMSS.tar.gz"; \
echo "Available backups:"; \
ls -la backups/uploads-*.tar.gz 2>/dev/null || echo " No upload backups found"; \
exit 1; \
fi
@echo "Restoring uploads from $(FILE)..."
@tar xzf $(FILE) -C api/ && echo "Uploads restored."
# List all available backups
backup-list:
@echo "=== Database Backups ==="
@ls -lh backups/db-*.sql 2>/dev/null || echo " None"
@echo ""
@echo "=== Upload Backups ==="
@ls -lh backups/uploads-*.tar.gz 2>/dev/null || echo " None"
# Include .env if it exists
-include .env
export