mikochi 1.12.2 Docker Compose 部署指南

mikochi 1.12.2 Docker Compose 部署实战:栈编排文件(显式项目名/子网/端口)、首次启动登录认证(JWT 与限流实测)、目录浏览与 multipart 上传验证、数据持久化、环境变量表与重启后令牌失效等常见问题,全部命令含真实回显。

mikochimikochiGo自托管文件服务器2026/10/30

mikochi 1.12.2 Docker Compose 部署指南

目标:本篇在 Linux 服务器上以 Docker Compose 从零部署 mikochi 1.12.2 自托管文件浏览器,覆盖栈编排文件、首次启动登录认证、目录浏览与文件上传的实测验证及常见问题,全流程已在真实环境实测通过。

一、环境信息

  • 操作系统:Linux x86_64(内核 5.x 系列,Ubuntu 系发行版实测)
  • Docker:29.9.2(build a82e528)
  • Docker Compose:v5.6.1(v2 语法兼容)
  • mikochi:1.12.2(官方镜像 zer0tonin/mikochi:1.12.2,压缩体积 209MB,digest sha256:65ee9bf2f5315cef6a8caafa6bf9528bf998807be8a9872a38bf3627dbb4791c)
  • 服务端口:宿主机 8148 → 服务内部 8080(8148 为本机空闲端口,部署前需按实际情况确认)
  • 专用网络:mikochi-1.12.2-net(显式子网 10.89.56.0/24)
  • 数据目录:/opt/data/quzuo/tmp/mikochi/data(宿主机)→ /data(服务内,即 DATA_DIR)
  • 登录凭据:admin / q1w2e3r4(本文演示账号,生产环境请替换为强密码)
  • 版本发布时间:1.12.2 于 2026-10-15 发布(查询日期 2026-10-30)

二、镜像选型说明

mikochi 官方在 Docker Hub 发布镜像 zer0tonin/mikochi,同一 tag 提供多架构清单(amd64 / arm64 / armv7),官方 README 的部署示例即为该镜像,无需第三方转存。

  • tag 选型:生产环境固定具体版本 tag(如 1.12.2)而非 latest,便于回滚与审计。mikochi 的版本 tag 不带 v 前缀,与 GitHub Release tag 一致。
  • 镜像构成:单进程交付——Gin 服务同时承载 REST API 与前端静态文件(Preact SPA),无附属组件,无需数据库。
  • 升级路径:更新 tag 号后 docker compose up -d 重建即可;数据全部在外部挂载目录中,重建不丢数据(注意一个重启行为差异,见"十、常见问题"第 1 条)。

三、前置条件

  1. 已安装 Docker 与 Docker Compose v2+,且当前用户在 docker 用户组(或具备等效权限);
  2. 宿主机 8148 端口空闲(自检命令:ss -ltn | grep 8148,无输出即空闲);
  3. 规划好被浏览的数据目录(本文以 /opt/data/quzuo/tmp/mikochi/data 为例),mikochi 对该目录拥有读写权限;
  4. 若使用专用网络,选定一个未被占用的子网槽位(本文取 10.89.56.0/24,可用 docker network inspect 逐一核对已占网段)。

端口与网段占用自检:

ss -ltn | grep -E ':(8148)\b'
docker network ls -q | xargs -r docker network inspect --format '{{.Name}} {{range .IPAM.Config}}{{.Subnet}}{{end}}' | grep 10.89.56

两条命令均无输出,说明端口与子网均可用。

四、部署步骤

4.1 编排文件

在工作目录创建 docker-compose.yml(本文落盘于 /opt/data/quzuo/tmp/mikochi/),必须显式声明项目名 name: mikochi-1.12.2-stack,避免多套部署共存时项目同名互相覆盖:

name: mikochi-1.12.2-stack

services:
  web:
    image: zer0tonin/mikochi:1.12.2
    container_name: mikochi-1.12.2-web
    ports:
      - "8148:8080"
    environment:
      DATA_DIR: "/data"
      USERNAME: "admin"
      PASSWORD: "q1w2e3r4"
    volumes:
      - /opt/data/quzuo/tmp/mikochi/data:/data
    networks:
      - mikochi-net
    restart: unless-stopped

networks:
  mikochi-net:
    name: mikochi-1.12.2-net
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.56.0/24

配置要点:

  • container_name:按 <产品>-<版本>-<用途> 规范命名为 mikochi-1.12.2-web;
  • ports:宿主机 8148 映射服务内 8080(mikochi 固定监听 HOST 默认值 0.0.0.0:8080);
  • environment:DATA_DIR 指定被浏览的根目录,USERNAME/PASSWORD 为登录凭据(源码默认值为 root/pass,必须显式覆盖);
  • networks:显式命名网络并固定子网,防止与其他服务的动态网段冲突。

4.2 拉起服务

docker compose up -d

实测回显(逐行照抄):

 Network mikochi-1.12.2-net Creating
 Network mikochi-1.12.2-net Created
 Container mikochi-1.12.2-web Creating
 Container mikochi-1.12.2-web Created
 Container mikochi-1.12.2-web Starting
 Container mikochi-1.12.2-web Started

4.3 状态确认

docker ps --filter name=mikochi --format '{{.Names}} | {{.Status}} | {{.Ports}}'
docker inspect mikochi-1.12.2-web --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{.Gateway}}{{end}}'

实测回显:

mikochi-1.12.2-web | Up 3 seconds | 0.0.0.0:8148->8080/tcp, [::]:8148->8080/tcp
10.89.56.2 10.89.56.1

服务已在 8148 端口监听,专用网络内分配到 10.89.56.2。

五、首次启动认证

浏览器访问 http://<服务器IP>:8148,进入 mikochi 的登录页(Preact 单页应用,服务端首页响应实测为 489 字节的 <!doctype html> 文档,静态资源加载后渲染登录表单)。输入编排在 environment 中的用户名 admin 与密码 q1w2e3r4 完成登录,即可进入文件浏览界面。

登录动作对应 REST API 的 POST /api/login(前端表单底层即此接口),可用 curl 验证认证链路:

curl -s -X POST http://127.0.0.1:8148/api/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"q1w2e3r4"}'

实测回显(token 为 JWT,节选):

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6Im1pa29jaGktdXNlciIsImlzcyI6Ik1pa29jaGkiLCJleHAiOjE3OTU5NzUwNjksImlhdCI6MTc5MzM0NzA2OSwianRpIjoiNDk5OTM5MTEtODY3Yy00NDVlLWJhOGEtMGZiZDk1YjVhMTljIn0.d0tN0jDdvqgDYdWeaq8ePUhwc8Dm-rfQvXsjHLMD52Y"}

错误凭据与爆破防护的实测对照:

curl -s -X POST http://127.0.0.1:8148/api/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"wrong"}' -w ' [HTTP %{http_code}]'
{"err":"Invalid credentials"} [HTTP 401]

连续失败后触发指数退避限流,实测从第二次失败起返回:

{"err":"You are being rate limited"} [HTTP 429]

⚠️ 注意:未经认证直接访问 API 会得到 {"err":"Invalid Authorization header format"},登录令牌通过 Authorization: Bearer <token> 头随请求携带,服务端签发的令牌有效期约 730 小时(一个月)。

六、上传与浏览验证

部署是否真正可用,以目录浏览与文件上传两项核心操作实测为准。以下示例均携带上一步取得的令牌(以 $TOKEN 表示)。

6.1 浏览目录

curl -s http://127.0.0.1:8148/api/browse/ -H "Authorization: Bearer $TOKEN"

实测回显(数据目录中已预置两个测试文件):

{"fileInfos":[{"isDir":false,"size":14,"path":"/hello.txt"},{"isDir":false,"size":0,"path":"/sample.bin"}],"isRoot":true}

6.2 创建目录与上传

创建子目录 docs,并以 multipart 表单(字段名固定为 file)上传一个 2KB 测试文件:

curl -s -X PUT http://127.0.0.1:8148/api/mkdir/docs -H "Authorization: Bearer $TOKEN"
curl -s -X PUT http://127.0.0.1:8148/api/upload/docs/report.md \
  -F "file=@./data/hello.txt" -H "Authorization: Bearer $TOKEN"

实测回显:

{"status":"ok"}
{"status":"ok"}

再次浏览 docs 目录确认落盘:

curl -s http://127.0.0.1:8148/api/browse/docs -H "Authorization: Bearer $TOKEN"
{"fileInfos":[{"isDir":false,"size":14,"path":"/docs/report.md"}],"isRoot":false}

宿主机对应目录同步可见(bind mount 直接映射,ls data/docs 输出 report.md)。

6.3 模糊搜索与下载

搜索(search 参数在当前目录子树内模糊匹配):

curl -s "http://127.0.0.1:8148/api/browse/?search=sam" -H "Authorization: Bearer $TOKEN"
{"fileInfos":[{"isDir":false,"size":2048,"path":"/sample.bin"}],"isRoot":true}

目录打包下载(对目录路径请求流式接口,自动打包为 tar.gz):

curl -s "http://127.0.0.1:8148/api/stream/docs?auth=$SD" -o docs.tar.gz -w '[HTTP %{http_code}] bytes=%{size_download}\n'
[HTTP 200] bytes=124
docs.tar.gz: gzip compressed data, original size modulo 2^32 2048
/report.md

($SD 为对 /docs 申请的流式令牌,申请方式见 D 篇 API 使用详解。)

七、数据持久化说明

mikochi 是无状态服务,唯一需要持久化的就是 DATA_DIR 挂载目录:

  • bind mount 方案(本文采用):宿主机目录直接映射到服务内 /data,数据落在宿主机文件系统,备份(rsync/tar)与迁移(改路径)都最直观;
  • named volume 方案:volumes: [mikochi-data:/data],由编排工具管理存储位置,适合不想关心宿主机路径的场景。

服务重启、重建均不影响 DATA_DIR 内数据;文件的元信息(文件列表索引)在服务内内存中随目录变化实时重建,同样无需持久化。

⚠️ 注意:不要把系统根目录或含敏感凭据的目录挂为 DATA_DIR——官方安全须知明确提示此举在服务被攻破时后果严重。

八、环境变量表

部署可用的全部环境变量(默认值取自官方源码 main.go 的启动配置,实测值以 1.12.2 为准):

变量作用默认值本文取值
DATA_DIR被浏览的根目录/data/data(挂载宿主机目录)
USERNAME登录用户名rootadmin
PASSWORD登录密码passq1w2e3r4
HOST监听地址与端口0.0.0.0:8080默认(映射 8148)
JWT_SECRETJWT 签名密钥随机生成默认(每次重启随机)
CERT_CATLS 证书路径空(未启用)未启用
CERT_KEYTLS 证书私钥路径空(未启用)未启用
NO_AUTH关闭认证false默认
GZIP响应 gzip 压缩false默认
FRONTEND_FILES前端静态文件目录/usr/share/mikochi/static默认

各变量的详细行为、实测对照与生产建议见 《mikochi 1.12.2 配置参数详解》。

九、等价 docker run 命令

与上述编排文件等效的单条启动命令(来源为官方 README 的最小示例,凭据改用本文演示值):

docker run -d \
  --name mikochi-1.12.2-web \
  -p 8148:8080 \
  -v /opt/data/quzuo/tmp/mikochi/data:/data \
  -e DATA_DIR="/data" \
  -e USERNAME=admin \
  -e PASSWORD=q1w2e3r4 \
  --restart unless-stopped \
  zer0tonin/mikochi:1.12.2

单机自用与编排文件二选一即可;需要固定子网、纳入统一编排管理时建议用 Compose。

十、常用运维命令

以下命令均在编排文件所在目录执行(compose 语境,作用对象为本栈):

docker compose ps          # 栈内服务状态
docker compose logs -f web # 跟踪服务日志
docker compose restart web # 重启服务
docker compose down        # 停止并移除栈(网络/容器,不影响 data 目录)
docker compose up -d       # 修改编排/版本后重建

docker compose logs 实测回显(节选,Gin 请求日志逐请求一行):

[GIN] 2026/10/30 - 08:02:12 | 200 | 72.341µs |      10.89.56.1 | GET      "/api/stream-token?target=/sample.bin"
[GIN] 2026/10/30 - 08:02:12 | 200 |   93.6µs |      10.89.56.1 | GET      "/api/stream/sample.bin?auth=eyJ..."
2026/10/30 08:02:12 Failed login attempt for victim
[GIN] 2026/10/30 - 08:02:12 | 429 | 58.012µs |      10.89.56.1 | POST     "/api/login"

日志可直接看到请求耗时、来源地址、命中端点与登录失败告警,无需额外配置即可用于日常巡检。

十一、常见问题

Q1:服务重启后,之前登录的浏览器全部要求重新登录? 这是正常现象。JWT_SECRET 未显式设置时每次启动随机生成(官方有意为之,防止多进程共享固定密钥),重启后旧令牌签名失效。实测:重启前签发的令牌在重启后请求返回 {"err":"Failed to parse token"} [HTTP 401],重新登录即恢复。需要令牌跨重启有效时,显式固定 JWT_SECRET(注意固定密钥的安全代价,见配置篇)。

Q2:上传接口报 Couldn't read file from request? 上传端点要求 multipart 表单且字段名必须是 file。实测用 --data-binary 直传二进制体必报此错,改用 -F "file=@本地文件" 即成功返回 {"status":"ok"}。

Q3:流式链接在 VLC 里打不开? 流式令牌与申请时指定的目标路径一一绑定(scope 即文件路径),换文件必须重新申请;且令牌通过 auth 查询参数携带(不是 token 参数),实测传错参数名会得到 {"err":"Failed to parse token"}。完整申请与播放链路见 D 篇。

Q4:访问首页一直转圈或空白? 首页是 489 字节的 SPA 入口(实测 Content-Type: text/html; charset=utf-8),后续由浏览器加载 assets 下静态资源渲染。若静态资源 404,检查 FRONTEND_FILES 是否被改坏(默认 /usr/share/mikochi/static,容器内路径不建议动)。

Q5:删除操作能撤销吗? 不能。删除对应递归真删(含目录),且服务不提供回收站。重要数据请依赖宿主机层面的备份策略。

十二、参考链接