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-promptgpt-image2封面图状态:待生成;生成图片后替换本区块,正文结构无需改动。
【gpt-image2 提示词 · 封面图】
为「使用 Docker 部署 Lan-clip:在局域网里共享文字、图片和文件」技术教程设计封面图。
画面元素:中心是抽象化的局域网剪贴板卡片,不使用真实 Logo;左侧为 Docker 鲸鱼与单个容器;右侧为手机、笔记本和家庭 NAS;设备之间传递文字卡片、图片缩略图和文件图标;底部放简洁终端窗口;顶部预留中文标题区域,不生成文字。
现代极简 2.5D 技术插画,16:9,主色 #2496ED,辅色 #326CE5,背景 #F7F8FA,清晰线条,避免霓虹、赛博朋克和复杂粒子。
项目速览
| 项目 | 内容 |
|---|---|
| 项目 | cornradio/Lan-clip |
| 用途 | 局域网共享文字、图片和文件 |
| 最新 Release | v1.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-promptgpt-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。
应用进程同时提供网页和上传接口,数据写入容器内的六个位置。容器删掉后,未挂载的内容也会一起消失。
正在准备渲染...
查看源码
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.json、pwd.txt 和 perm_lock.json 必须先创建成文件,否则 Docker 可能在宿主机上创建同名目录。
正在准备渲染...
查看源码
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-promptgpt-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 空闲磁盘起步,文件实际占用另算。这是保守估算,不是官方承诺。
docker --version
docker compose version防火墙只需向可信局域网开放 TCP 5000。Ubuntu 使用 UFW 时,可以把 192.168.1.0/24 换成自己的局域网网段:
sudo ufw allow from 192.168.1.0/24 to any port 5000 proto tcp不用 Docker:源码运行
源码方式适合调试或修改界面。Dockerfile 明确使用 Python 3.11,照这个版本建虚拟环境最省事。
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 快速体验(临时)
临时体验可以直接启动:
docker run -d \
--name lan-clip \
--rm \
-p 5000:5000 \
kasusa/lan-clip:latest这条命令没有挂载数据,只适合试用。要保留内容,先建目录和文件:
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再启动持久化容器:
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 等价。
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:
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.jsondocker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 lan-clip浏览器打开 http://服务器IP:5000。手机打不开时,别输入 localhost:5000;localhost 指向手机自己。使用服务器的局域网地址,例如 http://192.168.1.20:5000。
修改操作密码
仓库 README 给出的默认全部删除密码是 1230,置顶、编辑和删除也使用 pwd.txt 中的密码。前面的准备步骤已经要求首次启动前设置密码;以后轮换时使用同样的隐藏输入方式:
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/:
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 或代理配置。
完全离线时:
# 有网络的机器
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 端口改为:
ports:
- "127.0.0.1:5000:5000"这会阻止其他主机绕过 HTTPS 直接访问容器。局域网设备若仍需直连,就不要这样绑定,改用防火墙限制来源网段。
固定镜像版本
别把 latest 当成可审计版本。官方 README 目前只公开示范 latest,而 GitHub Release v1.7.1 不代表 Docker Hub 一定有同名标签。部署前先记录实际镜像摘要:
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 保存权限保护是否启用。升级前短暂停服,可以得到一致快照:
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.json、pwd.txt 和 perm_lock.json 仍是普通文件,最后启动服务。
cd /opt/lan-clip
docker compose pull
docker compose up -d
docker compose logs --tail=100 lan-clip如果已经固定摘要,更新动作是先在测试机拉取 latest、验证,再把新摘要写回生产 Compose。回滚时换回旧摘要即可。
常见问题
配置文件变成目录
停止并删除容器,移走错误目录,再创建正确文件。不要删除 cards、uploads 或 images。
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手机无法访问
检查容器、端口和主机地址:
docker compose ps
ss -lnt | grep ':5000'
hostname -I手机和服务器要在同一可互访网段;访客 Wi-Fi 的 AP 隔离会阻止设备互相连接。
上传或保存时报权限错误
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 上实际拉取镜像或启动容器。完成部署后,至少执行以下验收:
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 放在开放端口之前。
参考资料
- Lan-clip GitHub 仓库与官方部署说明 - 核对日期:2026-08-28
- Lan-clip v1.7.1 Release - 发布于 2026-07-08
- 项目 Dockerfile - 端口与启动命令
- 应用源码
app.py-perm_lock.json、内容和上传目录的派生依据 - Docker Compose 规范 - Compose 转写规则