search
LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

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

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

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

試してみたい的な。

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

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

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


(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




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/

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
What you can do with signing up
5