mirror of
https://github.com/multica-ai/multica.git
synced 2026-06-16 19:29:26 +02:00
The v0.2.6 self-host security fix (#1307) defaults APP_ENV to "production" in docker-compose.selfhost.yml, which disables the 888888 master verification code. The follow-up docs PR (#1313) covered SELF_HOSTING.md and the installers, but `.env.example` — the file users actually copy and edit — still makes no mention of APP_ENV, so operators who don't read the prose docs hit the exact same "888888 stopped working after upgrade" confusion reported in #1331. - Add APP_ENV= to .env.example with a comment block that spells out the three cases (Docker default, local dev, evaluation) and warns against enabling the bypass on public instances. Keeping the value empty preserves the current `make dev` UX (Go server reads empty → treats as non-production → 888888 works locally) while `${APP_ENV:-production}` in the compose file still ensures public Docker deployments are safe by default. - Update the existing 888888 mention under # Email so it no longer contradicts the new gating rule. - Update the `make selfhost` post-start banner, which still told operators to "Log in with any email + verification code: 888888" even after #1307 disabled that path by default.
226 lines
6.6 KiB
Makefile
226 lines
6.6 KiB
Makefile
.PHONY: dev server daemon cli multica build test migrate-up migrate-down sqlc seed clean setup start stop check worktree-env setup-main start-main stop-main check-main setup-worktree start-worktree stop-worktree check-worktree db-up db-down selfhost selfhost-stop
|
|
|
|
MAIN_ENV_FILE ?= .env
|
|
WORKTREE_ENV_FILE ?= .env.worktree
|
|
ENV_FILE ?= $(if $(wildcard $(MAIN_ENV_FILE)),$(MAIN_ENV_FILE),$(if $(wildcard $(WORKTREE_ENV_FILE)),$(WORKTREE_ENV_FILE),$(MAIN_ENV_FILE)))
|
|
|
|
ifneq ($(wildcard $(ENV_FILE)),)
|
|
include $(ENV_FILE)
|
|
endif
|
|
|
|
POSTGRES_DB ?= multica
|
|
POSTGRES_USER ?= multica
|
|
POSTGRES_PASSWORD ?= multica
|
|
POSTGRES_PORT ?= 5432
|
|
PORT ?= 8080
|
|
FRONTEND_PORT ?= 3000
|
|
FRONTEND_ORIGIN ?= http://localhost:$(FRONTEND_PORT)
|
|
MULTICA_APP_URL ?= $(FRONTEND_ORIGIN)
|
|
DATABASE_URL ?= postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable
|
|
NEXT_PUBLIC_API_URL ?= http://localhost:$(PORT)
|
|
NEXT_PUBLIC_WS_URL ?= ws://localhost:$(PORT)/ws
|
|
GOOGLE_REDIRECT_URI ?= $(FRONTEND_ORIGIN)/auth/callback
|
|
MULTICA_SERVER_URL ?= ws://localhost:$(PORT)/ws
|
|
|
|
export
|
|
|
|
MULTICA_ARGS ?= $(ARGS)
|
|
|
|
COMPOSE := docker compose
|
|
|
|
define REQUIRE_ENV
|
|
@if [ ! -f "$(ENV_FILE)" ]; then \
|
|
echo "Missing env file: $(ENV_FILE)"; \
|
|
echo "Create .env from .env.example, or run 'make worktree-env' and use .env.worktree."; \
|
|
exit 1; \
|
|
fi
|
|
endef
|
|
|
|
# ---------- Self-hosting (Docker Compose) ----------
|
|
|
|
# One-command self-host: create env, start Docker Compose, wait for health
|
|
selfhost:
|
|
@if [ ! -f .env ]; then \
|
|
echo "==> Creating .env from .env.example..."; \
|
|
cp .env.example .env; \
|
|
JWT=$$(openssl rand -hex 32); \
|
|
if [ "$$(uname)" = "Darwin" ]; then \
|
|
sed -i '' "s/^JWT_SECRET=.*/JWT_SECRET=$$JWT/" .env; \
|
|
else \
|
|
sed -i "s/^JWT_SECRET=.*/JWT_SECRET=$$JWT/" .env; \
|
|
fi; \
|
|
echo "==> Generated random JWT_SECRET"; \
|
|
fi
|
|
@echo "==> Starting Multica via Docker Compose..."
|
|
docker compose -f docker-compose.selfhost.yml up -d --build
|
|
@echo "==> Waiting for backend to be ready..."
|
|
@for i in $$(seq 1 30); do \
|
|
if curl -sf http://localhost:$${PORT:-8080}/health > /dev/null 2>&1; then \
|
|
break; \
|
|
fi; \
|
|
sleep 2; \
|
|
done
|
|
@if curl -sf http://localhost:$${PORT:-8080}/health > /dev/null 2>&1; then \
|
|
echo ""; \
|
|
echo "✓ Multica is running!"; \
|
|
echo " Frontend: http://localhost:$${FRONTEND_PORT:-3000}"; \
|
|
echo " Backend: http://localhost:$${PORT:-8080}"; \
|
|
echo ""; \
|
|
echo "Log in: configure RESEND_API_KEY in .env for email codes,"; \
|
|
echo " or set APP_ENV=development in .env (private networks only) to enable code 888888."; \
|
|
echo ""; \
|
|
echo "Next — install the CLI and connect your machine:"; \
|
|
echo " brew install multica-ai/tap/multica"; \
|
|
echo " multica setup self-host"; \
|
|
else \
|
|
echo ""; \
|
|
echo "Services are still starting. Check logs:"; \
|
|
echo " docker compose -f docker-compose.selfhost.yml logs"; \
|
|
fi
|
|
|
|
# Stop all Docker Compose self-host services
|
|
selfhost-stop:
|
|
@echo "==> Stopping Multica services..."
|
|
docker compose -f docker-compose.selfhost.yml down
|
|
@echo "✓ All services stopped."
|
|
|
|
# ---------- One-click commands ----------
|
|
|
|
# First-time setup: install deps, start DB, run migrations
|
|
setup:
|
|
$(REQUIRE_ENV)
|
|
@echo "==> Using env file: $(ENV_FILE)"
|
|
@echo "==> Installing dependencies..."
|
|
pnpm install
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
@echo "==> Running migrations..."
|
|
cd server && go run ./cmd/migrate up
|
|
@echo ""
|
|
@echo "✓ Setup complete! Run 'make start' to launch the app."
|
|
|
|
# Start all services (backend + frontend)
|
|
start:
|
|
$(REQUIRE_ENV)
|
|
@echo "Using env file: $(ENV_FILE)"
|
|
@echo "Backend: http://localhost:$(PORT)"
|
|
@echo "Frontend: http://localhost:$(FRONTEND_PORT)"
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
@echo "Running migrations..."
|
|
cd server && go run ./cmd/migrate up
|
|
@echo "Starting backend and frontend..."
|
|
@trap 'kill 0' EXIT; \
|
|
(cd server && go run ./cmd/server) & \
|
|
pnpm dev:web & \
|
|
wait
|
|
|
|
# Stop all services
|
|
stop:
|
|
$(REQUIRE_ENV)
|
|
@echo "Stopping services..."
|
|
@-lsof -ti:$(PORT) | xargs kill -9 2>/dev/null
|
|
@-lsof -ti:$(FRONTEND_PORT) | xargs kill -9 2>/dev/null
|
|
@case "$(DATABASE_URL)" in \
|
|
""|*@localhost:*|*@localhost/*|*@127.0.0.1:*|*@127.0.0.1/*|*@\[::1\]:*|*@\[::1\]/*) \
|
|
echo "✓ App processes stopped. Shared PostgreSQL is still running on localhost:$(POSTGRES_PORT)." ;; \
|
|
*) \
|
|
echo "✓ App processes stopped. Remote PostgreSQL was not affected." ;; \
|
|
esac
|
|
|
|
# Full verification: typecheck + unit tests + Go tests + E2E
|
|
check:
|
|
$(REQUIRE_ENV)
|
|
@ENV_FILE="$(ENV_FILE)" bash scripts/check.sh
|
|
|
|
db-up:
|
|
@$(COMPOSE) up -d postgres
|
|
|
|
db-down:
|
|
@$(COMPOSE) down
|
|
|
|
worktree-env:
|
|
@bash scripts/init-worktree-env.sh .env.worktree
|
|
|
|
setup-main:
|
|
@$(MAKE) setup ENV_FILE=$(MAIN_ENV_FILE)
|
|
|
|
start-main:
|
|
@$(MAKE) start ENV_FILE=$(MAIN_ENV_FILE)
|
|
|
|
stop-main:
|
|
@$(MAKE) stop ENV_FILE=$(MAIN_ENV_FILE)
|
|
|
|
check-main:
|
|
@ENV_FILE=$(MAIN_ENV_FILE) bash scripts/check.sh
|
|
|
|
setup-worktree:
|
|
@if [ ! -f "$(WORKTREE_ENV_FILE)" ]; then \
|
|
echo "==> Generating $(WORKTREE_ENV_FILE) with unique ports..."; \
|
|
bash scripts/init-worktree-env.sh $(WORKTREE_ENV_FILE); \
|
|
else \
|
|
echo "==> Using existing $(WORKTREE_ENV_FILE)"; \
|
|
fi
|
|
@$(MAKE) setup ENV_FILE=$(WORKTREE_ENV_FILE)
|
|
|
|
start-worktree:
|
|
@$(MAKE) start ENV_FILE=$(WORKTREE_ENV_FILE)
|
|
|
|
stop-worktree:
|
|
@$(MAKE) stop ENV_FILE=$(WORKTREE_ENV_FILE)
|
|
|
|
check-worktree:
|
|
@ENV_FILE=$(WORKTREE_ENV_FILE) bash scripts/check.sh
|
|
|
|
# ---------- Individual commands ----------
|
|
|
|
# One-command dev: auto-setup env/deps/db/migrations, then start all services
|
|
dev:
|
|
@bash scripts/dev.sh
|
|
|
|
# Go server only
|
|
server:
|
|
$(REQUIRE_ENV)
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
cd server && go run ./cmd/server
|
|
|
|
daemon:
|
|
@$(MAKE) multica MULTICA_ARGS="daemon restart --profile local"
|
|
|
|
cli:
|
|
@$(MAKE) multica MULTICA_ARGS="$(MULTICA_ARGS)"
|
|
|
|
multica:
|
|
cd server && go run ./cmd/multica $(MULTICA_ARGS)
|
|
|
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
|
|
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
|
|
DATE ?= $(shell date -u '+%Y-%m-%dT%H:%M:%SZ')
|
|
|
|
build:
|
|
cd server && go build -o bin/server ./cmd/server
|
|
cd server && go build -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(DATE)" -o bin/multica ./cmd/multica
|
|
cd server && go build -o bin/migrate ./cmd/migrate
|
|
|
|
test:
|
|
$(REQUIRE_ENV)
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
cd server && go run ./cmd/migrate up
|
|
cd server && go test ./...
|
|
|
|
# Database
|
|
migrate-up:
|
|
$(REQUIRE_ENV)
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
cd server && go run ./cmd/migrate up
|
|
|
|
migrate-down:
|
|
$(REQUIRE_ENV)
|
|
@bash scripts/ensure-postgres.sh "$(ENV_FILE)"
|
|
cd server && go run ./cmd/migrate down
|
|
|
|
sqlc:
|
|
cd server && sqlc generate
|
|
|
|
# Cleanup
|
|
clean:
|
|
rm -rf server/bin server/tmp
|