5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DartAdvent Calendar 2015

Day 24

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

Last updated at Posted at 2015-12-24

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

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

試してみたい的な。

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

(1) Serversman から500円の VPSを借りる。

http://dream.jp/vps/
Ubuntu 64 bitを選んでね!!


# (2) ログインする ``` ssh root@ -p ```

(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


Thanks!

umiuni2d_demo_2.png

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



------- Kyorohiro Work http://kyorohiro.strikingly.com/
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?