最近デスクトップクラウド化計画の一環でクラウドエディタを試しています。でもVSCodeの快適さに慣れてしまうとなかなかエディタを移れませんね……
そんな中cloud9を試してみようとDockerHubからkdelfour/cloud9-dockerを落としてみたのですが、普通に使う分には問題なさそうでしたがリバースプロキシを通してhttp://hostname:port/subdir/
とアクセスすると、http://hostname:port/ide.html
に飛ばされちゃって、うまくいかないわけです(´・ω・`)
じゃぁってhttp://hostname:port/subdir/ide.html
でアクセスすると、
みたいなチップス表示がでて先に進みません。
「cloud9 subdirectory」で検索してもissueは上がっているものの「それが、何か?」みたいな感じになってて修正が期待できない感じなのですが、英語弱者なのでいまいちよくわかりません。コードを眺めて/ide.htmlの部分を/subdir/ide.htmlのように書き換えてみても、いまいち動きが変わらず力尽きました。
そんな中「参照先をリバースプロキシで書き換える方法があるよ」的な書き込みを見かけたので試してみたらうまく言った感じがするので、共有してみようと思います。
参考になったのはこちら。
https://github.com/c9/core/issues/237
1.nginxでsub_folderを使えるようにする
CentOSのnginxはそのまま入れるとsub_folderが使えないようで、confに記述するとエラーがでます。なのでモジュールを入れるべきなのですが、どれ入れたらいいのかわからなかったので全部パックを入れました。
sudo yum install nginx-all-modules
さすがに全部入りだと一発で動きました。
2.nginxにコンフィグを追加
http://hostname:3080/ide/ide.html
でアクセスしてきたのをdocker(localhost:8080)に回します。
proxy_set_headerはいつものセットで、sub_filterのところを参考リンクから拾ってきました。結構書き換えが必要だったんですね。
server{
listen 3080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location /ide/ {
proxy_pass http://localhost:8080/;
sub_filter_types txt/html txt/css application/javascript;
sub_filter "/configs" "/ide/configs";
sub_filter '"/static' '"/ide/static'; #note the single and
sub_filter '"/vfs' '"/ide/vfs';
sub_filter '"/_ping' '"/ide/_ping';
sub_filter_once off;
}
}
書き換え終わったらsudo systemctl reload nginx
して有効化しておきます。
3.dockerを立ち上げて動作確認
kdelfour/cloud9-dockerが☆が多かったので使ってみました。使ってみた時点では最終ビルドが4ヶ月前なのでそこまで古くなかったです。代替で使おうとしていたcodeboxが3年前とかなので(´・ω・`)
sudo docker run -it -d -p 8080:80 -v /home/my_user/workspace:/workspace kdelfour/cloud9-docker
立ち上がったら、ブラウザでアクセスしてみます。
http://hostname:3080/ide/ide.html
ide.htmlまで必要です。http://hostname:3080/ide/
で止めるとhttp://hostname:3080/ide.html
にリダイレクトされてうまく動きません。
ユーザー/パスワードは設定できないみたいなので、nginxのconfの設定に特定IPのみ許可とか入れておくと良さそうですね。
location /ide/ {
# 追加
allow xxx.xxxx.xxx.xxx;
deny all;
}
認証をつける
コンテナ内の/etc/supervisor/conf.d/cloud9.conf
の中に起動コマンドがあるので、コマンドの最後に
--auth ユーザー名:パスワード
をつけてやれば認証が入ります。
認証が必要な場合はイメージをそのまま使うのでなく、Dockerfileでsedあたりで起動コマンドを書き換えて使うと良さそうです。