noteにせよMediumにせよGhostにせよシングルカラムのブログが流行ってますね。だいぶ前にGhost入れてみてフーンで終わってたので改めてインストールする事にしました。
Herokuはなんだかんだで1年に1回くらい使うけど全然使い方が頭に入らないので今回整理の意味も込めて書いていきます。
これがないと話にならないので、まずはGhostをダウンロードします。
「Ghost」をGoogleで検索すると「Image for Ghost」とか出てきて心臓に悪いですね。
ダウンロードしてきたGhostを解凍・展開します。5/1現在バージョンは0.4.2。
展開したGhostのディレクトリに移動します。
$ cd /path/to/ghost/
$ npm install
$ npm start
$ open http://127.0.0.1:2368/
node.jsが入ってることが前提だけど、これだけどとりあえず動きます。
これをパブリックに公開する為、Herokuにデプロイします。
まずは、デプロイ後に実行されるコマンドを記述したProcfileを作成します。
web: NODE_ENV=production node index.js
いきなりだけど、こけるの承知でHerokuへデプロイする準備にとりかかります。
ProcfileもひっくるめてCommitします。後述のHeroku createする前にcommitしておいた方が後々楽です。
$ git init
$ git add .
$ git commit -m "Initial Commit"
ローカルにHerokuコマンドは入ってるけど鍵とかどうなってるか忘れたので一旦鍵をリセットして新しいのを作成・送信。
$ heroku keys:clear
$ ssh-keygen -t rsa -C "メールアドレス"
.ssh/cofigに下記を追記
IdentityFile ~/.ssh/id_rsa
Herokuへログインします。
$ heroku login
「君のローカルに公開鍵みつかったけどどれを転送する?」
とでるのでさっき生成した公開鍵をHerokuに転送する。
鍵の準備が整ったのでアプリを作成します。
Herokuのサイトからももちろんできるけど、コンソールを開いてるのでコンソールから作ります。
アプリ名はなんでもいいので、
$ heroku create
を実行。
Creating hoge-moge-7151... done, region is us
http://hoge-moge-7151.herokuapp.com/ | git@heroku.com:hoge-moge-7151.git
Git remote heroku added
みたいに一瞬で作成される。
gitのリポジトリを事前につくってたので、Herokuのリモートリポジトリも追加されます。
これで兎にも角にもデプロイする準備ができたのでpushします。
$ git push heroku master
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:hoge-moge-7151.git'
DBがsqliteのままなのでこける
Railsと同じくGhostはsqlite3だけど、Herokuではsqliteが使えないのでPostgresを使います。
まずnpmでpgモジュールがインストールされるようにpackage.jsonを編集。
"dependencies": {
"pg": "latest”,
"bcryptjs": "0.7.10",
"bookshelf": "0.6.1”,
config.jsにPostgresの設定を書きたいところだけど、デフォルトでPostgresが用意されているわけでないので、一旦Herokuのサイトに行きPostgresのアドオンをインストールします。
アドオン一覧のページに行って、Heroku Postgresを追加。プランはFreeのにしておきます。
追加されたPostgresアドオンの詳細ページ(Connection Setting)に接続情報が記載されています。このページを開きながらコンソールに戻りconfig.jsの設定を行います。
編集するのはもちろんProductionの方です。
以下のようになります。
production: {
url: 'http://hoge-moge-7151.herokuapp.com',
mail: {},
database: {
client: 'postgres',
connection: {
host: process.env.POSTGRES_HOST,
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DATABASE,
port: '5432'
},
debug: false
},
server: {
// Host to be passed to node's `net.Server#listen()`
host: '0.0.0.0',
// Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
port: process.env.PORT
}
},
DBだけでなくURLやnodeのポートなんかも設定を変更しています。
DBの接続情報はHerokuの環境変数からとることにします。環境変数へ登録するのは先程のConnection Settingの情報ですね。
heroku config:set POSTGRES_HOST=****
heroku config:set POSTGRES_USER=****
heroku config:set POSTGRES_PASSWORD=****
heroku config:set POSTGRES_DATABASE=****
これでPostgresの設定も完了。
これで一応動くけど、認証メールが送れないとGhostの管理画面で怒られ続けられます。
自分にしか飛ばさないので、SMTPをGmailにしておきます。
mail: {
transport: 'SMTP',
options: {
service: 'Gmail',
auth: {
user: ‘hoge@gmail.com',
pass: ‘*******'
}
}
},
再度pushします。
$ git push heroku master
-----> Launching... done, v13
'http://hoge-moge-7151.herokuapp.com/ deployed to Heroku
To git@heroku.com:hoge-moge-7151.git
79bed5c..7675064 master -> master
$ open http://hoge-moge-7151.herokuapp.com/
問題なく開けれたら成功ですね。
個人的には、Herokuは開発環境/グローバルでのテストとしてはいいけど、痒いところに手が届かず、なかなか公開サービスには使えないと思ってたけどブログ程度ならいい気がしてきた。
開発環境/グローバルでのテストに特化したPaaSがあったらいいのにな。昔のGeocitiesみたいに広告入るPaaS。需要あると思う。