乔脊柱
个人自动化服务器——SSH调度、人工智能处理、思想库。部署在铁路上。
端点
| 方法 | 路径 | 身份验证 | 描述 |
|---|---|---|---|
| 得到 | /joao/health | 无 | 轻量级活性检查。如果应用程序正在运行,则始终为200。 |
| 得到 | /joao/status | 无 | 诊断健康检查:Supabase、SSH、tmux会话。 |
| 职位 | /joao/dispatch | HMAC | 向主服务器上的tmux会话发送命令。 |
| 职位 | /joao/audio | 无 | 通过AI管道处理音频URL。 |
| 职位 | /joao/meeting | 无 | 通过AI管道处理会议记录。 |
| 职位 | /joao/vision | 无 | 通过AI视觉管道处理图像。 |
| 职位 | /joao/text | 无 | 通过AI管道处理文本。 |
| 得到 | /mcp/sse | 无 | MCP服务器(SSE传输)用于工具访问。 |
GET/joao/状态
返回带有真实连接检查的诊断JSON:
{
"status": "healthy",
"service": "joao-spine",
"timestamp": "2026-03-02T18:00:00.000000",
"version": "abc123",
"uptime_seconds": 3600.0,
"checks": {
"supabase": { "ok": true, "latency_ms": 12.3, "error": null },
"ssh": { "ok": true, "latency_ms": 45.0, "error": null, "target": "zamoritacr@192.168.0.55:22" },
"tmux": { "ok": true, "latency_ms": 8.1, "error": null, "sessions": ["BYTE", "DEX"] }
},
"recent_activity": []
}状态值: healthy (所有检查均通过), degraded (部分), down (全部失败)。
POST/joao/派送(HMAC保护)
请求正文:
{
"session_name": "BYTE",
"command": "echo hello",
"wait": false
}代理allowlist: BYTE、ARIA、CJ、SOFIA、DEX、GEMMA、MAX(不区分大小写)。
HMAC签名:
- 头球
X-JOAO-SIGNATURE:sha256= - 头球
X-JOAO-TIMESTAMP:Unix秒 - 签名=HMAC-SHA256(秘密,
"{timestamp}.{raw_body}") - 时间戳必须在服务器时间的±300秒内。
如果签名缺失/无效,则返回401。如果代理名称或命令验证失败,则返回422。
HMAC签名--curl示例
SECRET="your-hmac-secret"
TIMESTAMP=$(date +%s)
BODY='{"session_name":"BYTE","command":"echo hello","wait":false}'
SIG="sha256=$(printf "%s.%s" "$TIMESTAMP" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')"
curl -X POST https://joao-spine-production.up.railway.app/joao/dispatch \
-H "Content-Type: application/json" \
-H "X-JOAO-TIMESTAMP: $TIMESTAMP" \
-H "X-JOAO-SIGNATURE: $SIG" \
-d "$BODY"测试命令
# Health check
curl https://joao-spine-production.up.railway.app/joao/health
# Diagnostic status
curl https://joao-spine-production.up.railway.app/joao/status | python3 -m json.tool
# Unsigned dispatch (should 401 when HMAC secret is configured)
curl -X POST https://joao-spine-production.up.railway.app/joao/dispatch \
-H "Content-Type: application/json" \
-d '{"session_name":"BYTE","command":"echo test","wait":false}'环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
SUPABASE_URL | 是 | 请提供项目URL |
SUPABASE_SERVICE_ROLE_KEY | 是 | 服务角色密钥(回退到 SUPABASE_KEY) |
COUNCIL_SSH_HOST | 是 | SSH目标主机(回退到 SSH_HOST,默认值 192.168.0.55) |
COUNCIL_SSH_PORT | 否 | SSH端口(回退到 SSH_PORT,默认值 22) |
COUNCIL_SSH_USER | 否 | SSH用户名(回退到 SSH_USER,默认值 joao) |
COUNCIL_SSH_PRIVATE_KEY | 是\* | PEM铁路关键内容(可追溯到 *_KEY_PATH ) 。 |
JOAO_DISPATCH_HMAC_SECRET | 是 | HMAC签名密钥。如果未设置,则会禁用调度身份验证并发出警告。 |
OPENAI_API_KEY | 是 | OpenAI API密钥 |
OPENAI_MODEL | 否 | OpenAI模型(默认 gpt-4o) |
TELEGRAM_BOT_TOKEN | 否 | 用于通知的Telegram机器人令牌 |
TELEGRAM_CHAT_ID | 否 | 电报聊天ID |
\*铁路上,集 COUNCIL_SSH_PRIVATE_KEY 到完整的PEM内容(Railway在仪表板中支持多行环境变量)。本地,使用 COUNCIL_SSH_PRIVATE_KEY_PATH 或 SSH_PRIVATE_KEY_PATH 相反。
铁路注意事项
- 所有秘密都必须保密 铁路变量 (项目仪表板→ 变量选项卡)。
RAILWAY_PUBLIC_DOMAIN和RAILWAY_GIT_COMMIT_SHA由铁路自动设置。- 健康检查路径为
/joao/health(配置于railway.toml). - 日志是JSON结构的stdout,在Railway的日志查看器中可见。
