#SSH Tunnel, Upstart, Launchd, and BTSyncで手ぶらで帰れるようになった
##問題:会社はマシンを支給してくれないので毎日自分のMacbook Proをオフィスに運ばないといけない。家でも作業したいけど、MBP思いし、途中で落としちゃったりすると大惨事になる
##解決:初号機をSSH TunnelでWeb Facing Computer経由でどこからでもアクセスできるようにして会社に置いとく。電源が入ってれば零号機(家にあるMacbook Pro)からアクセスできる。電源が入ってないと何もできないのでBTSyncで常に同期する。
###Step 1 - Setup SSH Tunnel
ssh -i /Users/richardkazuomiller/.ssh/mbpr_key.pem -R *:2222:localhost:22 -N root@ricky.me
これでSSHトンネル完成。しかし、loopback addressでしかbindされない。外からアクセスするのに、ポートを開かないといけない。
ssh -L ricky.me:2222:localhost:2222 -N root@localhost
これでricky.me:2222➝localhost:2222➝初号機のSSH Tunnelで家にあるマシンに接続が転送される。
###Step 2 - 常に走ってるのを保証する
ネットが落ちたり、電源が切れたりしなければこれがずっと走るけど、NPLabは週一位の頻度で落ちるから一回実行するだけじゃ足りない。とりあえず無限ループで実行してみるか!
#!/bin/sh
while [ 1 ]
do
ssh -L ricky.me:2222:localhost:2222 -N root@localhost
done
#!/bin/sh
while [ 1=1 ]
do
ssh -i /Users/richardkazuomiller/.ssh/mbpr_key.pem -R *:2222:localhost:22 -N root@ricky.me
done
これでだけでトンネル経由でどこからでもマシンにアクセスできる〜・・・但し再起動したら終了〜
###Step 3 - 起動時に実行する
サーバー側はUbuntuのクラウドサーバーなので、/etc/rc.localにsh /hoge.shを入れたら一応動くけどその親プロセスが死んだら子プロセスのsshも死ぬし、respawnの設定とかは全くしてないのでそのスクリプトは一回しか実行されない。Enter upstart.
Upstart is an event-based replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.
要は起動時に実行して、プロセスが死んだら新しいのを実行してくれる。簡単なスクリプトを書くだけでdaemonみたいなタスクができる
#/etc/init/loopback.conf
description "ssh tunneler"
author "ricky"
start on started mountall
stop on shutdown
# Automatically Respawn:
respawn
respawn limit 99 5
script
export HOME="/root"
cd /root
sh ./loopback.sh
end script
post-start script
# Optionally put a script here that will notifiy you node has (re)started
end script
起動時に実行されるし「service loopback start/stop/restart」を打つだけど走らせたり止めたりできる。これでサービス作成完了!ではMac側もやろう。
OSXにlaunchdという似たようなやつもある。~/Library/LaunchAgents/*.plistに設定ファイルを保存すればUpstartと同じく起動時にプロセスを実行して落ちたら新しいのを作ってくれる
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>loopback</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>/Users/richardkazuomiller/Sites/loopback.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
###Step 4 - Bittorrent Syncをインストール
Bittorrent Syncを使ってるマシン全てにインストールして、プロジェクトが入っているフォルダを追加して、secretをそれぞれにの端末に入れると、勝手にそのフォルダに入ってるファイルが全て同期される。Dropboxみたいな仕組みだけど、データは自分のマシンにしか保存されないのでストレージの制限とかはない。それに、エンジニアだとnode_modulesとか.gitの中身の小さいファイルが結構貯まるからDropboxみたいなサービスで同期するのは非現実的なソリューション。しかし、BitTorrent Syncにフォルダを追加すると、.SyncIgnoreというファイルを作ってくれてそいつに同期したくないファイルを書けばBTSyncのデーモンは無視してくれる。
# .SyncIgnore is a UTF-8 encoded .txt file that helps you specify single files, paths and rules
# for ignoring during the synchronization job. It supports "?" and "*" wildcard symbols.
#
#
# OS generated files #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
desktop.ini
Thumbs.db
.git
node_modules
###Step 5 (bonus) - 弐号機登場!
####弐号機:2008年製のレッツノート+3TB外付けHDD
#/home/ubuntu/btsync/sites3/config/config.json
{
"device_name": "lets000",
"listening_port": 30005,
"check_for_updates": true,
"use_upnp": true,
"download_limit": 0,
"upload_limit": 0,
"webui": {
"listen": "0.0.0.0:20005",
"login": "ricky",
"password": "bitbit123"
},
"storage_path": "/home/ubuntu/btsync/sites3",
"shared_folders": [
{
"secret": "AD2CLBQJOCU6QP27DOFQDB23DFTIJEWTC",
"dir": "/disk1/btsync/sites3",
"use_relay_server": true,
"use_tracker": true,
"use_dht": false,
"search_lan": true,
"use_sync_trash": true,
"known_hosts": []
}
]
}
#/etc/btsync/sites3.conf
description btsync-sites3
author "ricky"
start on started mountall
stop on shutdown
# Automatically Respawn:
respawn
respawn limit 99 5
script
export LANG=en_US.UTF-8
exec sudo -H -u ubuntu /usr/lib/btsync/btsync-daemon --nodaemon --config /home/ubuntu/btsync/sites3/config/config.json
end script
post-start script
# Optionally put a script here that will notifiy you node has (re)started
# /root/bin/hoptoad.sh "node.js has started!"
end script