#!/bin/bash # Docker entrypoint: 适配 Hugging Face Spaces 的启动脚本 # 功能:初始化数据目录、同步配置并启动 Hermes set -e # --- 1. 路径配置 (优先使用环境变量,否则使用默认值) --- # 在 Hugging Face 中,HOME 默认为 /home/user : "${HERMES_HOME:=$HOME/data}" : "${INSTALL_DIR:=$HOME/app}" : "${VIRTUAL_ENV:=$HOME/venv}" # 确保 PATH 包含虚拟环境(双重保险) export PATH="$VIRTUAL_ENV/bin:$PATH" echo "--- Hermes Bootstrapping ---" echo "Data Directory: $HERMES_HOME" echo "Install Directory: $INSTALL_DIR" # --- 2. 创建必要的子目录 --- # 在 /home/user/data 下创建结构,这里拥有完整写权限 mkdir -p "$HERMES_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home} # --- 3. 初始配置文件检查与拷贝 --- # 如果挂载的持久化目录中没有配置文件,则从安装目录拷贝模板 # .env 文件 if [ ! -f "$HERMES_HOME/.env" ]; then echo "Info: Creating default .env from template..." if [ -f "$INSTALL_DIR/.env.example" ]; then cp "$INSTALL_DIR/.env.example" "$HERMES_HOME/.env" else echo "Warning: .env.example not found in $INSTALL_DIR" fi fi # config.yaml 文件 if [ ! -f "$HERMES_HOME/config.yaml" ]; then echo "Info: Creating default config.yaml..." if [ -f "$INSTALL_DIR/cli-config.yaml.example" ]; then cp "$INSTALL_DIR/cli-config.yaml.example" "$HERMES_HOME/config.yaml" else echo "Warning: cli-config.yaml.example not found" fi fi # SOUL.md 文件 if [ ! -f "$HERMES_HOME/SOUL.md" ]; then echo "Info: Creating default SOUL.md..." if [ -f "$INSTALL_DIR/docker/SOUL.md" ]; then cp "$INSTALL_DIR/docker/SOUL.md" "$HERMES_HOME/SOUL.md" else echo "Warning: SOUL.md not found in docker folder" fi fi # --- 4. 同步内置技能 (Skills Sync) --- if [ -d "$INSTALL_DIR/skills" ]; then echo "Info: Syncing bundled skills..." # 显式使用虚拟环境中的 python 运行同步脚本 "$VIRTUAL_ENV/bin/python3" "$INSTALL_DIR/tools/skills_sync.py" || echo "Skill sync failed, skipping..." fi # --- 5. 启动应用 --- # 使用 exec 确保 hermes 进程成为容器的 PID 1,以便正确接收停止信号 echo "--- Starting Hermes Agent on Port $PORT ---" # 如果你发现程序没有正确读取 $PORT 环境变量,可以显式在这里指定 # 例如:exec hermes --port "$PORT" "$@" # exec hermes "$@" echo "Starting Web Terminal via ttyd on port $PORT..." # 使用 ttyd 包装 hermes 启动 # -p $PORT: 监听 Hugging Face 分配的端口 # -W: 允许网页端写入(即允许你打字输入) # hermes: 要运行的目标程序 exec ttyd -p "$PORT" -W hermes