Skip to content

Docker 部署 Lan-clip:在局域网里共享文字、图片和文件

微信文件传输助手能跨设备,但内容会经过外部服务;NAS 共享目录适合文件,却不适合临时复制一段文字。Lan-clip 把这类短时传递放回局域网:浏览器打开一个地址,就能粘贴文字、图片和文件。

这套部署只需要一个容器。下面同时给出源码运行、docker run 和 Docker Compose 配置,并把容易丢数据的挂载问题单独讲清楚。

资料核对时间:2026-08-19。项目最新 GitHub Release 为 v1.7.1;官方 README 的 Docker 命令使用 kasusa/lan-clip:latest,没有提供与 Release 同名的镜像标签,也没有官方 Compose 文件。本文的 Compose 配置由官方 docker run 参数等价改写。

配图占位:封面图(待生成)

标签:image-prompt gpt-image2 封面图 状态:待生成;生成图片后替换本区块,正文结构无需改动。

【gpt-image2 提示词 · 封面图】

为「使用 Docker 部署 Lan-clip:在局域网里共享文字、图片和文件」技术教程设计封面图。

画面元素:中心是抽象化的局域网剪贴板卡片,不使用真实 Logo;左侧为 Docker 鲸鱼与单个容器;右侧为手机、笔记本和家庭 NAS;设备之间传递文字卡片、图片缩略图和文件图标;底部放简洁终端窗口;顶部预留中文标题区域,不生成文字。

现代极简 2.5D 技术插画,16:9,主色 #2496ED,辅色 #326CE5,背景 #F7F8FA,清晰线条,避免霓虹、赛博朋克和复杂粒子。

项目速览

项目内容
项目cornradio/Lan-clip
用途局域网共享文字、图片和文件
最新 Releasev1.7.1,发布于 2026-07-08
GitHub 数据55 Stars / 3 Forks(2026-08-19)
Docker 镜像kasusa/lan-clip:latest
容器端口5000/tcp
运行方式Python 3.11 + Waitress + Flask
外部依赖无数据库、缓存或队列
开源协议仓库未声明 License
复杂度L1,单容器 + 本地文件持久化
GitHub 地址cornradio/Lan-clip
官方镜像Docker Hub · kasusa/lan-clip:latest
快速体验docker run 临时试用,不挂载数据;正式部署使用 Compose

Lan-clip 适合家里、工作室或可信办公网中的临时传递,并支持多设备同步刷新、URL 自动识别,以及带密码的置顶、编辑和删除操作。

Lan-clip 不是端到端加密的公网文件服务。跨公网使用时,应放在 HTTPS 反向代理或 VPN 后面;对外直接暴露 5000 端口不合适。LocalSend 更适合设备间点对点传输大文件,成熟网盘则在用户权限、审计和长期归档上更完整。

Lan-clip 如何保存数据

配图占位:架构部署图(待生成)

标签:image-prompt gpt-image2 架构部署图 状态:待生成;生成图片后替换本区块,正文结构无需改动。

【gpt-image2 提示词 · 架构部署图】

生成一张「Lan-clip Docker 部署架构图」技术信息图。

左侧为手机和电脑浏览器;中间为可选 HTTPS 反向代理;右侧 Docker Host 中只有一个 Lan-clip 容器,标注 Waitress + Flask、TCP 5000;底部是六个持久化目标:cards、uploads、images 三个目录,以及 pinned.json、pwd.txt、perm_lock.json 三个文件。箭头展示 HTTP/HTTPS 请求和文件写入方向。

16:9,中文标签,PingFang SC,容器用圆角矩形,目录用文件夹图标,配置文件用文档图标;主色 #2496ED,辅色 #326CE5,背景 #F7F8FA,不使用真实 Logo,不增加数据库或 Redis。

应用进程同时提供网页和上传接口,数据写入容器内的六个位置。容器删掉后,未挂载的内容也会一起消失。

Mermaid 流程图
查看源码
flowchart LR
    client["手机 / 电脑浏览器"] -->|"HTTP 5000 或 HTTPS"| proxy["可选反向代理"]
    proxy --> app["Lan-clip 容器<br/>Waitress + Flask"]
    app --> cards[("cards<br/>卡片数据")]
    app --> uploads[("uploads<br/>上传文件")]
    app --> images[("images<br/>图片")]
    app --> config["pinned.json + pwd.txt + perm_lock.json"]

启动流程也很短,真正的坑在文件挂载:pinned.jsonpwd.txtperm_lock.json 必须先创建成文件,否则 Docker 可能在宿主机上创建同名目录。

Mermaid 流程图
查看源码
flowchart TD
    start(["开始"]) --> prepare["创建目录和三个配置文件"]
    prepare --> compose["保存 compose.yaml"]
    compose --> pull["拉取 kasusa/lan-clip:latest"]
    pull --> up["docker compose up -d"]
    up --> check{"容器是否运行"}
    check -->|"是"| access["访问 http://服务器IP:5000"]
    check -->|"否"| logs["docker compose logs --tail=100"]
    logs --> fix["修复端口、权限或挂载类型"]
    fix --> up
配图占位:容器启动流程图(待生成)

标签:image-prompt gpt-image2 容器启动流程图 状态:待生成;生成图片后替换本区块,正文结构无需改动。

【gpt-image2 提示词 · 启动流程】

生成 Lan-clip Docker Compose 启动流程图:创建 cards、uploads、images 目录 → 预先创建 pinned.json、pwd.txt 和 perm_lock.json 文件 → 保存 compose.yaml → 拉取 kasusa/lan-clip:latest → 启动容器 → 检查状态。异常分支进入日志排查,并突出“配置文件不能被 Docker 创建成目录”这一风险。

竖向流程信息图,4:5,中文标签,Docker 蓝主色,风险节点使用橙色,浅色背景,文字清楚,适合技术博客正文。

部署前准备

一台装有 Docker Engine 和 Docker Compose v2 的 Linux 主机即可。官方没有给出最低硬件指标;这个项目没有独立数据库,个人局域网使用可从 1 核 CPU、512 MB 可用内存和 1 GB 空闲磁盘起步,文件实际占用另算。这是保守估算,不是官方承诺。

bash
docker --version
docker compose version

防火墙只需向可信局域网开放 TCP 5000。Ubuntu 使用 UFW 时,可以把 192.168.1.0/24 换成自己的局域网网段:

bash
sudo ufw allow from 192.168.1.0/24 to any port 5000 proto tcp

不用 Docker:源码运行

源码方式适合调试或修改界面。Dockerfile 明确使用 Python 3.11,照这个版本建虚拟环境最省事。

bash
git clone https://github.com/cornradio/Lan-clip.git
cd Lan-clip
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.py

开发服务器启动后访问 http://服务器IP:5000。长期运行仍推荐容器版,依赖和启动命令更容易固定。

Docker 快速体验(临时)

临时体验可以直接启动:

bash
docker run -d \
  --name lan-clip \
  --rm \
  -p 5000:5000 \
  kasusa/lan-clip:latest

这条命令没有挂载数据,只适合试用。要保留内容,先建目录和文件:

bash
sudo mkdir -p /opt/lan-clip/cards /opt/lan-clip/uploads /opt/lan-clip/images
read -rsp '设置 Lan-clip 操作密码:' LAN_CLIP_PASSWORD; echo
printf '%s\n' "$LAN_CLIP_PASSWORD" | sudo tee /opt/lan-clip/pwd.txt >/dev/null
unset LAN_CLIP_PASSWORD
printf '[]\n' | sudo tee /opt/lan-clip/pinned.json >/dev/null
printf '{"enabled":false}\n' | sudo tee /opt/lan-clip/perm_lock.json >/dev/null
sudo chown -R "$(id -u):$(id -g)" /opt/lan-clip

再启动持久化容器:

bash
docker run -d \
  --name lan-clip \
  --restart unless-stopped \
  -p 5000:5000 \
  -v /opt/lan-clip/cards:/app/cards \
  -v /opt/lan-clip/uploads:/app/uploads \
  -v /opt/lan-clip/images:/app/images \
  -v /opt/lan-clip/pinned.json:/app/pinned.json \
  -v /opt/lan-clip/pwd.txt:/app/pwd.txt \
  -v /opt/lan-clip/perm_lock.json:/app/perm_lock.json \
  kasusa/lan-clip:latest

官方 README 使用 chmod 777 解决权限问题。这种做法能运行,但会让所有本机用户都可写;这里先让当前用户拥有目录。若日志出现 Permission denied,再依据容器实际 UID 调整所有者,不要直接把整棵目录永久设成 777。

用 Docker Compose 部署

Compose 便于把端口、卷和重启策略留在一个文件里。下面配置与官方持久化 docker run 等价。

bash
sudo mkdir -p /opt/lan-clip/cards /opt/lan-clip/uploads /opt/lan-clip/images
read -rsp '设置 Lan-clip 操作密码:' LAN_CLIP_PASSWORD; echo
printf '%s\n' "$LAN_CLIP_PASSWORD" | sudo tee /opt/lan-clip/pwd.txt >/dev/null
unset LAN_CLIP_PASSWORD
printf '[]\n' | sudo tee /opt/lan-clip/pinned.json >/dev/null
printf '{"enabled":false}\n' | sudo tee /opt/lan-clip/perm_lock.json >/dev/null
sudo chown -R "$(id -u):$(id -g)" /opt/lan-clip
cd /opt/lan-clip

保存为 /opt/lan-clip/compose.yaml

yaml
services:
  lan-clip:
    image: kasusa/lan-clip:latest
    container_name: lan-clip
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - ./cards:/app/cards
      - ./uploads:/app/uploads
      - ./images:/app/images
      - ./pinned.json:/app/pinned.json
      - ./pwd.txt:/app/pwd.txt
      - ./perm_lock.json:/app/perm_lock.json
bash
docker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 lan-clip

浏览器打开 http://服务器IP:5000。手机打不开时,别输入 localhost:5000localhost 指向手机自己。使用服务器的局域网地址,例如 http://192.168.1.20:5000

修改操作密码

仓库 README 给出的默认全部删除密码是 1230,置顶、编辑和删除也使用 pwd.txt 中的密码。前面的准备步骤已经要求首次启动前设置密码;以后轮换时使用同样的隐藏输入方式:

bash
read -rsp '输入新的 Lan-clip 操作密码:' LAN_CLIP_PASSWORD; echo
printf '%s\n' "$LAN_CLIP_PASSWORD" | sudo tee /opt/lan-clip/pwd.txt >/dev/null
unset LAN_CLIP_PASSWORD
cd /opt/lan-clip
docker compose restart lan-clip

不要把真实密码写进 Compose 文件、Shell 历史或本文。pwd.txt 已经纳入备份范围。

国内镜像加速

官方镜像是第三方 Docker Hub 镜像,替换前缀时不要加 library/

bash
docker pull docker.1ms.run/kasusa/lan-clip:latest
docker pull docker.m.daocloud.io/kasusa/lan-clip:latest
docker pull docker.1panel.live/kasusa/lan-clip:latest
docker pull docker-0.unsee.tech/kasusa/lan-clip:latest

拉取成功后,可以在 compose.yaml 中把 image 改成成功的完整地址。公共代理会调整可用性,失败时换下一个;生产机更适合配置云厂商专属加速或内部 Registry。

全局 Registry 配置会影响宿主机上的所有容器,不在本文直接改写 /etc/docker/daemon.json。需要全局加速时,先读取现有 JSON,再按云厂商文档合并 registry-mirrors,校验 JSON 后才重启 Docker;不要用只含镜像源的示例覆盖日志驱动、私有 Registry 或代理配置。

完全离线时:

bash
# 有网络的机器
docker pull kasusa/lan-clip:latest
docker save kasusa/lan-clip:latest -o lan-clip.tar

# 目标机器
docker load -i lan-clip.tar

安全边界:HTTPS 与公网访问

Lan-clip 的容器只提供 HTTP。仅在家用可信网访问时,可以保留 5000 端口;跨公网访问应选下面一种:

  • 通过 WireGuard、Tailscale 等 VPN 进入局域网,不公开应用端口。
  • 用 Caddy 或 Nginx 终止 HTTPS,并把 5000 只绑定到 127.0.0.1

使用反向代理时,将 Compose 端口改为:

yaml
ports:
  - "127.0.0.1:5000:5000"

这会阻止其他主机绕过 HTTPS 直接访问容器。局域网设备若仍需直连,就不要这样绑定,改用防火墙限制来源网段。

固定镜像版本

别把 latest 当成可审计版本。官方 README 目前只公开示范 latest,而 GitHub Release v1.7.1 不代表 Docker Hub 一定有同名标签。部署前先记录实际镜像摘要:

bash
docker pull kasusa/lan-clip:latest
docker image inspect --format '{{index .RepoDigests 0}}' kasusa/lan-clip:latest

把输出的 kasusa/lan-clip@sha256:... 原样写入 Compose 的 image:。这样以后 docker compose pull 不会悄悄换成另一份镜像。

备份、恢复、升级与回滚

六个持久化目标必须一起备份,其中 perm_lock.json 保存权限保护是否启用。升级前短暂停服,可以得到一致快照:

bash
cd /opt/lan-clip
docker compose stop
sudo tar -czf "/opt/lan-clip-backup-$(date +%F).tar.gz" \
  cards uploads images pinned.json pwd.txt perm_lock.json compose.yaml
docker compose up -d

恢复时先停止容器,再把归档解压回 /opt/lan-clip,确认 pinned.jsonpwd.txtperm_lock.json 仍是普通文件,最后启动服务。

bash
cd /opt/lan-clip
docker compose pull
docker compose up -d
docker compose logs --tail=100 lan-clip

如果已经固定摘要,更新动作是先在测试机拉取 latest、验证,再把新摘要写回生产 Compose。回滚时换回旧摘要即可。

常见问题

配置文件变成目录

停止并删除容器,移走错误目录,再创建正确文件。不要删除 cards、uploads 或 images。

bash
cd /opt/lan-clip
docker compose down
sudo mv pinned.json pinned.json.bad-directory
printf '[]\n' | sudo tee pinned.json >/dev/null
sudo mv pwd.txt pwd.txt.bad-directory
sudo touch pwd.txt
sudo mv perm_lock.json perm_lock.json.bad-directory
printf '{"enabled":false}\n' | sudo tee perm_lock.json >/dev/null
docker compose up -d

手机无法访问

检查容器、端口和主机地址:

bash
docker compose ps
ss -lnt | grep ':5000'
hostname -I

手机和服务器要在同一可互访网段;访客 Wi-Fi 的 AP 隔离会阻止设备互相连接。

上传或保存时报权限错误

bash
docker compose logs --tail=100 lan-clip
ls -ld /opt/lan-clip/{cards,uploads,images}
ls -l /opt/lan-clip/{pinned.json,pwd.txt,perm_lock.json}

根据日志显示的 UID/GID 调整所有者。别先清空数据目录,这类错误通常不是数据损坏。

部署验证

本稿已完成官方仓库、Dockerfile、镜像命令和 Compose 等价配置的静态核对;尚未在可用 Docker daemon 上实际拉取镜像或启动容器。完成部署后,至少执行以下验收:

bash
docker compose ps
curl -fsS -o /dev/null -w 'http_status=%{http_code}\n' http://127.0.0.1:5000/
docker compose logs --tail=100 lan-clip

再创建一条文字卡片、上传一张图片和一个文件,启用权限保护,重启容器后确认内容仍可读取且权限开关没有复位;这部分属于用户运行证据,不能由静态检查代替。

总结

先在可信局域网内跑一天,确认文字、图片、文件和删除操作都能跨设备同步;然后改默认密码、做一次可恢复的备份,并记录镜像摘要。需要跨公网时,把 HTTPS 或 VPN 放在开放端口之前。

参考资料

全部公开文章由同一个站点构建和发布。