1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

日本語諸方言コーパスをDB化して遊ぶ (9) Heroku でデプロイする

Last updated at Posted at 2020-08-17

連載記事です。前回までに機能はだいたい作ったので、今回は本番環境 Heroku でビルドしていきます。完全に自分用の作業メモで、説明もいろいろ足りていないと思いますが、ご容赦ください。

以下の記事を大いに参考したうえで、今回のプロジェクトに特化していきます。

heroku app の作成と git 管理

第5回で既に heroku app の作成自体は済ませているので、ここではローカルリポジトリと heroku 上のリモートリポジトリを連携させます。

cmd
git init
git add .
git commit -a -m "first commit"
heroku git:remote -a my-app-name 

buildpack の設定

今回は PHP Laravel のプロジェクトですが、Node.js と Python も使うのでこいつらも buildpack に含めておきます。Heroku のプロジェクトページからポチポチ追加してもいいでしょう。

cmd
heroku buildpacks:set heroku/php -a my-app-name
heroku buildpacks:add heroku/python -a my-app-name
heroku buildpacks:add heroku/nodejs -a my-app-name

Procfile の作成

heroku ではプロセス管理に foreman というツールを使っています。この foreman が読み込んで使う設定ファイルが Procfile で、管理すべきプロセスを定められた書式で記述したものです。ここではルートに拡張子なしの Procfile というファイルを作成して、以下のように記述します(heroku においては web というプロセス名が特別な扱いを受けるようです)。無難に Apache を使えばよいでしょう。

Procfile
web: vendor/bin/heroku-php-apache2 public/

Python 用 requirement.txt の作成

使用する python スクリプトが xlrd などの非標準モジュールを利用する場合は、ルートに python 用の requirement.txt を用意しておくと、ビルド時に勝手にインストールしてくれます。今回は pip freeze > requirements.txt で現在インストールされているモジュールをすべて書き出して、そこから不要なものを削除して作成しました。

使用する Python のバージョンを指定したい場合は runtime.txt を作成すればよいようです。

環境変数の設定

ローカルの .env.gitignore で push 対象から外してあるはずですので、DB 関連の環境変数は heroku に手動で追加していきます。接続には時間がかかるのでワンライナーで終わらせましょう(バッククォートは無改行を示す)。

cmd
heroku config:set DB_CONNECTION=pgsql `
DB_HOST=*** `
DB_PORT=*** `
DB_DATABASE=*** `
DB_USERNAME=*** `
DB_PASSWORD=*** `
DATABASE_URL=postgres://***

ついでに以下の要素も設定しておきます。APP_KEYphp artisan key:generate で発行するものですが、たぶん composerにより既に設定されているので .env からのコピペでよいでしょう。

cmd
heroku config:set APP_NAME=my-app-name `
APP_KEY=***  ` 
APP_URL=https://my-app-name.herokuapp.com  

composer.json の変更

基本的に heroku run コマンドによる実行ではルート権限は行使できませんが、composer.json 内の scripts->compile にコマンドを書いておくとビルド時にルート権限で実行してくれます。ここでは、python スクリプトに実行権限を与え、/storage フォルダ以下に読み書き権限を与え、シンボリックリンクを張ります1

composer.json
{
    "scripts": {
        "compile": [
            "chmod +x app/Python/textgrid_to_excel.py",
            "chmod +x app/Python/excel_to_textgrid.py",
            "chmod --recursive 775 storage/app",
            "ln --symbolic --relative storage/app/public public/storage"
        ]
    }
}

.htaccess の変更

シンボリックリンクを有効にするために .htaccess の Option に以下を追記します。Option +somesetting で機能を有効化、Option -somesetting で無効化する書式です。

public/.htaccess
Option +FollowSymlinks

コンパイルのタイミング

Laravel プロジェクトは npm run devnpm run production のようなコマンドでコンパイルされますが、既定ではコンパイルされた /public/js/public/css は git の push 対象から外れていると思うので、開発環境でコンパイルしたものをそのまま使う場合は .gitignore から外しておきましょう。うっかりするとどこにもコンパイル済みファイルが存在しない状態が発生しエラー2の原因になります。

.gitignore
- /public/js
- /public/css

デプロイ

設定がすべて終わったらデプロイします。上の操作で heroku app を作成して git と連携させていれば、master(もしくは main)ブランチを git push するだけで勝手にビルド・デプロイしてくれます。それ以外のブランチにはそういうトリガーが設定されていないので、あえてビルドしたいときは公式を参照してください。

cmd
git push heroku master

おわりに

Docker なんかを利用していたら、本記事で詰まった点はある程度素通りできたのではないかと思いますが、本記事の扱う領域は筆者自身勉強し始めたばかりですので、よくわかりません(近いうちに勉強します)。

また、本記事も含めて本連載の内容は試行錯誤してたどり着いたものですので、無駄な工程や書き洩らしている工程、不適切な説明がたくさんあると思います。指摘していただけると喜びます。

  1. シンボリックリンクは heroku run php artisan storage:link でも貼れると思いますが、試していないので分かりません。

  2. 404 や 500 ではなく、ファイルの参照がおかしくなって Syntax error : unexpected token '<' みたいなのが出る。

1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?