clavitor/clavitor.ai/Makefile

80 lines
2.7 KiB
Makefile

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"