Hello from MCP server
project_root := ".."
frontend_dir := project_root + "/frontend"
backend_dir := project_root + "/backend"
# Default command
default:
@just --list
set shell := ["bash", "-cu"]
set dotenv-load := true
# Install Ansible locally (Debian/Ubuntu example)
install-ansible:
sudo apt update
sudo apt install -y ansible
# Run a playbook against a remote host defined in ~/.ssh/config
# Usage: just run-playbook host=myserver playbook=setup.yml
run-playbook host playbook:
ansible-playbook -i "{{host}}," {{playbook}} --ssh-common-args="-F $HOME/.ssh/config"
# Quick connectivity test using Ansible ping module
# Usage: just ping-host host=myserver
ping-host host:
ansible -i "{{host}}," all -m ping --ssh-common-args="-F $HOME/.ssh/config"
build-backend:
@echo "Building Backend: pricebook-platform..."
cd {{backend_dir}} && go build -o bin/pricebook-platform
mkdir -p ./artifacts/
cp {{backend_dir}}/bin/pricebook-platform ./artifacts/
build-frontend:
@echo "Building Frontend..."
cd {{frontend_dir}} && npm run build
build-mcp:
@echo "Building MCP server..."
cd mcp && go build -o ../artifacts/mcp .
# Run MCP server in dev mode (shows local project files)
run-mcp:
cd mcp && DEV=1 go run .
# Run MCP server with auto-reload (rebuilds on file changes)
dev-mcp:
cd mcp && DEV=1 air
build: build-backend build-frontend
# Check if the backend service is running on a remote host
# Usage: just check-service host=myserver
check-service host:
ansible -i "{{host}}," all -m shell -a "systemctl status pricebook-platform --no-pager" --ssh-common-args="-F $HOME/.ssh/config"
# Full deployment: users, caddy, and backend
# Usage: just deploy host=myserver target=pricebook-platform-a
deploy host target="pricebook-platform-a":
ansible-playbook -i "{{host}}," site.yml --ssh-common-args="-F $HOME/.ssh/config" -e "target={{target}}"
# Deploy backend only
# Usage: just deploy-backend host=myserver target=pricebook-platform-a app_port=8080
deploy-backend host target="pricebook-platform-a" app_port="8080":
ansible-playbook -i "{{host}}," deploy_backend.yml --ssh-common-args="-F $HOME/.ssh/config" -e "target={{target}} app_port={{app_port}}"
# Deploy to slot A (port 8080)
deploy-a host:
just deploy-backend {{host}} pricebook-platform-a 8080
# Deploy to slot B (port 8081)
deploy-b host:
just deploy-backend {{host}} pricebook-platform-b 8081
# Build and deploy MCP server
deploy-mcp host:
just build-mcp
ansible-playbook -i "{{host}}," deploy_mcp.yml --ssh-common-args="-F $HOME/.ssh/config"
# Check MCP service status
check-mcp host:
ansible -i "{{host}}," all -m shell -a "systemctl status mcp --no-pager" --ssh-common-args="-F $HOME/.ssh/config"
# Restart MCP service
restart-mcp host:
ansible -i "{{host}}," all -m shell -a "systemctl restart mcp" --ssh-common-args="-F $HOME/.ssh/config" --become
# Deploy frontend only
# Usage: just deploy-frontend host=myserver target=pricebook-platform-a
deploy-frontend host target="pricebook-platform-a":
ansible-playbook -i "{{host}}," deploy_frontend.yml --ssh-common-args="-F $HOME/.ssh/config" -e "target={{target}}"
# Restart all services (caddy + app servers + mcp)
restart-all host:
ansible -i "{{host}}," all -m shell -a "systemctl restart caddy pricebook-platform-a pricebook-platform-b mcp" --ssh-common-args="-F $HOME/.ssh/config" --become
# Setup dev environment (git, ssh keys, clone repo)
setup-dev-env host:
ansible-playbook -i "{{host}}," setup_dev_env.yml --ssh-common-args="-F $HOME/.ssh/config" -e "github_repo_ssh=$GITHUB_REPO_SSH"
# Show the dev user's SSH public key
show-dev-ssh-key host:
ansible -i "{{host}}," all -m shell -a "cat /home/dev/.ssh/id_ed25519.pub" --ssh-common-args="-F $HOME/.ssh/config" --become
# Clone or update the dev repo on the server (requires SSH key added to GitHub)
# Uses GITHUB_REPO_SSH from .env for initial clone
sync-dev-repo host:
ansible -i "{{host}}," all -m shell -a "cd /home/dev && if [ -d pricebook-platform ]; then cd pricebook-platform && git fetch --all && git pull; else git clone $GITHUB_REPO_SSH pricebook-platform; fi" --ssh-common-args="-F $HOME/.ssh/config" --become --become-user=dev
# Install and configure Litestream for SQLite backups to S3
# Reads S3_BUCKET, S3_REGION, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY from .env
install-litestream host:
ansible-playbook -i "{{host}}," install_litestream.yml --ssh-common-args="-F $HOME/.ssh/config" -e "s3_bucket=$S3_BUCKET s3_region=$S3_REGION s3_access_key_id=$S3_ACCESS_KEY_ID s3_secret_access_key=$S3_SECRET_ACCESS_KEY"
# Check Litestream status
litestream-status host:
ansible -i "{{host}}," all -m shell -a "systemctl status litestream --no-pager" --ssh-common-args="-F $HOME/.ssh/config"
# Restore database from S3 backup
# Usage: just litestream-restore host=myserver target=pricebook-platform-a
litestream-restore host target:
@echo "Stopping {{target}} service..."
ansible -i "{{host}}," all -m shell -a "systemctl stop {{target}}" --ssh-common-args="-F $HOME/.ssh/config" --become
@echo "Restoring database from S3..."
ansible -i "{{host}}," all -m shell -a "AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY litestream restore -o /srv/apps/{{target}}/pb_data/data.db s3://$S3_BUCKET/{{target}}" --ssh-common-args="-F $HOME/.ssh/config" --become
@echo "Starting {{target}} service..."
ansible -i "{{host}}," all -m shell -a "systemctl start {{target}}" --ssh-common-args="-F $HOME/.ssh/config" --become