BINARY = clavitor-web PROD_HOST = root@clavitor.ai PROD_DIR = /opt/clavitor-web PORT = 8099 .PHONY: build dev deploy-dev deploy-prod setup-prod # Build for local (dev on forge/localhost) build: CGO_ENABLED=1 go build -o $(BINARY) . # Run locally (dev mode — templates reload from disk) dev: build pkill -f ./$(BINARY) 2>/dev/null || true sleep 0.5 ./$(BINARY) & @echo "→ dev.clavitor.ai / http://localhost:$(PORT)" # Deploy to dev (forge = localhost, dev.clavitor.ai points here) deploy-dev: build pkill -f ./$(BINARY) 2>/dev/null || true sleep 0.5 ./$(BINARY) & @echo "✓ dev deployed → dev.clavitor.ai / http://localhost:$(PORT)" # Build for prod (linux/amd64 for Zürich) build-prod: GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build -o $(BINARY)-linux-amd64 . # Deploy to prod (Zürich — clavitor.ai) SSH_MUX = -o ControlMaster=auto -o ControlPath=/tmp/clavitor-deploy-%r@%h -o ControlPersist=30 deploy-prod: build-prod @echo "$$(date +%H:%M:%S) upload..." scp $(SSH_MUX) $(BINARY)-linux-amd64 $(PROD_HOST):$(PROD_DIR)/ @echo "$$(date +%H:%M:%S) maintenance on + restart + wait + maintenance off..." ssh $(SSH_MUX) $(PROD_HOST) "\ sqlite3 $(PROD_DIR)/clavitor.db \"INSERT INTO maintenance (start_at, reason, started_by, ended_by) VALUES (strftime('%s','now'), 'deploy', 'makefile', '')\" && \ cd $(PROD_DIR) && mv $(BINARY)-linux-amd64 $(BINARY) && systemctl restart clavitor-web && \ sleep 5 && \ sqlite3 $(PROD_DIR)/clavitor.db \"UPDATE maintenance SET end_at = strftime('%s','now'), ended_by = 'makefile' WHERE end_at IS NULL\"" @echo "$$(date +%H:%M:%S) ✓ prod deployed → https://clavitor.ai" # Pull prod DB backup locally backup-prod: scp $(PROD_HOST):$(PROD_DIR)/clavitor.db backups/clavitor-$(shell date +%Y%m%d-%H%M%S).db @echo "✓ prod DB backed up" # One-time: push local DB to prod (DESTRUCTIVE — overwrites prod data) push-db: @echo "⚠ This overwrites the prod database. Press Ctrl+C to cancel." @sleep 3 scp clavitor.db $(PROD_HOST):$(PROD_DIR)/ ssh $(PROD_HOST) "systemctl restart clavitor-web" @echo "✓ DB pushed to prod" # First-time prod setup (already done) setup-prod: ssh $(PROD_HOST) "mkdir -p $(PROD_DIR)" scp $(BINARY)-linux-amd64 clavitor.db $(PROD_HOST):$(PROD_DIR)/ ssh $(PROD_HOST) "mv $(PROD_DIR)/$(BINARY)-linux-amd64 $(PROD_DIR)/$(BINARY)" ssh $(PROD_HOST) 'cat > /etc/systemd/system/clavitor-web.service << EOF\n\ [Unit]\n\ Description=clavitor-web\n\ After=network.target\n\ \n\ [Service]\n\ Type=simple\n\ WorkingDirectory=$(PROD_DIR)\n\ ExecStart=$(PROD_DIR)/$(BINARY)\n\ Restart=always\n\ RestartSec=5\n\ Environment=PORT=$(PORT)\n\ \n\ [Install]\n\ WantedBy=multi-user.target\n\ EOF' ssh $(PROD_HOST) "systemctl daemon-reload && systemctl enable --now clavitor-web" @echo "✓ prod setup complete"