特にモノアイと関係ないけど暗号通貨周りとかで気になったことを適当に書くブログ

FXか暗号通貨辺りの気になったことをたまに書きます。

月500円の格安VPSでMT4を稼働させてFX自動売買する時の備忘録(DigitalOcean × Ubuntu18.04)

前書き

MT4を動かしていたWindows端末が天寿を全うしたので、これを機に安いレンタルサーバーやVPS(Virtual Private Server)環境で24時間EAを稼働させたいな…と思って構築しました。自分が次回構築する時用の備忘ですが、ご参考になれば幸いです。

f:id:mono_i_love:20191207130157j:plain
MT4構築環境
f:id:mono_i_love:20191207132347j:plain
こういう感じのことがしたい

※上図のようにMacユーザーの場合はTerminal、Windowsユーザーの場合はコマンドプロンプトを使える前提の記事です。

本文

1-1)DigitalOceanに登録

  • メールアカウントで登録

ではまず格安VPS会社に登録します。
下記の紹介リンクから登録してもらうと1ヶ月間50ドル(≒5400円)分無料で使えるのでお試ししたい方は活用してください。
50ドルだとだいたいメモリ8GBの環境を1ヶ月無料で使えます(2019年12月現在)。
私の方にもDigitalOceanから謝礼が出るので、この記事への投げ銭代わりに登録してもらえると泣いて喜びます。
m.do.co

登録は「Sign up with email」つまりメールアカウントが良いと思います。
Google連携やGitHub連携だとそちらのアカウントが凍結されたりした時困るし作り直すのが面倒なので。

f:id:mono_i_love:20191207132536j:plain
DigitalOceanのサインアップ

その後に確認メールが飛んで来るので登録作業を進めます。
この辺は指示通り進めれば大体わかると思うので省略させて下さい。
(プロジェクト名とかは適当で)

  • 支払い方法について(クレジットカード or PayPal

海外のVPS会社なので支払い周りに不安がある人もいるかも知れませんが、普通に国内のクレジットカード(VISA、MasterCard、American Express)が使えるので安心してください。
クレジットカード情報を直接渡したくない方は銀行口座(大体の銀行は行ける)やクレカと紐付けたPaypalあたりがお勧めです。
なにかと便利なので、Pyapalは1つ用意しておくといい感じです。
そういえば何とかMAXさんのサロンでPaypal払いした人がPaypalに返金依頼したら応じてくれた云々とかいう話があったな…

1-2)SSH鍵作成とDigitalOceanへの登録

自宅のPCからVPSに接続する際はSSHという規格で暗号通信します。その際の認証に

  • パスワード認証
  • 公開鍵認証

のいずれかを使うことになりますが、セキュリティと毎回パスワード入力する手間(+パスワード管理の手間)を考えれば後者一択です。
なので公開鍵認証をしてSSH接続するために公開鍵と秘密鍵を作成し、作成した公開鍵(.pubファイル)の方のみをDigitalOceanに登録します。
(正確には.pubファイル内に記載されている文字列を登録します。)

当然ですが、秘密鍵の方は絶対に他人に渡さないでください。
ざっくり書くと、公開鍵が錠前・秘密鍵が鍵そのものと認識しておけばとりあえずOKです。
錠前の方をDigitalOceanに預けて、鍵本体は自分でしっかり保管しておくイメージです。

f:id:mono_i_love:20191208153307j:plain
公開鍵と秘密鍵

基本はターミナル(Windowsならコマンドプロンプト)からコマンドを打って鍵を作成することになります。
すでに作成済みの方は登録だけで大丈夫です。

鍵の作成方法はこちらの記事が
qiita.com

作成した公開鍵のDigitalOcean登録方法はこちらの記事が大変参考になりました。ぜひ活用していいねを押してきて下さい。
qiita.com

1-3)DigitalOceanのDropletを作成

SSH鍵の作成(自PCのターミナル上)→作成した公開鍵の方をDigitalOceanに登録」が終わったらいよいよ仮想環境を構築していきます。

DigitalOceanでは仮想環境(つまりVPSインスタンス)をDropletと呼んでいます。
今回は1ヶ月5ドルで運用できるDropletを1つ作り、その中でMT4を稼働させたいと思います。

まずは画面右上の「Create」を押し、

f:id:mono_i_love:20191207140951j:plain
CreateDroplet

「Droplets」を選択します。

f:id:mono_i_love:20191207141135j:plain
Create選択メニュー

Create Droplets画面になるので構成を選んでいきましょう。
まずはUbuntuの64bit環境を選びます。今回は18.04.3を選択しました。バージョンによって使うコマンドが変わるケースがあるので留意して下さい。

f:id:mono_i_love:20191207141723j:plain
OSの選択
f:id:mono_i_love:20191207142115j:plain
OSのバージョン選択

次にメモリやCPUの構成を選びます。メモリ特化256GBじゃー!とかもできますが、おとなしくStandardのメモリ1GBの$5/mo、つまり月5ドルの一番安い環境を選びます。
構成は後からいくらでも変更できるので、容量やメモリに不足が出てきたら財布と相談して後々から足していきましょう。

f:id:mono_i_love:20191207140426j:plain
価格表

構成を選んだらどこの国のデータセンターを使うか選びます。
通信速度を考慮して日本に一番近いシンガポールでも良いのですが、障害時等のことを考えると機材と人員が豊富そうなお膝元のNYあたりが無難でしょう。
FXの約定速度を考慮するなら、ご利用予定のFX会社のサーバが一番近い所を選ぶのが良いと思います。

f:id:mono_i_love:20191207142611j:plain
リージョンの選択

認証方式はSSH keys、つまり先程登録した公開鍵での認証を選びます。
Eメールでワンタイムパスワードを送ってくれる方式もありますが、手間とセキュリティ的に非推奨です。
この後の作業もSSH keys前提で記述していきます。
(ちなみに秘密鍵をなくしてログインできなくなってしまった場合は、Webブラウザのコンソールからパスワードでログインしたりrootパスワードのリセット等いくらでも復旧方法があるので安心です)

f:id:mono_i_love:20191207142935j:plain
SSH鍵の登録

最後に作成するDropletの個数と生成する仮想環境のホスト名を決めます。
Dropletはもちろん1つで大丈夫です。
ホスト名は環境のスペックやリージョンがひと目で分かるデフォルトのものがついていますが好みで変えてOKです。

Add tagsとありますが、これは複数のDropletsを作成した際にわかりやすく識別するためのタグです。
後からもタグは付けられますので特に付ける必要はないでしょう。
(画面では「MT4」「Ubuntu」と付けています。)

f:id:mono_i_love:20191207143218j:plain
Dropletsの個数とホスト名とタグの設定

以上が終わったら最下部の「Create Droplet」を押せば仮想環境の構築が始まりますが、数分で終わります。

f:id:mono_i_love:20191207143842j:plain
Dropletの作成画面

作成が完了するとIPアドレスipv4)が表示されます。
以後はこのIPアドレスの仮想環境に対して作業をしていきます。
一応先述したとおりブラウザ上からコンソールを開いて操作は可能ですが、使いにくいので非常時以外は個人的にオススメできないです。

f:id:mono_i_love:20191207143939j:plain
Droplet作成完了

ここまでは引用しているQiitaの記事と大体おなじです。

2-1)root権限での初期作業

ログイン

では作成した仮想環境へ自宅のPCからターミナルで接続します。WinodowsユーザはコマンドプロンプトTeraterm辺りを使ってください。

「Tera Term」定番のターミナルエミュレーター - 窓の杜

先程Dropletを作成した時のIPアドレスに向かってroot権限で公開鍵認証を使ってログインします。

$ ssh root@<IPアドレス>

…念の為書いておきますが、例えばIPアドレスが「127.0.0.1」なら「ssh root@127.0.0.1」という感じで読み替えてください。
また、秘密鍵の保存場所を明確に指定してログインする場合は「$ ssh -i ~/.ssh/id_rsa root@<IPアドレス>」としてください。

最新の状態にアップデート

Ubuntuを最新の状態にして再起動をします。

# apt-get update
# apt-get dist-upgrade
# reboot

再起動が完了したら再びroot権限でログインします。

2-2)root権限でSSHのセキュリティを設定する

Port番号の変更(任意)

SSHのポート番号22は広く知られており、悪意のあるハッカーなどはこのポートへ攻撃を仕掛けてきます。
もちろん今作成したてのDropletはIPアドレスさえわかっていればインターネット上から誰でもアクセス可能な状態なので、結構な頻度で22に向けてアクセスされます。
なので、このSSHに割り当てられているポート番号をデフォルトの22から変えておきましょう。
(頻繁に使用するので自分が覚えやすいものが吉)

任意の数字でOKですが、WELL KNOWNポート番号の(0-1023)、登録済みポート番号(1024-49151)は他で使われる可能性があるので、空いている49152〜65535番で指定します。
参考:TCPやUDPにおけるポート番号の一覧 - Wikipedia

以下、viエディタでポート番号を書き換えてください。

# vi /etc/ssh/sshd_config
PasswordAuthentication no
Port <任意のポート番号>  → 22 以外にしておく

変更を保存したら、SSHを再起動させて変更を反映します。

# service ssh restart

成功していれば以下のコマンドで、任意のポート番号に変更できたか確認します。
# lsof -i:<任意のポート番号>
ファイアーウォール(ufw)の設定

続いてUbuntuのファイアーウォールを設定します。
先程設定したSSHのポート番号以外へのアクセスを弾くようにしましょう。

viエディタでSSH用のポート番号を先程指定したものに変更します。

vi /etc/ufw/applications.d/openssh-server
[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=<任意のポート番号>/tcp

SSH接続を許すように設定し、ファイアーウォールを起動します。

許可する対象の一覧を確認
# ufw app list

SSHを許可するように設定
# ufw allow OpenSSH
※今後他のアプリ(mysqlとか)使うならそちらで必要なPort番号も許可しておく。後々に上手く通信できないトラブル原因の個人的No.1

ファイアーウォールを有効化
# ufw enable
ファイアーウォールの状態を確認
# ufw status
  →Status: activeになっていればOK
普段遣いのユーザを追加+sudo権限

今までroot権限で作業してきましたが、何でも可能なrootを普段から使うわけにはいかないので作業用のユーザを追加し、sudo権限を付けてあげます。
ユーザ名は任意のものでOKです。パスワードを設定するように求められるので控えておいて下さい(もちろんそれ以外の情報は特に設定する必要ないのでEnterキーで飛ばしてください)。
公開鍵認証を使うので普段パスワードを使用することはないと思いますが、sudoの際に求められたり、緊急時はこのパスワードでWebブラウザ上からDigitalOceanのコンソールでログインします。

# adduser <任意のユーザ名>
# usermod -aG sudo <任意のユーザ名>

3)新ユーザでログインしてセキュリティを設定

ログイン端末の公開鍵を設定

新しく作ったユーザでも先程生成した秘密鍵でログインできるように、公開鍵を登録します。

# su - <任意のユーザ名>
$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ vi .ssh/authorized_keys # 公開鍵をコピペする(さっきDigitalOceanに登録したやつと同じ文字列
$ chmod 600 .ssh/authorized_keys

登録したら一度ログアウトして、新ユーザでもログインできるか確認しましょう。
ポート番号は先程変更したものを忘れずに指定します。

$ ssh  -p <任意のPort番号> <任意のユーザ名>@<IPアドレス>

秘密鍵の保存場所を明示する場合は「$ ssh -p <任意のPort番号> -i <秘密鍵の保存場所> <任意のユーザ名>@<IPアドレス>」

続いて、root権限で外部からSSHログインされるのを禁止するために該当箇所の設定を書き換えます。

$ sudo vi /etc/ssh/sshd_config
PermitRootLogin no

SSHの再起動をして変更を反映

$ sudo service ssh restart

root権限でログアウトできなくなった事を確認しましょう。
「$ ssh -p <任意のPort番号> root@<IPアドレス>」でログインしようとすると Permission deniedなどと表示されてログインできなくなっているはずです。

※DigitalOcean公式によると、2つ以上のファイアーウォールを使うことは非推奨なのでCloud Firewallsは使わないでおきます。

端末側でログインしやすいようにssh_configを準備(任意)

主にMacの場合です。(WindowsTeratermとかLogmeTTで上手いことやってね)
ssh -p <Port番号> <ユーザ名>@<IPアドレス> と毎回入力してログインするのは大変なので設定します。
こちらは仮想環境からログアウトして、自分の端末側で行います。

vi ~/.ssh/config
# 仮想環境のサーバ
Host <任意のホスト名>
  HostName <IPアドレス>
  Port <任意のポート番号>
  User <任意のユーザ名>
  IdentityFile <秘密鍵の保存場所(例えば~/.ssh/id_rsa)>

以後はssh <任意のホスト名>で仮想環境にログインしましょう。
参考:
.ssh/configファイルでSSH接続を管理する - Qiita

4)VNCサーバを仮想環境に導入

VNCをインストール

さて仮想環境の構築とセキュリティの設定がおわりましたが、仮想環境にはWindowsのような画面(いわゆるGUI)がまだありません。
そのためVNC(Virtual Network Computing)を導入してデスクトップ環境を構築する必要があります。

仮想環境に先程作成したユーザでログインし、Xfceデスクトップ環境をインストールします。

$ sudo apt install xfce4 xfce4-goodies

完了したら、次にTightVNC serverをインストールします。

$ sudo apt install tightvncserver

vncserverコマンドで初期設定を行います。この時、パスワードの作成と確認のための再入力を求められます。
自分のPC端末から仮想環境のデスクトップ画面に接続する際に必要になるものなので、必ずメモっておいてください。
先程のユーザ作成時のパスワードとは全く別モノです。
ちなみにこのパスワードは6〜8文字と非常に中途半端なものが求められます。8文字より多い場合は切り捨てられます。なんだこの仕様

$ vncserver

また、この後に閲覧専用のパスワードを作成するか訊かれますが、n(NO)と回答して大丈夫です。要りません。

Would you like to enter a view-only password (y/n)? n

設定ファイルを編集してvncserverを再起動

この時点でvncserverが起動し自動的にデスクトップ画面「:1」が作成されます。(「:2」「:3」…と複数の画面を作成することも可能)

この「:1」を終了し、設定を変更していきます。

$ vncserver -kill :1

設定ファイルを書き換える前にバックアップを取ります。

$ mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

viエディタで新規にファイルを作成して編集します。

$ vi ~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

作成した新規ファイルに実行権限を付与します。

$ sudo chmod +x ~/.vnc/xstartup

VNCサーバを再起動します。

$ vncserver

これで仮想環境のデスクトップ画面ができあがりました。

VNCデスクトップにローカル端末からSSHトンネルで接続できるようにする

では仮想環境のデスクトップにアクセスして…と行きたい所ですが、このVNCで使われている通信は暗号化がなされていません。
そのため安全に接続するためにSSHトンネル(ポートフォワーディング)を使ってやる必要があります。
ざっくり書くと、
自分のPC端末→(VNC通信)→ターミナル→(SSH通信)→仮想環境→(VNC接続)→VNCデスクトップ環境
という感じで通信を転送させます。
記事の最初の画像を見てもらった方が早いですね。

f:id:mono_i_love:20191207130157j:plain
MT4構築環境

次のコマンドを使用して、ターミナル経由で上記の「SSH」部分を構築します。

% ssh -p <任意のポート番号> -L 5901:127.0.0.1:5901 -C -N -l <任意のユーザ名> <IPアドレス>
※ターミナルは開きっぱなし。秘密鍵の保存場所(以下略

これでこのターミナルが開いている間は、ターミナル経由でSSH通信をしてVNCデスクトップ環境にアクセスできるようになります。
ちなみに5901はVNCの通信で使われるポート番号、127.0.0.1は自分のPC端末を指しています。
自分の端末で起動しているターミナルにポート番号5901で通信が来たら、外部の<IPアドレス>に<任意のポート番号>でSSH通信を転送するぞー、という意味ですね。ややこしい

~/.ssh/configに記載する場合(任意)

ちなみにこちらも自分の端末のssh_configを設定することで、入力を簡易化できます。
ただし、この場合はターミナルは開きっぱなしというか、そのまま仮想環境にログインしちゃいます。
以下の内容を追記すればOKです。

vi ~/.ssh/config
Host <任意のホスト名。ただし先程とは別名で>
HostName <IPアドレス>
Port <任意のポート番号>
User <任意のユーザ名>
IdentityFile <秘密鍵の保存場所(例えば~/.ssh/id_rsa)>
LocalForward 5901 127.0.0.1:5901
Compression yes
VNCデスクトップに接続

Macの場合はデフォルトの「画面共有.app」でアクセス可能です。
Finderを開き、上のバーから「移動」>「サーバへ接続」を選択します。(ショートカットキーは「⌘K」)

f:id:mono_i_love:20191208171640j:plain
サーバへ接続1

サーバアドレスに「vnc://localhost:5901」と入力して「接続」を押します。

f:id:mono_i_love:20191207164808j:plain
サーバへ接続2

上記の「4)VNCサーバを仮想環境に導入」で設定したパスワードを入力します。

f:id:mono_i_love:20191207165457j:plain
VNCデスクトップのパスワード入力画面

初回アクセス時にパネルの設定について尋ねられますが取り敢えずデフォルトでOKです。

f:id:mono_i_love:20191207165023j:plain
X desktop初回ログイン


Windowsの場合は、VNCクライアントが必要になります。
RealVNCかUltraVNCあたりで良いでしょう。
接続先のIPアドレスは仮想環境のIPアドレスではなく、上記のMacのように「localhost」もしくは「127.0.0.1」になることは留意してください。

Download VNC Viewer | VNC® Connect
「UltraVNC」PCリモート操作ソフト - 窓の杜

これでデスクトップ環境の構築は完了です。次はここでMT4を使えるようにしていきます。

5)UbuntuにWineを導入する

MT4はWIndows用のソフトなので、それをUbuntuの環境で起動できるようにWineを導入します。

$ sudo dpkg --add-architecture i386
$ wget -nc https://dl.winehq.org/wine-builds/winehq.key
$ sudo apt-key add winehq.key
$ sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'
$ sudo apt update
$ sudo apt install --install-recommends winehq-stable

Ubuntuのバージョンによってリポジトリが違うので要注意。バージョンが違う場合は公式Wikiを参照して下さい。
Ubuntu - WineHQ Wiki

日本語が文字化けするのでwinetricksを使います。

$ sudo apt install -y winetricks
$ winetricks cjkfonts

※場合によってはwinetricks allfonts とした方が良いかも。

6)MT4をUbuntuに導入

MT4を入手

どこのFX会社から入手してもOKです。
大概のFX会社はデモ口座を登録すればDLできます。
今回はOANDA JAPANでダウンロードした「oanda4setup.exe」使います。

f:id:mono_i_love:20191207163421j:plain
Oanda JapanのMT4入手先

仮想環境にMT4のsetup.exeを送る

SFTP通信に対応しているソフトを使うのが良いでしょう。
Windowsの人なら「WinSCP」等、Macなら「Cyberduck」等を使えば良いと思います。

「WinSCP」SCP/SFTP/FTPS対応のFTPクライアント - 窓の杜
Cyberduck for Mac - 無料・ダウンロード

留意点としては、上述の手順でSSHのPort番号を変更・rootログインの禁止・公開鍵認証を設定しているので以下の点に気をつけてください。

  • Port番号を変更したものに設定する
  • 自分の端末内の秘密鍵格納先を設定する

具体的には下記の画像のようになると思います(※Cyberduckで、<任意のユーザ名>が「mt4」の場合)

f:id:mono_i_love:20191207163630j:plain
Cyberduckでファイルを送信する
f:id:mono_i_love:20191207170108j:plain
Cyberduckで仮想環境のフォルダにアクセスしている図

無事に仮想環境のフォルダにアクセスできたらsetup.exeファイルを仮想環境にアップロードします。

MT4をインストール

Windowsでインストールする時とほぼ同じです。
先程アップロードしたsetup.exeをダブルクリックして起動します。

f:id:mono_i_love:20191207164234j:plain
setup.exe実行時
f:id:mono_i_love:20191207164321j:plain
setup.exe実行時2
f:id:mono_i_love:20191207170650j:plain
MT4インストール完了
お疲れさまでした。これで環境構築は完了です。

備考

今回はDigitalOceanの一番安いプランで使い倒す内容ですが、仮想マシンの構成も任意のタイミングで自由に変えれて、かつ時間制の従量課金なので、MT4のバックテストする時だけメモリとCPUを追加する等々かなり応用が効きます。

他にもクラスタを組んだりドメインを設定したりロードバランサー付けたりデータベース組んだりバックアップを設定したり…etcとおよそサーバを立ててやりたいことは全部できますので、ちょっとしたWebサービスを作ったり、botを動かしたりするにも良好な環境なのでかなりオススメです。

m.do.co