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