• 局域网内传输工具snapdrop


    局域网内传输工具snapdrop
      本文不会详细介绍太多部署上的过程,该注意的点会指出来。
      首先看下人家部署好的,有个感性认识:https://drop.esonwong.com/。如果在公司,可以跟公司同事分别打开这个网址,找到浏览器分配给对方的唯一标识名,就能传输文件了。

       老板当时发了这个链接让我部署:https://www.creeper.me/185,docker部署方式,而且叫我在公司内网部署(我确定我没听错,他后来还说内网肯定不行)。 可能他觉得用docker方式部署简单、方便,拉人家镜像下来就能跑。周三(9月7日)他临下班的时候才发来,我在内网运行index.js,说我没有部署npm环境

    cd snapdrop/server
    #运行index.js
    npm install
    node index.js

    注意点一:

      部署snapdrop,需要依赖npm环境,不管是docker、还是直接在操作系统部署。装的时候不要随便找,不然node和npm版本对不上,后续运行index.js 也是会报错。

    附上安装过程:

    (1)官网地址下载:https://nodejs.org/zh-cn/download/releases/,我这里装的是v16.4.1,直接把这个 node-v16.4.1-linux-x64.tar.gz 下载下来就行,里面有npm

    (2)服务器安装

    cd /usr/local/src
    rz 上传 node-v16.14.1-linux-x64.tar.gz
    
    mkdir /usr/local/node
    mv  /usr/local/src/node-v16.14.1-linux-x64   /usr/local/node/
    ln -s /usr/local/node/node-v16.14.1-linux-x64/bin/node /usr/local/bin/node
    ln -s /usr/local/node/node-v16.14.1-linux-x64/bin/npm /usr/local/bin/npm

     注意点二:

      我把这个在公司内网docker版本部署坑,都总结下:

    (1)docker-compose.yml 里面的 working_dir 不需要自己创建,那是docker容器里面的。我当时傻傻的还建个node用户,还建了个 /home/node/app 目录 = =

    跑起来有两个docker服务

    其中端口18080、1443是我改了 docker-compose.yml 映射到容器外的端口

    (2)公司内网虚拟机部署方式,不能用!

      如果在公司内网虚拟机上部署,无论是我后面说的直接在操作系统部署的方式,还是docker这种,局域网内两个设备打开都无法找到对方,进而传输文件

    (3)线上服务器docker方式部署,配置nginx域名方式访问,能搜到非局域网内其他设备,但传输不了。

      当时部署的线上服务器已经跑有nginx,于是申请了域名转发到docker跑的端口18080。非同一个局域网,打开snapdrop部署的域名,其他设备都能看到。eg,我在家里的网络打开,另一个人在公司打开该域名,我们能互相看到对方,但不能传输,

     1 server {
     2     listen 443 ssl http2;
     3     server_name xx.xxx.net; 
     4     charset utf-8;
     5 
     6     ssl_certificate xxx.pem;
     7     ssl_certificate_key xxx.key;
     8 
     9     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    10     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    11     ssl_prefer_server_ciphers on;
    12     ssl_session_timeout 5m;
    13     add_header Strict-Transport-Security "max-age=31536000";
    14 
    15     location / {
    16         proxy_pass http://localhost:18080;
    17         proxy_http_version 1.1;
    18         proxy_set_header Upgrade $http_upgrade;
    19         proxy_set_header Connection "upgrade";
    20         proxy_set_header X-Forwarded-for $remote_addr;
    21         access_log /home/cudo/app/nginx/logs/snapdrop.log json;
    22     }
    23 
    24     # Websocket 需要协议升级
    25     location /server {
    26         proxy_pass http://localhost:18080;
    27         proxy_http_version 1.1;
    28         proxy_set_header Upgrade $http_upgrade;
    29         proxy_set_header Connection "upgrade";
    30         proxy_set_header X-Forwarded-for $remote_addr;
    31         
    32     }
    33 }
    View Code

       比较奇怪的地方,“端口+ip”形式直接访问服务的形式,不同局域网的设备就无法看到。eg,服务器ip为:14.xx.xx.3,浏览器打开:14.xx.xx.3:18080,不会看到局域网以外的设备。

      我特意测过,是 X-Forwarded-for 控制的,去掉的话,连ip+端口访问都能看到局域网以外设备。

    proxy_set_header X-Forwarded-for $remote_addr;
      老板觉得能这个非局域网外都能看到自己设备的bug,太影响体验。于是叫重装,找来另一个直接在操作系统部署的版本,在自由服务器上部署snapdrop【
     
     注意点三:
      在自由服务器上部署snapdrop,这个部署比docker版本确实简单,也没有那个非局域网外能搜到对方设备的问题。
      唯一麻烦是,装 pm2 比较迷幻。真的很迷幻,阴差阳错地装好(我自己也没搞明白怎么装好的,当时加班,老板一边跟人讨论事情,一边不定时问我弄好没有,可能比较幸运莫名其妙装好了,第二天在公司内网服务器装,没装成功只装到一个pm2命令,但用不了,于是直接把这个装好pm2的目录整个打包复制才能用,所以抱歉给不了大家方法怎么装好pm2了)。
      只知道 uuid 的版本要跟上,不然报错如下:

     装好应该会在:/usr/local/node/node-v16.14.1-linux-x64/lib/node_modules,看到 uuid 和 pm2。

    pm2目录里面有这个东西,bin目录下才有 pm2命令

    (1)pm2要做下软连接,不然普通用户可能会用不了

     ln -s /usr/local/node/node-v16.14.1-linux-x64/lib/node_modules/pm2/bin/pm2 /bin/pm2

    (2)如果要改运行端口(默认是3000),需要修改 index.js 文件

      因为服务器上3000端口被grafana 用了,当时为了快点弄好,直接停掉grafana给 snapdrop 用。如下是改成 3002 端口

    最后跑启动snapdrop命令:pm2 start index.js

     挺好看的~~

      顺便科普下,PM2 是一个带有负载均衡功能的Node 应用的进程管理器,详情可以看下:https://pm2.keymetrics.io/docs/usage/quick-start/

    (3)nginx配置

    a)主配置文件:

    http {
    。。。
        #websocket 需要加下这个
        map $http_upgrade $connection_upgrade {
            default upgrade;
            ''      close;
        }
    。。。
    
    }

    b)虚拟主机配置文件:

     1 server {
     2     listen 80;
     3     server_name xxx.xxx.net;
     4     return 301 https://xxx.xxx.net$request_uri;
     5 }
     6 
     7 
     8 server {
     9     listen 443 ssl http2;
    10     server_name xxx.xxx.net; 
    11     charset utf-8;
    12 
    13 
    14     ssl_certificate xxx.pem;
    15     ssl_certificate_key xx.key;
    16 
    17     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    18     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    19     ssl_prefer_server_ciphers on;
    20     ssl_session_timeout 5m;
    21     add_header Strict-Transport-Security "max-age=31536000";
    22 
    23     location / {
    24         proxy_pass http://127.0.0.1:3002;
    25         proxy_set_header Upgrade $http_upgrade;
    26         proxy_set_header Connection $connection_upgrade;
    27         proxy_set_header X-Forwarded-for $remote_addr;
    28     }
    29 
    30 }
    View Code
  • 相关阅读:
    Codeforces 749C【模拟】
    Codeforces 358D【DP】
    Lightoj1122 【数位DP】
    Codeforces 744C【DFS】
    大晚上就是想说说话
    HDU5997 【线段树】
    codeforces743D 【DFS】
    lightoj 1422【区间DP·分类区间首元素的情况】
    lightoj 1125【背包·从n个选m个】
    Lightoj 1147【DP】
  • 原文地址:https://www.cnblogs.com/windysai/p/16685948.html
Copyright © 2020-2023  润新知