godcrm/Makefile
GOD CRM Release f89e074dd1
Some checks failed
CI / Lint / Typecheck / Test / Build (push) Has been cancelled
CI / PostgreSQL Integration Tests (push) Has been cancelled
GOD CRM — public scrubbed snapshot
Governed substrate for autonomous agents: scoped identity (passports),
audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
2026-08-10 04:01:45 +03:00

91 lines
3.9 KiB
Makefile

# GOD CRM — Development Commands
# PROD: crm.hltrn.cc — code lives here, PM2: godcrm
# DEV: devcrm.hltrn.cc — test here, PM2: godcrm
# DEV host moved off the decommissioned .72 (2026-06); real IP lives in
# the git-ignored scripts/deploy.local.env (DEV_HOST=root@<real-ip>).
# Pull DEV_HOST from the git-ignored local override; fall back to placeholder.
-include scripts/deploy.local.env
DEV_HOST ?= root@<DEV_IP>
.PHONY: dev prod sync-db build restart restart-prod status logs logs-dev publish-adr
# Deploy to DEV (sync + build + restart)
# Touches: rsync /root/production/business-crm/ → root@<DEV_IP>:/root/production/business-crm/
# ssh build on DEV → /root/production/business-crm/dist/ (symlinked to /var/www/business-crm-dev)
# ssh pm2 restart godcrm on .72
# Does NOT touch: PROD nginx (/var/www/business-crm/), PROD PM2
dev:
@echo "[make dev] Destinations: DEV code (rsync .72), DEV dist (ssh build), DEV PM2 (ssh restart). PROD untouched."
bash scripts/deploy.sh dev
# Deploy to PROD (build + copy dist + restart)
# Touches: local build → /root/production/business-crm/dist/
# cp dist → /var/www/business-crm/ (PROD nginx root)
# pm2 restart godcrm on .205
# Does NOT touch: DEV code, DEV PM2
prod:
@echo "[make prod] Destinations: local build, /var/www/business-crm/ (PROD nginx), PROD PM2 godcrm. DEV untouched."
bash scripts/deploy.sh prod
# Sync PROD DB → DEV
# Touches: pg_dump godcrm_prod (public schema) on this box (.128, master A) → /tmp/godcrm_prod.dump
# scp → DEV (.72):/tmp/godcrm_prod.dump
# pg_restore --clean --if-exists on DEV godcrm_prod
# Does NOT touch: PROD DB writes, code, nginx
sync-db:
@echo "[make sync-db] Destinations: pg_dump local master A (public schema), scp DEV, pg_restore --clean DEV godcrm_prod. PROD DB read-only."
bash scripts/deploy.sh sync-db
# Build frontend only
build:
npm run build
# Restart DEV PM2 (safe — only affects the DEV box)
restart:
ssh $(DEV_HOST) "cd /root/production/business-crm && pm2 restart godcrm --update-env"
# Restart PROD PM2 (requires explicit confirmation)
restart-prod:
@echo "WARNING: This will restart PROD PM2 on $$(hostname) (.205)"
@read -r -p "Are you sure? [y/N] " confirm && [ "$$confirm" = "y" ] || (echo "Aborted."; exit 1)
pm2 restart godcrm
# Show PM2 status (both servers)
status:
@echo "=== PROD ===" && pm2 status godcrm
@echo "=== DEV ($(DEV_HOST)) ===" && ssh $(DEV_HOST) "pm2 status godcrm" 2>/dev/null || echo "(DEV unreachable)"
# Tail PROD PM2 logs
logs:
pm2 logs godcrm --lines 50
# Tail DEV PM2 logs
logs-dev:
ssh $(DEV_HOST) "pm2 logs godcrm --lines 50"
# Publish ADR markdown → a documents widget via the v4 API.
# Pass exactly ONE target (REGISTRY or WIDGET) — no silent default to avoid
# the "ADR landed in the wrong widget" bug we hit several times.
#
# Usage (Architecture v2 examples):
# make publish-adr WIDGET=2683 FILE=docs/ADR-0003-foo.md SLUG=adr-0003 ICON=🔥 NAME="ADR-0003 — Foo"
# make publish-adr REGISTRY=7266 FILE=docs/ADR-0003-foo.md SLUG=adr-0003 ICON=🔥 NAME="ADR-0003 — Foo"
#
# Always --no-cleanup (additive); script refuses to run without an explicit target.
publish-adr:
@test -n "$(FILE)" || (echo "FILE=docs/ADR-XXXX-....md required"; exit 1)
@test -n "$(SLUG)" || (echo "SLUG=adr-NNNN required"; exit 1)
@test -n "$(NAME)" || (echo "NAME=\"ADR-NNNN — Title\" required"; exit 1)
@if [ -n "$(WIDGET)" ] && [ -n "$(REGISTRY)" ]; then \
echo "pass only ONE of WIDGET=<id> | REGISTRY=<id>, not both"; exit 1; \
fi
@if [ -n "$(WIDGET)" ]; then \
node scripts/rebuild-adr-docs-v4.js --widget $(WIDGET) --no-cleanup \
--files "$(FILE),$(SLUG),$(or $(ICON),📘),$(NAME)"; \
elif [ -n "$(REGISTRY)" ]; then \
node scripts/rebuild-adr-docs-v4.js --registry $(REGISTRY) --no-cleanup \
--files "$(FILE),$(SLUG),$(or $(ICON),📘),$(NAME)"; \
else \
echo "pass WIDGET=<id> or REGISTRY=<id> (e.g. WIDGET=2683 or REGISTRY=7266)"; exit 1; \
fi