托管了一个 Snapdrop 自己用

Snapdrop 是一个很方便的跨平台文件传输工具,直接打开浏览器就能用:

于是想着自己建一个,基于 Docker 挺简单的,先克隆代码:

git clone https://github.com/RobinLinus/snapdrop.git

然后使用 docker-compose.yml 文件:

version: "3"
services:
  node:
    image: "node:lts-alpine"
    working_dir: /home/node/app
    restart: unless-stopped
    volumes:
      - ./server/:/home/node/app
    command: ash -c "npm i && node index.js"

  nginx:
    container_name: snapdrop
    image: "nginx:stable"
    restart: unless-stopped
    volumes:
      - ./client:/usr/share/nginx/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/certs:/etc/ssl/certs
      - ./docker/openssl:/mnt/openssl
    ports:
      - "8080:80"
      - "443:443"
    env_file: ./docker/fqdn.env
    entrypoint: /mnt/openssl/create.sh
    command: ["nginx", "-g", "daemon off;"]

然后 docker-compose up -d 就能 IP:8080 访问了。

4 个赞

想試著傳個東西,但不知道怎麼用。

群晖的话,直接搜就有,开箱即用 seji/snapdrop-docker

1 个赞

因为sd使用相同IP来分组识别的,如果托管在内网自己用,要修改:

方法1)nginx的“location /server”中“proxy_set_header X-Forwarded-for $remote_addr;”改为“proxy_set_header X-Forwarded-for $host;”

方法2)对“server/index.js”执行以下命令,替换内容
sed -i ‘s/peer.ip/0/g’ index.js
sed -i ‘s/sender.ip/0/g’ index.js

公网用代理的话,想和通网络其他不用代理的用户互通的话:
1、代理分流把snapdrop排除不走代理
或者2、代理支持“ X-Forwarded-for”传递客户端IP

如果已有nginx,可以不要docker里的,合并部署到自己的nginx:

#docker-compose.yml参考

version: "3"
services:
  node:
    container_name: snapdrop
    image: "node:lts-alpine"
    working_dir: /home/node/app
    restart: always
    volumes:
      - ./server/:/home/node/app
    ports:
      - "127.0.0.1:3000:3000"
    command: ash -c "npm i && node index.js"

#nginx.conf参考

server {
	listen 0.0.0.0:443 ssl http2;

	ssl_certificate /xxx/xxx.cer;
	ssl_certificate_key /xxx/xxx.key;

	server_name xxx;
	
	access_log log/xxx.log main;
	error_log log/xxx.error.log;

	expires epoch;

	location / {
		root   /xxx/client;
		index  index.html index.htm;
	}

	location /server {
		proxy_connect_timeout 300;
		proxy_pass http://127.0.0.1:3000;
		proxy_set_header Connection "upgrade";
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header X-Forwarded-for $remote_addr;
	}

	location /ca.crt {
		alias /xxx/docker/certs/snapdropCA.crt;
	}

	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /xxx/client;
	}
}
1 个赞

最后再补充一个,浏览器必须双方支持WebRTC,否则点击发送消息和文件是没有响应的,也没有错误提示,控制台提示如下所示。测试chrome和edge都可以,手机上有些不行,特别是系统自带的,装个手机版的edge即可

network.js:404
Uncaught TypeError: this.peers[message.to].sendText is not a function
    at PeersManager._onSendText (network.js:404:32)
    at network.js:370:42
    at Function.fire (network.js:509:16)
    at SendTextDialog._send (ui.js:344:16)
    at HTMLFormElement.<anonymous> (ui.js:319:53)

network.js:400
Uncaught TypeError: this.peers[message.to].sendFiles is not a function
    at PeersManager._onFilesSelected (network.js:400:32)
    at network.js:369:47
    at Function.fire (network.js:509:16)
    at PeerUI._onFilesSelected (ui.js:146:16)
    at HTMLInputElement.<anonymous> (ui.js:111:72)
1 个赞

utools上的一个小工具,已经非常成熟了

1 个赞

Snapdrop 无论哪个托管站点的,有个情况:PC 端开了代理软件的,比如 Clash for Windows,就无法与手机相互发现。这个要咋办,是分流规则的原因吗?

我没遇到这个情况…

比如官方的 https://snapdrop.net 以及第三方的 https://drop.ioiox.com,我都碰到过~

具体你看日志就知道了

可以在分流规则里加上

3 个赞

我使用docker 搭建,初次搭建完成,他会一直显示 Connect 失败。
参考 issue 后,解决。
我先

docker-compose up

会报错 ,和上那个issue差不多的报错,记不太清了,差不多是permissions issue

仔细看docker配置的话可以发现它把Linux目录内的文件夹映射到docker里面,而docker没有修改权限。
我还发现docker 创建了文件夹,xxx/snapdrop/server/node_modules 他的用户和组是 1000/1000。 于是 我用 chown -R 1000:1000 xxx/snapdrop/server/ 修改权限。问题解决。

docker-compose up -d

打开网站就不会连接不上了。
前面的nginx和docker配置很有帮助,这个软件也挺方便的。

:joy:微软整了个Edge Drop。



1 个赞

新版本嘛

Dev版本。

Android 是哪个版本?我的没有这功能…

安卓也是Dev。

:joy:靠,奇了怪了,iOS Beta通道Edge上线了Drop功能,但Win Dev通道Edge Drop按钮却消失了。但用手机端Drop给PC端发消息,PC端还能收到,还能激活Drop功能,但关掉后依然没有功能入口。

还有个问题,如果手机端浏览器经过了clash,也无法与电脑相互发现,关了就好了。不知道手机端clash有没有什么排除的方法?