1 line
7.8 KiB
JSON
1 line
7.8 KiB
JSON
{"repo": "bruce-sakura/uploadmyself", "files": {"docker-compose.yml": {"44039874aa36f789cebfeefafef8c9baf030cb48": {"t": 1785595248.7124884, "n": 1524, "h": "34ae0597d8b640ed", "c": "# UploadMyself — 全栈编排(SQLite,全功能含 GPU ML)\n# 运行时数据集中在 ${UPLOADMYSELF_HOME}/data(默认 ~/.UploadMyself,由 install.sh 写入 .env)。\n# 数据库为 SQLite 单文件,无需独立数据库容器。\nservices:\n # ===== Backend (Go + Python ML/CharacterGen, GPU) =====\n backend:\n build:\n context: .\n dockerfile: Dockerfile.backend\n ports:\n - \"8000:8000\"\n - \"8001:8001\"\n environment:\n APP_PORT: \"8000\"\n PYTHON_BIN: \"python3\"\n ML_SCRIPTS_DIR: \"/app/ml/scripts\"\n SKILLS_DIR: \"/app/skills\"\n UPLOAD_DIR: \"/app/uploads\"\n DB_PATH: \"/app/data/uploadmyself.db\"\n LLM_API_KEY: \"${LLM_API_KEY:-}\"\n LLM_BASE_URL: \"${LLM_BASE_URL:-https://token-plan-sgp.xiaomimimo.com/v1}\"\n LLM_MODEL: \"${LLM_MODEL:-mimo-v2.5-pro}\"\n # ML 服务与后端跑在同一容器(见 entrypoint.sh)\n ML_SERVICE_URL: \"http://localhost:8001\"\n # HuggingFace 模型缓存持久化到工作目录,避免每次重拉\n HF_HOME: \"/root/.cache/huggingface\"\n volumes:\n - ${UPLOADMYSELF_HOME}/data/uploads:/app/uploads\n - ${UPLOADMYSELF_HOME}/data/skills:/app/skills\n - ${UPLOADMYSELF_HOME}/data/db:/app/data\n - ${UPLOADMYSELF_HOME}/data/models:/root/.cache/huggingface\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n count: all\n capabilities: [gpu]\n restart: unless-stopped\n\n # ===== Frontend (React + Nginx) =====\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n ports:\n - \"3000:80\"\n depends_on:\n - backend\n restart: unless-stopped\n"}}, "install.sh": {"44039874aa36f789cebfeefafef8c9baf030cb48": {"t": 1785595260.5378091, "n": 4800, "h": "df92c5dc663c7b7d", "c": "#!/usr/bin/env bash\n# UploadMyself 一键安装脚本\n# Docker 模式(推荐,跨平台): ./install.sh --docker\n# Linux 原生模式(全功能含 GPU): ./install.sh --native\n# 不带参数则交互选择。运行时数据统一存放在工作目录(默认 ~/UploadMyself)。\nset -euo pipefail\n\n# ---------- defaults ----------\nMODE=\"\"\nHOME_DIR=\"${HOME}/.UploadMyself\"\nLLM_KEY=\"\"\nLLM_BASE=\"https://token-plan-sgp.xiaomimimo.com/v1\"\nLLM_MODEL=\"mimo-v2.5-pro\"\nASSUME_YES=0\nREPO_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\n# ---------- helpers ----------\nlog() { printf '\\033[36m[install]\\033[0m %s\\n' \"$*\"; }\nok() { printf '\\033[32m[ ok ]\\033[0m %s\\n' \"$*\"; }\nwarn() { printf '\\033[33m[warn]\\033[0m %s\\n' \"$*\" >&2; }\nerr() { printf '\\033[31m[error]\\033[0m %s\\n' \"$*\" >&2; }\n\npath_hint() { # path_hint <dir>: 若 dir 不在 PATH 则提示加入\n case \":${PATH}:\" in\n *\":$1:\"*) : ;;\n *) warn \"将 CLI 目录加入 PATH: echo 'export PATH=\\\"$1:\\$PATH\\\"' >> ~/.bashrc && source ~/.bashrc\" ;;\n esac\n}\n\nusage() {\n cat <<EOF\nUploadMyself 一键安装\n\n用法: ./install.sh [选项]\n\n选项:\n --docker Docker 模式安装(推荐)\n --native Linux 原生模式安装(全功能含 GPU)\n --home <dir> 工作目录(默认 \\$HOME/.UploadMyself)\n --llm-key <key> LLM API Key(不提供则交互询问)\n --llm-base <url> LLM Base URL(默认 MiMo)\n --llm-model <name> LLM 模型名(默认 mimo-v2.5-pro)\n -y, --yes 跳过确认提示\n -h, --help 显示帮助\nEOF\n}\n\n# ---------- parse args ----------\nwhile [[ $# -gt 0 ]]; do\n case \"$1\" in\n --docker) MODE=docker; shift;;\n --native) MODE=native; shift;;\n --home) HOME_DIR=\"$2\"; shift 2;;\n --llm-key) LLM_KEY=\"$2\"; shift 2;;\n --llm-base) LLM_BASE=\"$2\"; shift 2;;\n --llm-model) LLM_MODEL=\"$2\"; shift 2;;\n -y|--yes) ASSUME_YES=1; shift;;\n -h|--help) usage; exit 0;;\n *) err \"未知参数: $1\"; usage; exit 1;;\n esac\ndone\n\nconfirm() { # confirm \"提示\" -> 0 yes / 1 no\n [[ \"$ASSUME_YES\" == 1 ]] && return 0\n local ans\n read -rp \"$1 [y/N]: \" ans || true\n [[ \"${ans:-N}\" =~ ^[Yy]$ ]]\n}\n\nchoose_mode() {\n [[ -n \"$MODE\" ]] && return\n echo \"选择安装方式:\"\n echo \" 1) Docker(推荐,跨平台)\"\n echo \" 2) Linux 原生(全功能含 GPU)\"\n local ans\n read -rp \"输入 1/2 [1]: \" ans || true\n case \"${ans:-1}\" in\n 2) MODE=native;;\n *) MODE=docker;;\n esac\n}\n\nprompt_llm_key() {\n [[ -n \"$LLM_KEY\" ]] && return\n read -rp \"输入 LLM API Key(MiMo / OpenAI 兼容,可留空稍后改 .env): \" LLM_KEY || true\n}\n\ncreate_home() {\n log \"工作目录: $HOME_DIR\"\n mkdir -p \"$HOME_DIR\"/data/{uploads,skills,models,db} \"$HOME_DIR/logs\"\n}\n\nwrite_env() {\n local abs_home; abs_home=\"$(cd \"$HOME_DIR\" && pwd)\"\n cat > \"$REPO_DIR/.env\" <<EOF\n# 由 install.sh 生成(Docker 模式)。数据库为 SQLite,路径在 compose 内固定。\nUPLOADMYSELF_HOME=$abs_home\nAPP_PORT=8000\nLLM_API_KEY=$LLM_KEY\nLLM_BASE_URL=$LLM_BASE\nLLM_MODEL=$LLM_MODEL\nEOF\n ok \".env 已写入 $REPO_DIR/.env\"\n}\n\nprint_urls() {\n cat <<EOF\n\n=== UploadMyself 已启动 ===\n 前端: http://localhost:3000\n 后端: http://localhost:8000\n ML: http://localhost:8001\n 工作目录: $HOME_DIR\n 管理: ./run.sh [docker|native] 启动 · ./stop.sh 停止\n CLI: upme skill list (命令行控制;详见 README 的 upme 小节)\nEOF\n}\n\n# ---------- Docker 模式 ----------\ninstall_docker() {\n command -v docker >/dev/null 2>&1 || { err \"未找到 docker,请先安装 Docker / Docker Desktop\"; exit 1; }\n local COMPOSE\n if docker compose version >/dev/null 2>&1; then COMPOSE=\"docker compose\";\n elif command -v docker-compose >/dev/null 2>&1; then COMPOSE=\"docker-compose\";\n else err \"未找到 docker compose\"; exit 1; fi\n ok \"Docker: $(docker --version)\"\n\n # GPU runtime 检查(全功能需要)\n if docker info 2>/dev/null | grep -qiE 'nvidia'; then\n ok \"检测到 NVIDIA Docker runtime\"\n else\n warn \"未检测到 Docker 的 NVIDIA runtime —— 3D/语音等 GPU 功能将不可用。\"\n warn \"安装方法见 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/\"\n confirm \"仍要继续(仅文字/云端 LLM 功能可用)?\" || exit 1\n fi\n\n create_home\n prompt_llm_key\n write_env\n\n log \"构建并启动容器(首次会拉取镜像 + 编译,耗时较久)...\"\n ( cd \"$REPO_DIR\" && $COMPOSE --env-file .env up -d --build )\n ok \"容器已启动\"\n\n # 安装 upme CLI:从镜像拷出 Linux 原生二进制到 PATH\n local bindir=\"$HOME/.local/bin\"; mkdir -p \"$bindir\"\n if ( cd \"$REPO_DIR\" && $COMPOSE --env-file .env cp backend:/usr/local/bin/upme \"$bindir/upme\" ) >/dev/null 2>&1; then\n chmod +x \"$bindir/upme\" 2>/dev/null || true\n ok \"upme CLI 已安装到 $bindir/upme\"\n path_hint \"$bindir\"\n else\n warn \"未能拷出 upme(非 Linux 宿主机时改用: $COMPOSE exec backend upme ...)\"\n fi\n\n print_urls\n}\n\n# ---------- Linux 原生模式 ----------\ninstall_native() {\n if [[ -x \"$REPO_DIR/scripts/install_native.sh\" ]]; then\n HOME_DIR=\"$HOME_DIR\" LLM_KEY=\"$LLM_KEY\" LLM_BASE=\"$LLM_BASE\" LLM_MODEL=\"$LLM_MODEL\" \\\n ASSUME_YES=\"$ASSUME_YES\" REPO_DIR=\"$REPO_DIR\" bash \"$REPO_DIR/scripts/install_native.sh\"\n else\n err \"原生安装脚本 scripts/install_native.sh 尚未就绪\"\n exit 1\n fi\n}\n\n# ---------- main ----------\nchoose_mode\nlog \"安装模式: $MODE\"\ncase \"$MODE\" in\n docker) install_docker;;\n native) install_native;;\n *) err \"未知模式: $MODE\"; exit 1;;\nesac\n"}}}} |