サーバーサイド、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!
最後まで、読んでいただきまして、ありがとうございました。
(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/