ワンコインで ServersMan 上に、Dart:io を利用した Httpsサーバーを立ち上げてみよう

サーバーサイド、Webアプリ作成用のフレームワークはいろいろ

* http://redstonedart.org/
* http://dart-bridge.io/

でも、dart:ioのレベルでサーバーを動作させてみたいと思う人もいるかもしれません。

試してみたい的な。

Try it now!!
500円のVPSを借りて、Httpsサーバーを立ち上げてみましょう。

# (1) Serversman から500円の VPSを借りる。
http://dream.jp/vps/
Ubuntu 64 bitを選んでね!!

<br>
# (2) ログインする
```
ssh root@<yout ip> -p <your port>
```

# (3) 色々インストールする
```
apt-get update 
apt-get install git
apt-get install emacas
```

# (4) Dartをインストールする
```
https://www.dartlang.org/downloads/linux.html
$ sudo apt-get update
$ sudo apt-get install apt-transport-https
# Get the Google Linux package signing key.
$ sudo sh -c 'curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
# Set up the location of the stable repository.
$ sudo sh -c 'curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
$ sudo apt-get update

$ sudo apt-get install dart

$ emacs ~/.profile 
>> 
>> export PATH="$PATH:/usr/lib/dart/bin"
>> 

$ source ~/.profile
```


# (5) Apacheの利用を止める
```
sudo update-rc.d -f apache2 remove
update-rc.d (スクリプト名) defaults 99 1
```

# (6) IP Tableを設定
```
$ emacs a.sh

#!/bin/sh
#remove current rule
iptables -F
iptables -X
#FORWARD
iptables -P FORWARD DROP
#for prepare all enable
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
#local
iptables -A INPUT -i lo -j ACCEPT
#established now
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#http
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport 3843 -j ACCEPT
#Https
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#ping
iptables -A INPUT -p icmp -j ACCEPT
#Other
iptables -P INPUT DROP

※　参考にしたサイトのリンクを紛失してしまった..
```

```
$ a.sh
$ iptables-save > /etc/iptables.rules
$ emacs /etc/network/if-pre-up.d/iptables_start
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
exit 0
$ sudo chmod 755 /etc/network/if-pre-up.d/iptables_start

※　参考にしたサイトのリンクを紛失してしまった..
```

# (7) アプリ作成
```
$ pub global activate stagedive
$ stagedive -n console -p stagedive -t console
$ cd console
$ emacs ./bin/main.dart


import 'dart:io';

import 'package:args/args.dart';

void main(List<String> args) {
  ArgParser parser = new ArgParser()
    ..addOption('port', abbr: 'p', defaultsTo: '8080')
    ..addOption('cert', abbr: 'c', defaultsTo: null)
    ..addOption('work', abbr: 'w', defaultsTo: '/tmp');

  ArgResults result = parser.parse(args);
  int port = int.parse(result['port'], onError: (val) {
    stdout.writeln('Could not parse port value "$val" into a number.');
    exit(1);
  });
  String path = result['cert'];
  if(path == null || path == "") {
    startD(port);
  } else {
    startS(port, path);
  }
}

void startS(int port, String path) {
  String key = Platform.script.resolve("${path}/key.pem").toFilePath();
  String crt = Platform.script.resolve("${path}/certificate.pem").toFilePath();
  SecurityContext context = new SecurityContext();
  context.useCertificateChain(crt);
  context.usePrivateKey(key, password: "");
  HttpServer.bindSecure("0.0.0.0", port, context)
  .then((HttpServer server) {
    server.listen((HttpRequest request) {
      request.response.write('Hello, world!');
      request.response.close();
    });
  });
}

void startD(int port) {
  HttpServer.bind("0.0.0.0", port)
  .then((HttpServer server) {
    server.listen((HttpRequest request) {
      request.response.write('Hello, world!');
      request.response.close();
    });
  });
}
```

# (8) HTTPとして動かしてみる。
```
$ dart /root/hellobeacon/entryserver/bin/server.dart --port 80
```

# (9) 証明書作成
```
$ openssl genrsa -out key.pem 2048
$ openssl req -new -key key.pem -out csr.pem
$ openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem
```

# (10) HTTPSとして動作させてみる。
```
$ dart <絶対パス>/server.dart --port 443 --cert <証明書を作成したフォルダーへの絶対パス>
```

# (11) サーバー起動時に自動で立ち上がるようにする

```
$ emacs /etc/init.d/myserver
#!/bin/sh

start() {
  echo "start envtest"  
  env > /tmp/$(date +%Y%m%d%H%M%S).log
  dart <絶対パス>/server.dart --port 443 --cert <証明書を作成したフォルダーへの絶対パス> &
}

stop() {
  echo "stop envtest"  
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    echo "status envtext"
    ;;
esac

```

```
$ chmod x+ /etc/init.d/envtest
$ update-rc.d myserver defaults 99 1
```

# (12) 再起動して確認
```
shutdown -r now
```


<br>
<br>

# Thanks!

![umiuni2d_demo_2.png](https://qiita-image-store.s3.amazonaws.com/0/54192/7f222229-4b76-657d-11b4-3c1ff588eb15.png)

最後まで、読んでいただきまして、ありがとうございました。
(ref http://pixiv.me/kyorohiro)
(ref https://play.google.com/store/apps/details?id=info.kyorohiro.umiuni2d.demo.mino)

<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/