# editor-api —— 在线编辑文章的轻量后端 # # 用法(在服务器上): # 1. 把博客仓库 checkout 到 /srv/blog(git 工作区,分支 main) # 2. 在同目录放一个 .env,写入 EDITOR_TOKEN=openssl rand -hex 32 生成的值 # 3. docker compose -f docker-compose.editor.yml up -d --build # (回收目录会落在 /srv/editor-trash,记得先 mkdir -p /srv/editor-trash) # 4. nginx 加 /editor-api/ 反代(见 部署清单.md),Worker 配 EDITOR_API_BASE / EDITOR_TOKEN # # ★ 端口只绑 127.0.0.1 —— 公网扫不到 8017,只有同机的 nginx 能转发进来。 # 这是整个安全模型的一半;另一半是「令牌只存在 Worker secret 里,浏览器拿不到」。 services: editor-api: build: ./editor-api container_name: editor-api restart: unless-stopped ports: - "127.0.0.1:8017:8017" environment: # 令牌:必须显式给,没给容器会直接退出(server.mjs 里故意的) EDITOR_TOKEN: ${EDITOR_TOKEN:?请在同目录 .env 里设置 EDITOR_TOKEN} BLOG_ROOT: /blog TRASH_DIR: /app/trash # 容器内监听 0.0.0.0 没关系 —— 外面那层端口映射已经把它锁在宿主机回环上了 BIND_HOST: 0.0.0.0 GIT_BRANCH: main PUSH_REMOTES: origin,gh GIT_AUTHOR_NAME: blog-editor GIT_AUTHOR_EMAIL: editor@usj.cc MAX_UPLOAD_MB: "20" GIT_PATHS: content,static volumes: # 博客仓库的 git 工作区(不是镜像里带的,改完才能 commit + push) - /srv/blog:/blog # 回收目录放仓库外面,避免在 git status 里冒出来 - /srv/editor-trash:/app/trash healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8017/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 10s logging: driver: json-file options: max-size: "10m" max-file: "3"