configs/Makefile

122 lines
3.6 KiB
Makefile

PROJECT_ROOT := $(abspath $(CURDIR)/..)
ENV_FILE := .env
COMPOSE_FILE := docker-compose.yml
COMPOSE_PROJECT := $(shell python3 $(CURDIR)/compose_name.py $(PROJECT_ROOT))
DOCKER_COMPOSE_BIN := $(shell docker compose version >/dev/null 2>&1 && printf 'docker compose' || { docker-compose --version >/dev/null 2>&1 && printf 'docker-compose'; })
ifeq ($(strip $(DOCKER_COMPOSE_BIN)),)
$(error docker compose (v2) or docker-compose is required)
endif
COMPOSE := $(DOCKER_COMPOSE_BIN) --env-file $(ENV_FILE) -p $(COMPOSE_PROJECT) -f $(COMPOSE_FILE)
CONTAINER_NAME = $(COMPOSE_PROJECT)-$(SERVICE)-1
ENV_REQUIRED := TELEGRAM_API_KEY CLIENT_TELEGRAM_API_KEY POSTGRES_DB POSTGRES_USER POSTGRES_PASSWORD DATABASE_URL SANIC_PORT BACKEND_HTTP_PORT
.PHONY: help bootstrap start up down stop restart build ps status logs logs-% tail tail-% shell shell-% env-check reset-config clean clean-images destroy nuke prune data-paths
help:
@echo "Available targets:"
@echo " make bootstrap # interactive setup + rebuild stack"
@echo " make up # start or recreate services"
@echo " make down # stop services (keep data)"
@echo " make restart # restart services"
@echo " make ps # show compose status"
@echo " make logs # follow logs (SERVICE=name to filter)"
@echo " make logs-backend-app # follow logs for backend"
@echo " make shell SERVICE=x # open bash inside service"
@echo " make clean # remove containers, keep data"
@echo " make destroy CONFIRM=1# nuke containers + volumes + data"
@echo " make reset-config # remove .env/.bak and swarm key"
@echo " make env-check # validate critical .env entries"
bootstrap start:
./start.sh
up:
$(COMPOSE) up -d --build
build:
$(COMPOSE) build
down stop:
$(COMPOSE) down --remove-orphans
restart:
$(COMPOSE) down --remove-orphans
$(COMPOSE) up -d --build
ps status:
$(COMPOSE) ps
logs:
$(COMPOSE) logs -f --since 1h $(SERVICE)
logs-%:
$(MAKE) logs SERVICE=$*
tail:
$(COMPOSE) logs -f --since 1h $(SERVICE)
tail-%:
$(MAKE) tail SERVICE=$*
shell:
@if [ -z "$(SERVICE)" ]; then \
echo "Specify SERVICE=backend-app (or another service)" >&2; \
exit 1; \
fi
@docker exec -it $(CONTAINER_NAME) /bin/bash
shell-%:
$(MAKE) shell SERVICE=$*
env-check:
@missing=0; \
for key in $(ENV_REQUIRED); do \
if ! grep -qE "^$${key}=" $(ENV_FILE); then \
echo "[missing] $$key"; \
missing=1; \
else \
val=$$(awk -F'=' -v k=$$key '$$1==k{print substr($$0,index($$0,$$2))}' $(ENV_FILE)); \
if [ -z "$$val" ]; then \
echo "[empty] $$key"; \
missing=1; \
fi; \
fi; \
done; \
if [ $$missing -ne 0 ]; then \
echo "Environment file incomplete" >&2; \
exit 1; \
fi
reset-config:
rm -f $(ENV_FILE) $(ENV_FILE).bak
rm -f ipfs/swarm.key
@echo "Configuration artifacts removed. Next run make bootstrap."
clean:
$(COMPOSE) down --remove-orphans
clean-images:
$(COMPOSE) down --remove-orphans --rmi local
prune:
$(COMPOSE) down --remove-orphans --volumes
data-paths:
@echo "Project root: $(PROJECT_ROOT)"
@echo " postgres-data -> $(PROJECT_ROOT)/postgres-data"
@echo " app-logs -> $(PROJECT_ROOT)/app-logs"
@echo " dynamicStorage -> $(PROJECT_ROOT)/dynamicStorage"
@echo " data/ipfs -> $(PROJECT_ROOT)/data/ipfs"
@echo " data/tusd -> $(PROJECT_ROOT)/data/tusd"
nuke destroy:
@if [ "$(CONFIRM)" != "1" ]; then \
echo "Set CONFIRM=1 to remove containers, volumes, and local data" >&2; \
exit 1; \
fi
$(COMPOSE) down --remove-orphans --volumes
rm -rf $(PROJECT_ROOT)/postgres-data $(PROJECT_ROOT)/app-logs $(PROJECT_ROOT)/dynamicStorage $(PROJECT_ROOT)/data