ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Files.md Docker部署完全指南:Dockerfile、compose与卷设计逐行讲解

Files.md Docker部署完全指南:Dockerfile、compose与卷设计逐行讲解 Files.md Docker部署完全指南Dockerfile、compose与卷设计逐行讲解【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.mdFiles.md 是一个私密、安静的 Markdown 笔记空间而自托管服务端正是它数据同步与多设备协作的核心。本文带你逐行拆解它的 Dockerfile 与 compose.yaml从多阶段构建、非 root 运行到 storage / tokens 两大卷的设计意图最后附一键启动与 HTTPS 开启步骤。无需深厚 Docker 背景跟着读一遍就能在自己机器上跑起 Files.md 服务端。为什么 Files.md 值得自己部署Files.md 的服务端承担两个角色见 cmd/server/server.go托管 PWA 网页应用——你在浏览器里打开的笔记界面提供同步 API——让多台设备上的 Markdown 文件保持一致可选配合 Telegram 机器人。用 Docker 部署的最大好处是一条命令启动、配置即文件、升级与备份都清晰。下面进入正题。Dockerfile 逐行解析多阶段构建整个构建分两阶段源码见 Dockerfile。构建阶段只负责编译不留下垃圾FROM golang:1.24-alpine AS build WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . ARG VERSIONdev RUN CGO_ENABLED0 GOOSlinux go build \ -ldflags -s -w -X main.Version${VERSION} \ -o /out/server ./cmd/server关键点COPY go.mod go.sum ./单独一层依赖没变时复用缓存二次构建飞快这是 Go 项目的标准优化写法CGO_ENABLED0产出静态链接的二进制不依赖 glibc为后续塞进极简的 alpine 镜像铺路-s -w剥掉符号表和调试信息二进制更小ARG VERSIONdev构建时可以用--build-arg VERSIONv1.0注入版本号写进二进制便于排查线上跑的是哪个版本。运行阶段最小化 安全FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata \ addgroup -g 1000 app adduser -D -u 1000 -G app app WORKDIR /app COPY --frombuild /out/server /app/server COPY web /app/web RUN mkdir -p /app/storage /app/tokens chown -R app:app /app VOLUME [/app/storage, /app/tokens] USER app ENTRYPOINT [/app/server]这一阶段值得逐条品味运行镜像只有 alpine 证书 时区包编译工具链全部被丢在第一阶段最终镜像体积极小攻击面也小adduser -u 1000预建 UID 1000 的app用户。自托管场景下很多人习惯用 1000 号用户挂主机目录权限不会打架COPY web /app/web网页前端直接静态拷贝进镜像服务端按 server/sync/webserver.go 里的路由把 PWA 托管出来不需要额外的 NginxUSER app容器不以 root 运行这是自托管服务的基本安全素养。卷设计详解storage 与 tokens 各装什么VOLUME [/app/storage, /app/tokens]声明了两个数据目录理解它们是理解整个部署的关键卷容器内路径存放内容丢了会怎样storage/app/storage用户的全部 Markdown 笔记、附件、习惯记录等数据全丢且无法恢复tokens/app/tokens设备登录令牌SHA-256 哈希 盐值见 server/sync/tokens.go所有已登录设备需要重新绑定两个目录都被显式声明为卷意味着即使你docker compose down重建容器数据也不会被打包进可丢弃的镜像层。官方文档 docs/your-own-server.md 在迁移服务器一节也印证了这一点——迁移只需要打包这两个目录即可。compose.yaml 逐行解析配置文件见 compose.yaml结构非常精简services: files-md: build: . image: files-md ports: - 80:8080 volumes: - storage:/app/storage - tokens:/app/tokens environment: APP_URL: http://localhost STORAGE_DIR: /app/storage TOKENS_DIR: /app/tokens CERT_DIR: restart: unless-stopped volumes: storage: tokens:端口映射80:8080 的由来CERT_DIR为空时服务监听8080本地模式一旦设置CERT_DIR则改为443HTTPS 80ACME 验证逻辑见 server/sync/webserver.go 和 server/sync/autocert.go。compose 里预留了被注释的# - 443:443就是为了这个切换。环境变量全部来自配置结构体五个环境变量一一对应 server/config/config.go 中的Config字段STORAGE_DIR/TOKENS_DIR指定数据目录与卷挂载点对齐注意config.go的默认值其实是/tmpcompose 里必须显式覆盖否则数据会写进易失路径APP_URL网页应用的外访地址用于校验请求 Host 与 CORS 白名单API_URL默认注释留空则同步 API 不启用服务端只跑网页想让多设备同步/Telegram 机器人落盘把它解开并填上域名CERT_DIR见下一节。restart: unless-stopped宿主机重启或 Docker 守护进程重启后自动拉起服务除非你手动docker compose down——自托管的免 babysit保险丝。一键启动从 clone 到访问在服务器上执行git clone https://gitcode.com/GitHub_Trending/fi/files.md cd files.md docker compose up -d构建完成后访问http://你的服务器IP就能打开 Files.md 的 PWA 界面。首次打开是空的工作区左侧栏即笔记目录体验如下如果同步功能已启用设置了API_URL设备间会走syncFilenames/syncFile等接口按 mtime 判断变更迁移数据时 mtime 会被完整保留。进阶一条配置开启 HTTPS 自动证书Files.md 内置了 Lets Encrypt 自动签证书能力server/sync/autocert.go改动只有两处compose.yaml中把CERT_DIR改成持久路径如/app/certs并追加一个卷挂载取消# - 443:443注释同时保留 80 端口ACME http-01 验证走 80。然后docker compose up -d证书自动申请并缓存在CERT_DIR里续签全自动——这也是cert_dir必须持久化的原因。备份与迁移建议日常备份只需docker run --rm -v files_md_storage:/d alpine tar czf /backup/storage.tgz -C /d .打包storage卷tokens卷同理跨机迁移完整步骤含先停写、再打包、后更新客户端 ApiHost见 docs/your-own-server.md 的Transfer files to another server一节官方还推荐在 storage 里git init cron 每日提交把笔记本身当版本库再保险一层。部署完跑一段时间后多窗口编辑、笔记互链的体验正是 Files.md 的看家功能小结Dockerfile多阶段构建 静态二进制 非 root 用户产物极小且干净卷storage存笔记、tokens存登录态是备份与迁移的全部关键compose80:8080是本地模式设CERT_DIR即切换到 443 自动 HTTPSAPI_URL决定是否开放同步 API一句话docker compose up -d之后你的 Markdown 私有云就跑起来了。【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.md创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表