カテゴリー
その他 社内SE

外部の公開サーバでvscode serverを使ってみた

Visual Studio codeのserver版がpreviewながら公式からリリースされたので、SSL/TLS+Basic認証/クライアント認証を施し、systemdのサービスとして起動するように手持ちのVPSサーバ上に設定してみた。

これでブラウザがあれば、どこからでもサーバのファイルを編集できるようになった。

設定方法 (Ubuntu 20.04使用)

フロントエンドにNginxをReverse Proxyとして設定し、ここでSSLなどのセキュリティをかける。VS code server自体はバックエンドにする。Websocketが通らないため、Apacheをフロントエンドにはできないので注意。

Visual Studio code server 設定

以下のようにインストールした後、サービスとして登録するため、systemdファイルを作成する。

# インストール
sudo wget -O- https://aka.ms/install-vscode-server/setup.sh | sh

# systemd unitファイル作成 途中のUser/Groupは書き換えること。
sudo vi /lib/systemd/system/vscodeserver.service
---
[Unit]
Description=vs code server
After=network-online.target

[Service]
ExecStart=/usr/local/bin/code-server serve-local --accept-server-license-terms --disable-telemetry
Restart=always
User=yourUserName
Group=yourGroupName
UMask=002

[Install]
WantedBy=multi-user.target
---

systemdに登録し実行する。(上のunitdファイルに記述したユーザ/グループで実行される。)

# 登録
sudo systemctl enable vscodeserver
# 開始
sudo systemctl start vscodeserver

初回起動時のみ起動に時間がかかるため、1,2分待ち、起動した後に表示される接続先のURLを取得しておく。

# statusの中のWeb UI available atにあるURLを取得する。
sudo systemctl status vscodeserver
---
Jul 13 07:20:14 devserver001 code-server[367393]: Server bound to 127.0.0.1:8000 (IPv4)
Jul 13 07:20:14 devserver001 code-server[367393]: Extension host agent listening on 8000
Jul 13 07:20:14 devserver001 code-server[367393]: Web UI available at http://localhost:8000/?tkn=6de5345a-b644-48cd-a7f9-3433bcc031e3
Jul 13 07:20:14 devserver001 code-server[367393]: [07:20:14] Extension host agent started.
Jul 13 07:20:14 devserver001 code-server[367393]: [07:20:14] Deleted from disk ms-ceintl.vscode-language-pack-ja /home/yourname/.vscode-server/extensions/ms-ceintl.vscode-language-pack-ja-1.67.3
Jul 13 07:20:14 devserver001 code-server[367393]: [07:20:14] Deleted from disk xdebug.php-debug /home/yourname/.vscode-server/extensions/xdebug.php-debug-1.26.1
---

ここでは、http://localhost:8000/?tkn=6de5345a-b644-48cd-a7f9-3433bcc031e3であるのでこれを控えておく。

上の「sudo systemctl status vscodeserver」で「Web UI available at」の行が見つからない場合は、「journalctl –no-pager | grep -e ‘code-server’」で起動時間あたりの情報を探すこと。

Nginx設定

Nginxにはリバースプロキシ、SSL、Basic認証(もしくはクライアント認証)を設定する。SSLの各種ファイルはLet’s Encryptなどで取得済みとする。

Nginxをインストールしていない場合はインストール

sudo apt install nginx

基本の設定ファイルを設定する。このあたりは各自の環境に合わせて設定してほしい。私のサーバは私一人しか使わないため最小限の設定にしている。デフォルトでも問題ないはず。

sudo vi /etc/nginx/nginx.conf
---
user yourUser yourGroup;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 50;
        multi_accept on;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 3;
        types_hash_max_size 2048;
        server_tokens off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
        access_log off;
        error_log /var/log/nginx/error.log;

        include /etc/nginx/sites-enabled/*;
}
---

Basic認証の下準備。

# basic認証
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd testuser
# ここでBasic認証のパスワードを設定する。testuser/設定passwordがbasic認証のログインアカウントになる。

以下が肝心の設定ファイル。Basic認証でやる場合は以下。server_name、ssl_certificateとssl_certificate_keyは変更のこと。

# virtual host
sudo vi /etc/nginx/sites-available/vscodeFront
---
server {
    listen 443 ssl http2;
    server_name yourServerName.com;

    # SSL 環境に応じて変更のこと
    ssl_certificate     /etc/letsencrypt/live/yourServerName.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourServerName.com/privkey.pem;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:8000/;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;

    }
}
---

クライアント認証の場合だと以下。クライアント認証の作り方は割愛。

sudo vi /etc/nginx/sites-available/vscodeFront
---
server {
    listen 443 ssl http2;
    server_name yourServerName.com;

    # server側
    ssl_certificate     /etc/letsencrypt/live/yourServerName.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourServerName.com/privkey.pem;

    # client認証
	ssl_verify_client on;
	ssl_client_certificate /opt/myCA/cacert.pem;
	ssl_crl /opt/myCA/crl.pem;

    location / {

        proxy_pass http://127.0.0.1:8000/;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;

    }
}
---

設定が終わったら、virtual hostの設定を有効にして、Nginx再起動。

sudo ln -s /etc/nginx/sites-available/vscodeFront /etc/nginx/sites-enabled/
sudo systemctl restart nginx

ここで、VS code serverの設定時に控えておいた「http://localhost:8000/?tkn=6de5345a-b644-48cd-a7f9-3433bcc031e3」の?から下の部分(赤色部分)を切り取り、https://yourServerName.com/?tkn=6de5345a-b644-48cd-a7f9-3433bcc031e3にアクセスするとVS code serverが表示される。

Port 8000は外部からアクセスできないようにしておくこと。

感想

現時点では、vscode serverの非公式WEB版であるCoderのcode-serverのほうが若干動作が軽く、日本語化もできるので使いやすい。ただ、こちらのvscode serverは公式なので、いずれ非公式のCoder版は廃れる気がする。公式版の不満点としては、使えない拡張機能があることと、日本語化できないことであるが、まだpreview版なのでいずれ対応してくれるのでは、という期待がある。

とりあえず、Coder版から乗り換えた。