-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
184 lines (156 loc) · 7.16 KB
/
Copy pathMakefile
File metadata and controls
184 lines (156 loc) · 7.16 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
# Hermes — Developer Makefile (Podman + OCI images)
#
# Goals:
# - Clean, easy dev workflow using podman-compose and OCI images for dependencies
# - Keep the app fast to iterate: run Hermes locally; run MinIO and Postgres in containers
# - One-liners to bring stack up/down and provision a demo provider/bucket
#
# Requirements: podman, podman-compose, curl, jq
# Optional: golang for local build/run (recommended)
SHELL := /bin/bash
# -------- Configurable vars (override via: make run HTTP_PORT=8090) --------
HTTP_PORT ?= 8080
APP_ENV ?= dev
# DB: use Postgres in containers by default
PGHOST ?= 127.0.0.1
PGPORT ?= 5432
PGDATABASE?= hermes
PGUSER ?= hermes
PGPASSWORD?= hermes
DATABASE_URL ?= postgres://$(PGUSER):$(PGPASSWORD)@$(PGHOST):$(PGPORT)/$(PGDATABASE)?sslmode=disable
DB_DRIVER ?= postgres
# Static assets served from disk (no embed)
STATIC_DIR ?= web/dist
# MinIO
MINIO_ROOT_USER ?= minioadmin
MINIO_ROOT_PASSWORD ?= minioadmin
MINIO_API_PORT ?= 9000
MINIO_CONSOLE_PORT ?= 9001
# Helper
PYC := podman-compose
CURL := curl -sS
JQ := jq -r
# API base (for curl helpers)
API := http://127.0.0.1:$(HTTP_PORT)/api/v1
# Default help target
.PHONY: help
help:
@echo "Hermes Developer Makefile (Podman)"
@echo
@echo "Common targets:"
@echo " make dev-up # Start Postgres + MinIO via podman-compose"
@echo " make dev-down # Stop and remove containers"
@echo " make dev-logs # Tail container logs"
@echo " make run # Run Hermes locally (uses Postgres & StaticDir)"
@echo " make wait-server # Wait until Hermes /health is up"
@echo " make provision-minio # Create a 'Local MinIO' provider via API"
@echo " make demo-bucket # Create demo bucket via API"
@echo " make demo-upload # Upload sample object via API"
@echo
@echo "Config vars (override on command line): HTTP_PORT=$(HTTP_PORT) DB_DRIVER=$(DB_DRIVER) DATABASE_URL=$(DATABASE_URL) STATIC_DIR=$(STATIC_DIR)"
# -------- Dev stack (Podman Compose) --------
.PHONY: dev-up dev-down dev-logs dev-status
dev-up:
MINIO_ROOT_USER=$(MINIO_ROOT_USER) MINIO_ROOT_PASSWORD=$(MINIO_ROOT_PASSWORD) \
PGDATABASE=$(PGDATABASE) PGUSER=$(PGUSER) PGPASSWORD=$(PGPASSWORD) \
$(PYC) up -d
@echo "MinIO: http://127.0.0.1:$(MINIO_API_PORT) (console: http://127.0.0.1:$(MINIO_CONSOLE_PORT))"
@echo "Postgres: $(PGHOST):$(PGPORT)/$(PGDATABASE) user=$(PGUSER)"
# Gracefully stop and remove containers
dev-down:
$(PYC) down
# Tail both logs
# Use: make dev-logs S=minio (or S=postgres)
dev-logs:
@if [ "$(S)" = "minio" ]; then podman logs -f hermes-minio; \
elif [ "$(S)" = "postgres" ]; then podman logs -f hermes-postgres; \
else echo "Set S=minio or S=postgres"; fi
# Quick status info
dev-status:
@podman ps --filter name=hermes-
@echo "MinIO health: $$($(CURL) -o /dev/null -w '%{http_code}' http://127.0.0.1:$(MINIO_API_PORT)/minio/health/ready || true)"
# -------- App build/run/test (local) --------
.PHONY: build test run clean
# Version from git tag or env (fallback to dev)
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
LDFLAGS := -s -w -X github.com/arencloud/hermes/internal/version.Version=$(VERSION)
build:
@echo "Building Hermes (version $(VERSION))…"
GOFLAGS= go build -ldflags '$(LDFLAGS)' -o server ./cmd/server
run: build
APP_ENV=$(APP_ENV) HTTP_PORT=$(HTTP_PORT) \
DB_DRIVER=$(DB_DRIVER) DATABASE_URL='$(DATABASE_URL)' \
STATIC_DIR=$(STATIC_DIR) \
./server
test:
go test ./...
clean:
rm -f server
# -------- Helpers: wait and provision via API --------
.PHONY: wait-server wait-minio provision-minio demo-bucket demo-upload
wait-server:
@echo -n "Waiting for Hermes at http://127.0.0.1:$(HTTP_PORT)/health "; \
for i in $$(seq 1 60); do \
code=$$($(CURL) -o /dev/null -w '%{http_code}' http://127.0.0.1:$(HTTP_PORT)/health || true); \
if [ "$$code" = "200" ]; then echo "OK"; exit 0; fi; \
echo -n "."; sleep 1; \
done; echo " timeout"; exit 1
wait-minio:
@echo -n "Waiting for MinIO at http://127.0.0.1:$(MINIO_API_PORT) "; \
for i in $$(seq 1 60); do \
code=$$($(CURL) -o /dev/null -w '%{http_code}' http://127.0.0.1:$(MINIO_API_PORT)/minio/health/ready || true); \
if [[ "$$code" =~ ^(200|405)$$ ]]; then echo "OK"; exit 0; fi; \
echo -n "."; sleep 1; \
done; echo " timeout"; exit 1
# Create or find a provider that points to local MinIO
provision-minio: wait-server wait-minio
@echo "Provisioning Local MinIO provider via Hermes API…"
@set -e; \
BODY=$$(jq -n --arg name "Local MinIO" \
--arg typ "minio" \
--arg endpoint "127.0.0.1:$(MINIO_API_PORT)" \
--arg ak "$(MINIO_ROOT_USER)" \
--arg sk "$(MINIO_ROOT_PASSWORD)" \
--arg region "" \
--argjson useSSL false \
'{name:$$name, type:$$typ, endpoint:$$endpoint, accessKey:$$ak, secretKey:$$sk, region:$$region, useSSL:$$useSSL}'); \
EXIST=$$($(CURL) $(API)/providers | $(JQ) '.[] | select(.name=="Local MinIO") | .id' | head -n1 || true); \
if [ -n "$$EXIST" ] && [ "$$EXIST" != "null" ]; then echo "Provider exists (id=$$EXIST)"; exit 0; fi; \
RESP=$$($(CURL) -w "\n%{http_code}" -H 'Content-Type: application/json' -d "$$BODY" $(API)/providers); \
CODE=$$(echo "$$RESP" | tail -n1); BODY=$$(echo "$$RESP" | head -n-1); \
if [ "$$CODE" != "201" ] && [ "$$CODE" != "200" ]; then echo "Failed (HTTP $$CODE): $$BODY"; exit 1; fi; \
echo "Created provider: $$BODY"
# Create a demo bucket on the Local MinIO provider
DEMO_BUCKET ?= demo-bucket
demo-bucket: wait-server
@set -e; \
PID=$$($(CURL) $(API)/providers | $(JQ) '.[] | select(.name=="Local MinIO") | .id' | head -n1); \
if [ -z "$$PID" ] || [ "$$PID" = "null" ]; then echo "Local MinIO provider not found. Run: make provision-minio"; exit 1; fi; \
BODY=$$(jq -n --arg name "$(DEMO_BUCKET)" --arg region "" '{name:$$name, region:$$region}'); \
RESP=$$($(CURL) -w "\n%{http_code}" -H 'Content-Type: application/json' -d "$$BODY" $(API)/providers/$$PID/buckets); \
CODE=$$(echo "$$RESP" | tail -n1); \
if [ "$$CODE" != "201" ] && [ "$$CODE" != "200" ]; then echo "Create bucket failed (HTTP $$CODE): $$(echo "$$RESP" | head -n-1)"; exit 1; fi; \
echo "Bucket $(DEMO_BUCKET) ready"
# Upload a small sample file using the API
DEMO_FILE ?= /tmp/hermes-demo.txt
demo-upload: wait-server
@echo "Hello from Hermes $$(date -u)" > $(DEMO_FILE)
@set -e; \
PID=$$($(CURL) $(API)/providers | $(JQ) '.[] | select(.name=="Local MinIO") | .id' | head -n1); \
if [ -z "$$PID" ] || [ "$$PID" = "null" ]; then echo "Local MinIO provider not found. Run: make provision-minio"; exit 1; fi; \
BUCKET=$(DEMO_BUCKET); KEY=$$(basename $(DEMO_FILE)); \
RESP=$$($(CURL) -w "\n%{http_code}" -F file=@$(DEMO_FILE) -F key=$$KEY $(API)/providers/$$PID/buckets/$$BUCKET/upload); \
CODE=$$(echo "$$RESP" | tail -n1); \
if [ "$$CODE" != "200" ]; then echo "Upload failed (HTTP $$CODE): $$(echo "$$RESP" | head -n-1)"; exit 1; fi; \
echo "Uploaded $(DEMO_FILE) to $$BUCKET/$$KEY"
# -------- Quality of life --------
.PHONY: env print-db-url
env:
@echo "APP_ENV=$(APP_ENV)"
@echo "HTTP_PORT=$(HTTP_PORT)"
@echo "DB_DRIVER=$(DB_DRIVER)"
@echo "DATABASE_URL=$(DATABASE_URL)"
@echo "STATIC_DIR=$(STATIC_DIR)"
@echo "MINIO: http://127.0.0.1:$(MINIO_API_PORT) (console http://127.0.0.1:$(MINIO_CONSOLE_PORT))"
print-db-url:
@echo $(DATABASE_URL)