Vagrant@node

Vagrant@node

下記の記事を参考に`express x nginx x mongodb`構成の開発環境を作成する。

[参考記事](http://webdesign-dackel.com/2015/09/29/vagrant-node-express4-mongodb/)

## vagrant
### boxの追加・初期化
[公式box配布場所](http://www.vagrantbox.es/)

```
$ vagrant box add centos7 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
$ vagrant box list
# => centos7         (virtualbox, 0)
$ vagrant init centos7
```

### pluginインストール、vagrantfile編集

```
# hostsをよしなに設定
$ vagrant plugin install vagrant-hostsupdater
```

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos7"
  # `http://express-sample.local`
  config.vm.hostname = "express-sample.local"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./html", "/var/www/html"
end
```

```
$ mkdir html
```

### 起動、接続
```
$ vagrant up
$ vagrant ssh
# => Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2 Welcome to your Vagrant-built virtual machine.
[vagrant@express-sample ~]$ pwd
/home/vagrant
```

## SELinux、Firewalledを無効化
開発環境なので無効化
(自分の環境だと仮想環境にホストPCからport80番でアクセスできなかった)
[参考記事](https://orebibou.com/2014/12/centos-7%E3%81%A7selinux%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96/)

## node

### nodebrew

```
[vagrant@express-sample ~]$ curl -L git.io/nodebrew | perl - setup
[vagrant@express-sample ~]$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
[vagrant@express-sample ~]$ source ~/.bashrc
```

### node

```
[vagrant@express-sample ~]$ nodebrew ls-remote
[vagrant@express-sample ~]$ nodebrew install stable
# => install to v7.7.2
[vagrant@express-sample ~]$ nodebrew use v7.7.2
[vagrant@express-sample ~]$ node -v
# => v7.7.2
```
> `stable`で最新の安定バージョン

## nginx

### インストール

```
[vagrant@express-sample ~]$ sudo yum install epel-release
[vagrant@express-sample ~]$ sudo yum install -y nginx
# 起動
[vagrant@express-sample ~]$ sudo systemctl start nginx.service
# 自動起動設定
[vagrant@express-sample ~]$ sudo systemctl enable nginx.service
```
> centos7.xは、Extra Packages for Enterprise Linux (EPEL)のリポジトリをyumに追加する必要があった
> centos7.xは`service`ではなく`systemctrl`

### conf編集

```
[vagrant@express-sample ~]$ sudo vi /etc/nginx/conf.d/virtual.conf
```

```virtual.conf
upstream node-backend {
    server localhost:3000;
}

server {
    listen       80;
    server_name  express-sample.local;

    location / {
	    proxy_redirect                      off;
	    proxy_set_header Host               $host;
	    proxy_set_header X-Real-IP          $remote_addr;
	    proxy_set_header X-Forwarded-Host   $host;
	    proxy_set_header X-Forwarded-Server $host;
	    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_pass http://node-backend;
    }

    charset utf-8;
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;
}
```

```
# 再起動
[vagrant@express-sample ~]$ sudo systemctl restart nginx.service
```

## mongodb

### インストール

```
[vagrant@express-sample ~]$ sudo vi /etc/yum.repos.d/10gen.repo
```

```10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
```

```
[vagrant@express-sample ~]$ sudo yum install -y mongo-10gen mongo-10gen-server
```

### 設定

```
# 起動
sudo service mongod start
# 自動起動設定
sudo chkconfig mongod on
```
> インストールしたmongodbは`systemctrl`ではなかった

## express

### インストール

実際はAPIサーバにするケースが多いと思うけど、ECT入れておく。

[参考記事](http://esperia.hatenablog.com/entry/2015/08/01/204624)

```
[vagrant@express-sample ~]$ cd /var/www/html
[vagrant@express-sample ~]$ sudo yum -y install git
[vagrant@express-sample ~]$ npm i -g esperia/generator
[vagrant@express-sample ~]$ express -ect
[vagrant@express-sample ~]$ npm un express-generator
[vagrant@express-sample ~]$ sudo yum install -y tree
[vagrant@express-sample ~]$ tree
```

```ディレクトリ構成(node_modulesを除外)
.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.ect
    ├── index.ect
    └── layout.ect
```

```
[vagrant@express-sample ~]$ npm i
```

### 

## 配布用のboxファイル作成

### ログアウト

```
[vagrant@express-sample ~]$ exit;
# => logout
$ vagrant halt
```

### boxファイル作成、登録

```
# boxファイル作成
$ vagrant package
# vagrantにboxを登録
$ vagrant box add MEEN-stack package.box
```
> 配布された人は`vagrant init MEEN-stack`で初期化できる
> (MEEN = mongodb, express, ect, node).._(┐「ε:)_