main Makefile
Antonio Mika  ·  2026-10-25
  1PGDATABASE?="pico"
  2PGHOST?="db"
  3PGUSER?="postgres"
  4PORT?="5432"
  5DB_CONTAINER?=pico-postgres-1
  6DOCKER_TAG?=$(shell git log --format="%H" -n 1)
  7DOCKER_PLATFORM?=linux/amd64,linux/arm64
  8DOCKER_CMD?=docker
  9DOCKER_BUILDX_BUILD?=$(DOCKER_CMD) buildx build --push --platform $(DOCKER_PLATFORM) -t
 10DOCKER_BAKE?=TAGS=$(DOCKER_TAG) $(DOCKER_CMD) buildx bake -f docker-bake.hcl --push --set "*.platform=$(DOCKER_PLATFORM)"
 11WRITE?=0
 12
 13smol:
 14	curl https://pico.sh/smol.css -o ./pkg/apps/prose/public/smol-v2.css
 15	cat ./pkg/apps/prose/artifacts/main.css >> ./pkg/apps/prose/public/smol-v2.css
 16	curl https://pico.sh/smol.css -o ./pkg/apps/pastes/public/smol.css
 17.PHONY: smol
 18
 19css:
 20	cp ./syntax.css ./pkg/apps/pastes/public/syntax.css
 21	cp ./syntax.css ./pkg/apps/prose/public/syntax.css
 22.PHONY: css
 23
 24lint:
 25	golangci-lint run
 26.PHONY: lint
 27
 28deadcode:
 29	go tool deadcode -test ./...
 30.PHONY: deadcode
 31
 32test:
 33	go test ./...
 34.PHONY: test
 35
 36test-integration:
 37	REQUIRE_TESTCONTAINERS=1 go test ./...
 38.PHONY: test-integration
 39
 40snaps:
 41	UPDATE_SNAPS=true go test ./...
 42.PHONY: snaps
 43
 44bp-setup:
 45ifeq ($(DOCKER_CMD),docker)
 46	$(DOCKER_CMD) buildx ls | grep pico || $(DOCKER_CMD) buildx create --name pico
 47	$(DOCKER_CMD) buildx use pico
 48else
 49	# podman
 50endif
 51.PHONY: bp-setup
 52
 53# Podman has no bake, so it builds each image on its own.
 54ifeq ($(DOCKER_CMD),docker)
 55bp-caddy: bp-setup
 56	$(DOCKER_BAKE) caddy
 57.PHONY: bp-caddy
 58
 59bp-auth: bp-setup
 60	$(DOCKER_BAKE) auth-web
 61.PHONY: bp-auth
 62
 63bp-pgs-cdn: bp-setup
 64	$(DOCKER_BAKE) pgs-cdn
 65.PHONY: bp-pgs-cdn
 66
 67bp-pgs-standalone: bp-setup
 68	$(DOCKER_BAKE) pgs-standalone
 69.PHONY: bp-pgs-standalone
 70
 71bp-pico: bp-setup
 72	$(DOCKER_BAKE) pico-ssh
 73.PHONY: bp-pico
 74
 75bp-bouncer: bp-setup
 76	$(DOCKER_BAKE) bouncer
 77.PHONY: bp-bouncer
 78
 79bp-ssh-%: bp-setup
 80	$(DOCKER_BAKE) "$*-ssh"
 81.PHONY: bp-ssh-%
 82
 83bp-%: bp-setup
 84	$(DOCKER_BAKE) "$*-web" "$*-ssh"
 85.PHONY: bp-%
 86
 87bp-all: bp-setup
 88	$(DOCKER_BAKE) default bouncer
 89.PHONY: bp-all
 90else
 91bp-caddy: bp-setup
 92	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pico/caddy:$(DOCKER_TAG) ./caddy
 93.PHONY: bp-caddy
 94
 95bp-auth: bp-setup
 96	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pico/auth-web:$(DOCKER_TAG) --build-arg APP=auth --target release-web .
 97.PHONY: bp-auth
 98
 99bp-pgs-cdn: bp-setup
100	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pico/pgs-cdn:$(DOCKER_TAG) --target release-web -f Dockerfile.cdn .
101.PHONY: bp-pgs-cdn
102
103bp-pgs-standalone: bp-setup
104	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pgs:$(DOCKER_TAG) --target release -f Dockerfile.standalone .
105.PHONY: bp-pgs-standalone
106
107bp-pico: bp-setup
108	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pico/pico-ssh:$(DOCKER_TAG) --build-arg APP=pico --target release-ssh .
109.PHONY: bp-pico
110
111bp-bouncer: bp-setup
112	$(DOCKER_BUILDX_BUILD) ghcr.io/picosh/pico/bouncer:$(DOCKER_TAG) ./bouncer
113.PHONY: bp-bouncer
114
115bp-ssh-%: bp-setup
116	$(DOCKER_BUILDX_BUILD) "ghcr.io/picosh/pico/$*-ssh:$(DOCKER_TAG)" --build-arg "APP=$*" --target release-ssh .
117.PHONY: pgs-ssh
118
119bp-%: bp-setup
120	$(DOCKER_BUILDX_BUILD) "ghcr.io/picosh/pico/$*-ssh:$(DOCKER_TAG)" --build-arg "APP=$*" --target release-ssh .
121	$(DOCKER_BUILDX_BUILD) "ghcr.io/picosh/pico/$*-web:$(DOCKER_TAG)" --build-arg "APP=$*" --target release-web .
122.PHONY: bp-%
123
124bp-all: bp-prose bp-pastes bp-feeds bp-pgs bp-auth bp-bouncer bp-pipe bp-pgs-cdn bp-pico bp-pgs-standalone
125.PHONY: bp-all
126endif
127
128LDFLAGS?=-s -w
129
130build-auth:
131	go build -ldflags="$(LDFLAGS)" -o "build/auth" "./cmd/auth/web"
132.PHONY: build-auth
133
134build-pico:
135	go build -ldflags="$(LDFLAGS)" -o "build/pico-ssh" "./cmd/pico/ssh"
136.PHONY: build-auth
137
138build-pgs-cdn:
139	go build -ldflags="$(LDFLAGS)" -o "build/pgs-cdn" "./cmd/pgs/cdn"
140.PHONY: build-cdn
141
142build-%:
143	go build -ldflags="$(LDFLAGS)" -o "build/$*-web" "./cmd/$*/web"
144	go build -ldflags="$(LDFLAGS)" -o "build/$*-ssh" "./cmd/$*/ssh"
145.PHONY: build-%
146
147build: build-prose build-pastes build-feeds build-pgs build-pgs-cdn build-auth build-pico build-pipe
148.PHONY: build
149
150scripts:
151	# might need to set MINIO_URL
152	docker run --rm -it --env-file .env -v $(shell pwd):/app -w /app golang:1.27 /bin/bash
153.PHONY: scripts
154
155fmt:
156	go fmt ./...
157.PHONY: format
158
159create:
160	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) < ./sql/setup.sql
161.PHONY: create
162
163teardown:
164	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/teardown.sql
165.PHONY: teardown
166
167migrate:
168	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220310_init.sql
169	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220422_add_desc_to_user_and_post.sql
170	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220426_add_index_for_filename.sql
171	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220427_username_to_lower.sql
172	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220523_timestamp_with_tz.sql
173	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220721_analytics.sql
174	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220722_post_hidden.sql
175	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220727_post_change_post_contraints.sql
176	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220730_post_change_filename_to_slug.sql
177	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220801_add_post_tags.sql
178	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220811_add_data_to_post.sql
179	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20220811_add_feature.sql
180	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20221108_add_expires_at_to_posts.sql
181	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20221112_add_feeds_space.sql
182	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20230310_add_aliases_table.sql
183	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20230326_add_feed_items.sql
184	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20230707_add_projects_table.sql
185	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20230921_add_tokens_table.sql
186	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20240120_add_payment_history.sql
187	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20240221_add_project_acl.sql
188	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20240311_add_public_key_name.sql
189	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20240324_add_analytics_table.sql
190	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20240819_add_projects_blocked.sql
191	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20241028_add_analytics_indexes.sql
192	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20241114_add_namespace_to_analytics.sql
193	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20241125_add_content_type_to_analytics.sql
194	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20241202_add_more_idx_analytics.sql
195	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20250319_add_tuns_event_logs_table.sql
196	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20250320_add_tunnel_id_to_tuns_event_logs_table.sql
197	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20250410_add_index_analytics_visits_host_list.sql
198	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20250418_add_project_post_idx_analytics.sql
199	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20251217_add_access_logs_table.sql
200	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20251226_add_pipe_monitoring.sql
201	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260116_add_analytics_filter_indexes.sql
202	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260305_add_forms_table.sql
203	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260503_add_analytics_summary_tables.sql
204	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260504_add_analytics_summary_indexes.sql
205	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260716_block_signups.sql
206	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260925_add_invites.sql
207	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261010_add_pastes_invite_feature.sql
208	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261025_add_access_logs_user_created_idx.sql
209	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261025_add_is_mobile_to_analytics.sql
210	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261025_add_lookup_indexes.sql
211	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261025_drop_unused_analytics_indexes.sql
212.PHONY: migrate
213
214latest:
215	$(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20261025_drop_unused_analytics_indexes.sql
216.PHONY: latest
217
218psql:
219	$(DOCKER_CMD) exec -it $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE)
220.PHONY: psql
221
222dump:
223	$(DOCKER_CMD) exec $(DB_CONTAINER) pg_dump -U $(PGUSER) $(PGDATABASE) > ./backup.sql
224.PHONY: dump
225
226BACKUP_FILE?=./backup.sql
227restore:
228	$(DOCKER_CMD) cp $(BACKUP_FILE) $(DB_CONTAINER):/backup.sql
229	$(DOCKER_CMD) exec -it $(DB_CONTAINER) /bin/bash
230	# psql postgres -U postgres -d pico < /backup.sql
231.PHONY: restore
232
233check: fmt lint test build
234.PHONY: check