kdoc - Webアプリ テンプレート

  • 作成日:2015-12-01 10:12:25
  • 修正日:2016-06-15 09:07:31

概要

↑ページトップへ

ぴゅーっとWebアプリを立ち上げる。
ウェブアプリの名前は「XYZ」で。

  1. centos
  2. plenv
  3. cpanm
  4. carton
  5. git
  6. cpanfile
  7. mojolicious
  8. apache
  9. teng

centos

↑ページトップへ

とりあえず6.5。

ユーザ

もちろん、ユーザアカウントはxyzじゃなくてもいいけど。

$ useradd xyz
$ passwd xyz
$ usermod -G wheel xyz (wheelグループへ)

// wheelグループのユーザだけsuできるように
$ su -
# vi /etc/pam.d/su
auth required pam_wheel.so use_uid (コメント外す)

// wheelグループのユーザはsudodできる
# visudo
%wheel ALL=(ALL) ALL (コメント外す)
// すべてのホストから すべてのユーザになれ すべてのコマンド使用可、の意

plenv

↑ページトップへ

インストール

$ cd ~

https://github.com/tokuhirom/plenv の通りにインストール。

Perlのインストール

// インストール可能なバージョンリスト
$ plenv install --list

// ※偶数が安定板。RC1、RC2…を経て。

// 例えばPerl5.22.0をインストール。
$ plenv install 5.22.0 -Dusethreads
$ plenv rehash

// とりあえずlocalでそのバージョンへ
$ plevn local 5.22.0

cpanm

↑ページトップへ

5.22.0に対して、cpanmを入れる。

$ plenv install-cpanm

// 確認
$ plenv exec cpanm -V

carton

↑ページトップへ

plenv経由で。

$ plenv exec cpanm Carton

// 確認
$ plenv exec carton -v

git

↑ページトップへ

GithubとかBitbuscketとかでリポジトリ作成。

ディレクトリ準備。

$ cd ~
$ mkdir xyz
$ cd ~/xyz

// このディレクトリでのPerlバージョンを固定
$ plenv local 5.22.0
// →.perl-version ファイルが作成される。
$ git init
$ git remote add origin https://アカウント@bitbucket.org/アカウント/xyz.git

// git管理無視リスト作成
$ vi .gitignore
local/ …… cartonで作成されるPerlモジュールディレクトリ
xyz_web/log/ …… これから作るMojoliciousのログディレクトリ

コミットしてプッシュ。

$ git status …… どんな感じか確認
$ git add --all …… あれこれを追加 (git add -A と同じ)
$ git commit -m "基本ファイル作成"
$ git push -u origin master … リポジトリへ反映 (次回からは git push のみで)

※「-u」オプション…追跡設定。git pull時に引数を省略できる。git status時にahead, behindが分かる。

cpanfile

↑ページトップへ

$ cd ~/xyz
$ vi cpanfile
requires 'Mojolicious';
requires 'Digest::SHA';
requires 'Time::HiRes';
requires 'Teng';
#requires 'Mouse';
requires 'DBI';
requires 'DBD::mysql';
#requires 'DBD::SQLite';
#requires 'DBD::Oracle';

ローカルのcpanfileを元にモジュールインストール。

$ plenv exec carton install

// cpanfile.snapshotを元にするなら (本番環境デプロイ時)
$ plenv exec carton install --deployment

mojolicious

↑ページトップへ

スケルトン作成。

$ cd ~/xyz
$ plenv exec carton exec -- mojo generate app Xyz::Web

起動してみる。
バックグラウンドへまわすなら、末尾に「&」。

$ plenv exec carton exec -- morbo script/xyz_web

// ポート3738で起動なら
$ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web

apache 2系

↑ページトップへ

リバースプロキシの設定。
http://192.168.0.37/xyz でアクセスできるように。
→/xyz に来たら、localhost:3738 へ。

$ sudo su -
# cd /etc/httpd/conf.d
# vi xyz.conf
ProxyPass /xyz http://localhost:3738 nocanon
ProxyPassReverse /xyz http://localhost:3738

※nocanonをつけることで、URLの正規化を抑制(つまり通常は正規化される)。

あるいは以下を追加。

<Proxy http://localhost:3738/*>
  Order deny,allow
  Allow from all
</Proxy>

確認して再起動。

// 確認
# service httpd configtest

// 再起動
# service httpd graceful

git

↑ページトップへ

うまく動いたら、ここらでgit commit & git push。
「git add -A」で削除したファイル/ディレクトリも対象に。

$ git status
$ git add -A
$ git commit -m "スケルトン構築&サーバ起動OK"
$ git push

今後、更新されたかもしれないリモートの状態をローカルへ反映させる時は…。

$ git pull

config

↑ページトップへ

$ cd ~/xyz/xyz_web
$ mkdir config
$ vi default.conf

/config/default.conf

+ {
  db => {
    connect_info => [
      'dbi:mysql:xyz_production',
      'root',
      'password',
      {
        mysql_enable_utf8 => 1
      }
    ]
  }
};

/config/dev.conf

+ {
  db => {
    connect_info => [
      'dbi:mysql:xyz_development',
      'root',
      'password',
      {
        mysql_enable_utf8 => 1
      }
    ]
  }
};

環境変数 XYZ_CONF で「dev」と指定すると、dev.conf を読み込む、ということにする。

/lib/Xyz/Web.pm

sub startup {
  my $self = shift;

  # config
  my $config_name = $ENV{XYZ_CONFIG} || 'default';
  my $config = $self->plugin('Config', {file => "config/$config_name.conf"});

  ...
}

teng

↑ページトップへ

O/Rマッパ。

/lib/Xyz/Web.pm

sub startup {
  my $self = shift;
  ...
  # db - $self->app->dbでアクセス可能
  $self->attr(
    db => sub {
      Xyz::DB->new($config->{db});
    }
  );
  ...
}

/lib/DB.pm

package Xyz::DB;
use parent 'Teng';

1;

/lib/DB/Schema.pm

package Xyz::DB::Schema;
use Teng::Schema::Declare;

table {
  name 'memo';
  pk 'id';
  columns qw[id title body created_at created_by updated_at updated_by];
};

table {
  name 'user';
  pk 'id';
  columns qw[id name age];
};

1;

log

↑ページトップへ

/log/ ディレクトリがあれば、そこにログが出力される。
なければ、標準エラー出力。
本番環境には /log/ 用意。

ツリー

↑ページトップへ

Xyz_web
|-- lib
|   |-- Xyz
|   |   |-- DB
|   |   |   `-- Schema.pm
|   |   |-- DB.pm
|   |   |-- Model
|   |   |   `-- Category.pm
|   |   |-- Model.pm
|   |   |-- Web
|   |   |   `-- Controller
|   |   |       `-- Example.pm
|   |   `-- Web.pm
|   `-- Xyz.pm
|-- public
|   |-- common
|   |   |-- xyz.css
|   |   |-- bootstrap
|   |   |   `-- 3.3.5
|   |   |       `-- theme.css
|   |   |-- bootstrap-datetimepicker
|   |   |   `-- 4.17.37
|   |   |       |-- css
|   |   |       |   |-- bootstrap-datetimepicker.css
|   |   |       |   `-- bootstrap-datetimepicker.min.css
|   |   |       `-- js
|   |   |           `-- bootstrap-datetimepicker.min.js
|   |   `-- moment
|   |       `-- 2.10.6
|   |           |-- moment-with-locales.js
|   |           `-- moment-with-locales.min.js
|   |-- image
|   |   |-- 21249623125_b8b3793b3c_z.jpg
|   |   `-- 21308059141_ae054bc804_m.jpg
|   `-- index.html
|-- script
|   `-- xyz_web
|-- t
|   `-- basic.t
`-- templates
    |-- at
    |   `-- index.html.ep
    |-- event
    |   |-- edit.html.ep
    |   `-- index.html.ep
    |-- example
    |   `-- welcome.html.ep
    |-- layouts
    |   |-- default.html.ep
    |   `-- normal.html.ep
    |-- parts
    |   |-- google_ad_responsible.html.ep
    |   `-- site_header.html.ep
    |-- root
    `-- user
        `-- index.html.ep

データベースパスワード等

↑ページトップへ

.bash_profileに設定してプログラムからENVで参照。

$ vi ~/.bash_profile
export XYZ_CONFIG=dev
export XYZ_DB_USERNAME=root
export XYZ_DB_PASSWORD=xYz123XyZ456

// 読み込み直し
$ source ~/.bash_profile

// 確認
printenv | grep XYZ

アプリサーバ

↑ページトップへ

開発サーバでmorbo(モーボ)

// 起動
$ plenv exec carton exec -- morbo script/xyz_web

// ポート3738で起動なら
$ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web

本番サーバで

// 起動
$ plenv exec carton exec -- hypnotoad script/xyz_web

// 再起動(ホットデプロイ)(同じ)
$ plenv exec carton exec -- hypnotoad script/xyz_web

// ストップ
$ plenv exec carton exec -- hypnotoad --stop script/xyz_web
$ plenv exec carton exec -- hypnotoad -s script/xyz_web

// フォアグラウンドで起動(バックグラウンドへまわさない)
$ plenv exec carton exec -- hypnotoad -f script/xyz_web

// ヘルプ
plenv exec carton exec -- hypnotoad --help

Server available at http://127.0.0.1:8080.