mirror of
https://github.com/PR0M3TH3AN/unredact.git
synced 2026-10-27 16:50:30 +00:00
161 lines
5.0 KiB
Makefile
161 lines
5.0 KiB
Makefile
.PHONY: build build-solver run stop restart solver app logs status clean dev kill build-associates build-emails check-api-key
|
|
|
|
SOLVER_BIN = solver_rs/target/release/unredact-solver
|
|
SOLVER_PORT ?= 3100
|
|
APP_PORT ?= 8000
|
|
DATA_DIR = $(CURDIR)/unredact/data
|
|
PID_DIR = .pids
|
|
VENV = .venv/bin
|
|
PYTHON = $(VENV)/python
|
|
UVICORN = $(VENV)/uvicorn
|
|
|
|
# Load .env if it exists
|
|
-include .env
|
|
export ANTHROPIC_API_KEY
|
|
|
|
$(PID_DIR):
|
|
mkdir -p $(PID_DIR)
|
|
|
|
# ── Build ──
|
|
|
|
build-solver:
|
|
cd solver_rs && cargo build --release
|
|
|
|
build: build-solver
|
|
|
|
# ── API key ──
|
|
|
|
check-api-key:
|
|
@if [ -z "$(ANTHROPIC_API_KEY)" ]; then \
|
|
printf "Enter your Anthropic API key (from console.anthropic.com): "; \
|
|
read key; \
|
|
echo "ANTHROPIC_API_KEY=$$key" > .env; \
|
|
echo "Saved to .env — run make again."; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# ── Run (background, use `make logs` to see output) ──
|
|
|
|
solver: $(PID_DIR) build-solver
|
|
@if [ -f $(PID_DIR)/solver.pid ] && kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
|
|
echo "Solver already running (pid $$(cat $(PID_DIR)/solver.pid))"; \
|
|
else \
|
|
SOLVER_PORT=$(SOLVER_PORT) DATA_DIR=$(DATA_DIR) $(SOLVER_BIN) > $(PID_DIR)/solver.log 2>&1 & \
|
|
echo $$! > $(PID_DIR)/solver.pid; \
|
|
sleep 0.5; \
|
|
if kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
|
|
echo "Solver started on :$(SOLVER_PORT) (pid $$(cat $(PID_DIR)/solver.pid))"; \
|
|
else \
|
|
echo "Solver failed to start. Check $(PID_DIR)/solver.log"; \
|
|
cat $(PID_DIR)/solver.log; \
|
|
exit 1; \
|
|
fi \
|
|
fi
|
|
|
|
app: check-api-key $(PID_DIR) solver
|
|
@if [ -f $(PID_DIR)/app.pid ] && kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
|
|
echo "App already running (pid $$(cat $(PID_DIR)/app.pid))"; \
|
|
else \
|
|
SOLVER_URL=http://127.0.0.1:$(SOLVER_PORT) \
|
|
$(UVICORN) unredact.app:app --host 0.0.0.0 --port $(APP_PORT) > $(PID_DIR)/app.log 2>&1 & \
|
|
echo $$! > $(PID_DIR)/app.pid; \
|
|
sleep 1; \
|
|
if kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
|
|
echo "App started on :$(APP_PORT) (pid $$(cat $(PID_DIR)/app.pid))"; \
|
|
else \
|
|
echo "App failed to start. Check $(PID_DIR)/app.log"; \
|
|
cat $(PID_DIR)/app.log; \
|
|
exit 1; \
|
|
fi \
|
|
fi
|
|
|
|
# ── Run with live logs (foreground, Ctrl-C stops everything) ──
|
|
|
|
run: check-api-key $(PID_DIR) build-solver
|
|
@SOLVER_PORT=$(SOLVER_PORT) DATA_DIR=$(DATA_DIR) $(SOLVER_BIN) > $(PID_DIR)/solver.log 2>&1 & \
|
|
echo $$! > $(PID_DIR)/solver.pid; \
|
|
sleep 0.5; \
|
|
if ! kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
|
|
echo "Solver failed to start:"; cat $(PID_DIR)/solver.log; exit 1; \
|
|
fi; \
|
|
echo "Solver started on :$(SOLVER_PORT) (pid $$(cat $(PID_DIR)/solver.pid))"; \
|
|
SOLVER_URL=http://127.0.0.1:$(SOLVER_PORT) \
|
|
$(UVICORN) unredact.app:app --host 0.0.0.0 --port $(APP_PORT) > $(PID_DIR)/app.log 2>&1 & \
|
|
echo $$! > $(PID_DIR)/app.pid; \
|
|
sleep 1; \
|
|
if ! kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
|
|
echo "App failed to start:"; cat $(PID_DIR)/app.log; exit 1; \
|
|
fi; \
|
|
echo "App started on :$(APP_PORT) (pid $$(cat $(PID_DIR)/app.pid))"; \
|
|
echo "Running at http://localhost:$(APP_PORT) (Ctrl-C to stop)"; \
|
|
echo ""; \
|
|
trap 'echo ""; echo "Shutting down..."; \
|
|
kill $$(cat $(PID_DIR)/solver.pid) $$(cat $(PID_DIR)/app.pid) 2>/dev/null; \
|
|
rm -f $(PID_DIR)/solver.pid $(PID_DIR)/app.pid; \
|
|
echo "Stopped."; exit 0' INT TERM; \
|
|
tail -f $(PID_DIR)/solver.log $(PID_DIR)/app.log
|
|
|
|
# ── Stop ──
|
|
|
|
stop-solver:
|
|
@if [ -f $(PID_DIR)/solver.pid ]; then \
|
|
kill $$(cat $(PID_DIR)/solver.pid) 2>/dev/null && echo "Solver stopped" || echo "Solver not running"; \
|
|
rm -f $(PID_DIR)/solver.pid; \
|
|
else \
|
|
echo "No solver pid file"; \
|
|
fi
|
|
|
|
stop-app:
|
|
@if [ -f $(PID_DIR)/app.pid ]; then \
|
|
kill $$(cat $(PID_DIR)/app.pid) 2>/dev/null && echo "App stopped" || echo "App not running"; \
|
|
rm -f $(PID_DIR)/app.pid; \
|
|
else \
|
|
echo "No app pid file"; \
|
|
fi
|
|
|
|
stop: stop-app stop-solver
|
|
|
|
kill:
|
|
@echo "Killing processes on ports $(APP_PORT) and $(SOLVER_PORT)..."
|
|
@fuser -k $(APP_PORT)/tcp 2>/dev/null && echo "Killed port $(APP_PORT)" || echo "Port $(APP_PORT) free"
|
|
@fuser -k $(SOLVER_PORT)/tcp 2>/dev/null && echo "Killed port $(SOLVER_PORT)" || echo "Port $(SOLVER_PORT) free"
|
|
@rm -f $(PID_DIR)/solver.pid $(PID_DIR)/app.pid
|
|
|
|
restart: stop run
|
|
|
|
# ── Status / Logs ──
|
|
|
|
status:
|
|
@echo "── Solver ──"
|
|
@if [ -f $(PID_DIR)/solver.pid ] && kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
|
|
echo " Running (pid $$(cat $(PID_DIR)/solver.pid))"; \
|
|
else \
|
|
echo " Stopped"; \
|
|
fi
|
|
@echo "── App ──"
|
|
@if [ -f $(PID_DIR)/app.pid ] && kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
|
|
echo " Running (pid $$(cat $(PID_DIR)/app.pid))"; \
|
|
else \
|
|
echo " Stopped"; \
|
|
fi
|
|
|
|
logs:
|
|
@tail -f $(PID_DIR)/solver.log $(PID_DIR)/app.log 2>/dev/null
|
|
|
|
# ── Clean ──
|
|
|
|
clean: stop
|
|
rm -rf $(PID_DIR)
|
|
cd solver_rs && cargo clean
|
|
|
|
# ── Test ──
|
|
|
|
build-associates:
|
|
$(PYTHON) scripts/build_associates.py
|
|
|
|
build-emails:
|
|
$(PYTHON) scripts/build_emails.py
|
|
|
|
test: solver
|
|
$(PYTHON) -m pytest tests/ --ignore=tests/test_alignment.py -v
|