概述

今天看到我的 Goland 可以更新了,于是简单看了一下 Release Note,发现了一个似乎期待已久的功能:Code With Me,这个功能有点类似于 VSCode 中的 Remote Developer,但是 Jetbrains 以自己的方式实现成另外一种形式,于是我就体验了一把,顺便写了一下入坑指南。

那首先,如果你需要玩这个功能,你得升级你的 IDE 到 2020.3 版本,这是当前最新的版本了。

简单使用

简单使用其实就是 JetBrains 家的指导了,真的很简单了,只需要复制一个分享链接,然后给别人,别人在浏览器打开就可以了,后续直接就等待客户端安装之类的,不一会就连接上了,具体的步骤为:

共享方

  1. 安装 “Code With Me ”插件

  2. 在界面上点击共享按钮

  3. 然后选择分享的权限,复制分享链接,然后发给对方即可

    我是全选的,你可以按照自己的需求来。

  4. 在对方接入之后,记得 “同意”对方接入,这样双方就可以看到同样的项目界面了。

接入方

如果你想看别人的项目的话,那么基本上差不多,首先你得有别人的分享链接,然后:

  1. 安装 “Code With Me ”插件

  2. 在界面上点击加入别人的项目

  3. 等待别人确认就可以加入了

内网玩法

这个才是我的重头戏,默认情况下如“简单使用”中的介绍使用的都是公网的连接,速度很可能不尽人意,最好还是可以公司局域网才是真的好,所以这里我就介绍一下如何通过局域网来玩。

和公网的区别就在于局域网的需要你自己搭建一个服务器,然后大家通过这个私有的服务器接入,这同时也要求所有的参与者都要能访问这个服务器。自建服务器需要 Docker 和 Docker-Compose 支持,如果你本地没有安装的话,可以参考一下我的文章进行安装:

还有一些关于 SSL 的部分,如果不了解,可以看一下我的这份指导:

自建 CWM 服务器

  1. 下载私有服务器

    打开地址:https://surveys.jetbrains.com/s3/code-with-me-server,然后填写你的邮箱(这个邮箱无需紧要,因为填完就可以直接下载了,不需要接收邮件)

  2. 目录结构

    下载下来之后,我的文件目录是这样的:

     [[email protected]]# ls -al
     -rw-r--r-- 1 root root 54M Dec  4 16:25 lobby-server-linux-x64.1165.tar.gz
     -rw-r--r-- 1 root root 14M Dec  4 16:25 ws-relayd1038
    

    然后需要稍作调整:

     [[email protected]]# mkdir relay
     [[email protected]]# cp ws-relayd1038 relay/ws-relayd
     [[email protected]]# mkdir lobby
     [[email protected]]# cp lobby-server-linux-x64.1165.tar.gz lobby/lobby-server-linux-x64.tar.gz
    
  3. 设置 SSL 证书

    接下来就是运行服务器了,我这台服务器的 IP 是 192.168.63.154,所以你需要替换后面的一些配置的 IP 地址为你自己的服务器 IP。

     [[email protected]]# openssl ecparam -name secp384r1 -genkey -noout -out lobby/lobby_private.pem
     [[email protected]]# openssl ec -in lobby/lobby_private.pem -pubout -out lobby/lobby_public.pem
     [[email protected]]# openssl req -new -key lobby/lobby_private.pem -out lobby/lobby.csr -config lobby/ssl.conf
     [[email protected]]# openssl x509 -req -days 365 -in lobby/lobby.csr -signkey lobby/lobby_private.pem -out lobby/lobby.crt -extensions v3_req -extfile lobby/ssl.conf
     [[email protected]]# openssl ecparam -name secp384r1 -genkey -noout -out relay/relay_private.pem
     [[email protected]]# openssl ec -in relay/relay_private.pem -pubout -out relay/relay_public.pem
     [[email protected]]# openssl req -new -key relay/relay_private.pem -out relay/relay.csr -config relay/ssl.conf
     [[email protected]]# openssl x509 -req -days 365 -in relay/relay.csr -signkey relay/relay_private.pem -out relay/relay.crt -extensions v3_req -extfile relay/ssl.conf
    
  4. 创建 relay Dockerfile

    [[email protected]]# cat > relay/Dockerfile << EOF
    FROM alpine:latest
    ARG DISTRIBUTION_VERSION=""
    COPY ws-relayd /ws-relayd
    RUN chmod +x /ws-relayd
    COPY relay_public.pem /relay_public.pem
    CMD /ws-relayd -addr relay:3274 -jwt-key-type ecdsa -jwt-key-file /relay_public.pem
    EOF
    
  5. 创建 lobby Dockerfile

    [[email protected]]# cat > lobby/Dockerfile << EOF
    FROM debian:buster-slim
    ARG DISTRIBUTION_VERSION=""
    ADD lobby-server-linux-x64.tar.gz /home/lobby-server
    COPY lobby_private.pem /home/lobby-server/lobby_private.pem
    RUN apt-get update && apt-get install -y unzip net-tools procps && apt-get clean
    WORKDIR /home/lobby-server
    ENV JAVA_HOME /home/lobby-server/jbr
    ENV SERVER_PORT 2093
    ENV BASE_URL https://lobby.cwm.internal
    ENV ENABLED_FEATURES p2p_quic,direct_tcp,ws_relay
    ENV FORCE_RELAY_URI wss://relay.cwm.internal
    ENV RELAYS_ECDSA_JWT_KEY_FILE /home/lobby-server/lobby_private.pem
    ENV REDIS_HOST redis
    ENV REDIS_PORT 6379
    ENTRYPOINT ["bin/lobby-server"]
    EOF
    
  6. 创建 Nginx 配置

    [[email protected]]# mkdir -p nginx/ssl
    [[email protected]]# cp lobby/lobby.crt nginx/ssl/
    [[email protected]]# cp lobby/lobby_private.pem nginx/ssl/
    [[email protected]]# cp relay/relay.crt nginx/ssl/
    [[email protected]]# cp relay/relay_private.pem nginx/ssl/
    [[email protected]]# cat > nginx/nginx.conf << EOF
    events {}
    http {
     server {
         listen              443 ssl;
         server_name         relay.cwm.internal;
         ssl_certificate     /etc/ssl/nginx/relay.crt;
         ssl_certificate_key /etc/ssl/nginx/relay_private.key;
    
         location / {
             proxy_pass http://relay:3274;
    
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "Upgrade";
             proxy_set_header Host $host;
         }
     }
    
     server {
         listen              443 ssl;
         server_name         lobby.cwm.internal;
         ssl_certificate     /etc/ssl/nginx/lobby.crt;
         ssl_certificate_key /etc/ssl/nginx/lobby_private.key;
    
         location / {
             proxy_pass http://lobby:2093;
         }
     }
    }
    EOF
    
  7. 运行服务

     [[email protected]]# mkdir -p redis/data
     [[email protected]]# cat > docker-compose.yaml << EOF
    version: "3.8"
    services:
     nginx:
       image: nginx:latest
       volumes:
         - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
         - ./nginx/ssl:/etc/ssl/nginx:ro
       ports:
         - 443:443
     relay:
       build:
         context: ./relay
         args:
           DISTRIBUTION_VERSION: 1.0
     lobby:
       build:
         context: ./lobby
         args:
           DISTRIBUTION_VERSION: 1.0
     redis:
       image: redis:latest
       command: ["redis-server", "--appendonly", "yes"]
       volumes:
         - ./redis/data:/data
    EOF
     [[email protected]]# docker-compose up
    

    然后就坐等运行完毕了。

使用自建服务器

要使用自建服务器就非常简单了,只需要在设置页面中将自己的服务器地址填入即可:

然后就和普通的一样使用了:

Ref