タグ: Heroku

PHPアプリケーションをHerokuにデプロイするときに”ERROR: Couldn’t parse ‘composer.lock’; it must be a valid lock”エラー

PHPアプリケーションをHerokuにデプロイしようと思い、

git push heroku master

としたところ

-----> PHP app detected
-----> Bootstrapping...
-----> Installing platform packages...
 ! ERROR: Couldn't parse 'composer.lock'; it must be a valid lock
  file generated by Composer. Run 'composer update', add/commit
  the change, then push again.
 ! Push rejected, failed to compile PHP app.
 ! Push failed

となりデプロイが失敗。

composer.lockは存在しており、指示通りcomposer updateをしてcomposer.jsoncomposer.lockを更新したうえでデプロイしても同じエラーが発生しました。

php – Heroku ERROR: Failed parsing composer.lock; it must be non-empty and valid JSON – Stack Overflow

より

composer self-updateでcomposer自体を更新し、composer updateしたうえで、デプロイすることでエラーが出なくなりデプロイできました。

KnowledgeをHerokuで動かす

Qiita:Teamのような情報共有ツールで社内LANのような限定的に使うことができるものを探していたところ、Knowledgeを見つけました。

そこで、ためしに、Heroku上で動かしてみました。
作業環境はLinux (Ubuntu 14.04)で行っています。

なお、公式でDeploy to Heroku Buttonに対応しているため、下記の手順を行わなくても、GitHub上のsupport-project/knowledgeの「Deploy to Heroku」を押下するとデプロイ~PostgreSQLアドオンの追加まで行ってくれます。

インストールから起動まで

  1. Herokuアカウントの作成

    Herokuアカウントを持っていない場合は、Sign Upでアカウントを作成します。

  2. JREのインストール

    KnowlegeをHerokuにデプロイする際にJavaが必要なため、作業環境にJREをインストールしておきます。

    $ sudo apt-get install -y default-jre
    
  3. Herokuのコマンドラインツールのインストールとログイン

    Heroku Toolbeltをインストールします。サイト上で、「Debian/Ubuntu」を選択すると表示されるコマンドを実行します。

    $ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
    

    つぎにHerokuにログインします。

    $ heroku login
    
  4. Herokuアプリの作成

    作業用ディレクトリを作成します。

    $ mkdir knowledge
    $ cd knowledge
    

    アプリ名をsample-knowlegeとしてHerokuアプリを作成します。(アプリ名は適宜変更します)

    $ heroku create sample-knowlege
    
  5. Knowledgeのダウンロード

    KnowledgeはJavaのWAR形式で提供されているので、それをダウンロードします。

    ダウンロードはこちらから Releases support-project/knowledge

    執筆時点での最新バージョン1.3.1を使います。

    $ wget https://github.com/support-project/knowledge/releases/download/v1.3.1/knowledge.war
    
  6. WARをHeroku上で動かすために、Heroku ToolbeltのWARデプロイプラグインを追加する

    WARデプロイについて – WAR Deployment | Heroku Dev Center
    WARデプロイプラグインについて – heroku/heroku-deploy

    $ heroku plugins:install https://github.com/heroku/heroku-deploy
    
  7. knowledge.warをHerokuにデプロイ
    $ heroku deploy:war --war knowledge.war --app sample-knowlege
    

    アクセス先URLの確認

    $ heroku apps:info sample-knowlege
    === sample-knowlege
    Dynos:         web: 1
    :
    :
    :
    :
    Web URL:       https://sample-knowlege.herokuapp.com/
    
  8. URLでアクセス

    https://sample-knowlege.herokuapp.com/ にアクセスします。

    Topページ

    ログインはドキュメントKnowledge – Free knowledge base systemより

    ID:admin、パスワード:admin123

    でできます。

DBをPostgreSQLに変更する

KnowledgeのDBはデフォルトでは、組み込みのH2 Databaseを使用しているため、デプロイしなおすとデータが消えます。
永続化するためにデータベースをPostgreSQLに変更します。

  1. HerokuにPostgrSQLのアドオンを追加
    $ heroku addons:create heroku-postgresql --app sample-knowlege
    
  2. JDBC用のURL情報を取得

    KnowledgeにPostgreSQLの接続情報を設定するためにJDBC情報を取得します。
    Connecting to Relational Databases on Heroku with Java | Heroku Dev Centerより

    $ heroku run echo \$JDBC_DATABASE_URL --app sample-knowlege
    Running echo $JDBC_DATABASE_URL on sample-knowlege... up, run.2571
    jdbc:postgresql://ec2-WW-XX-YY-ZZ.compute-1.amazonaws.com:5432/XXXXXXXXXX?user=XXXXXXXXX&password=XXXXXXXXXXXXX&sslmode=require
    
  3. KnowledgeにPostgreSQLの接続情報を登録

    adminでログインしたのち、「システム設定」→「データベースの接続先変更」に以下の情報を入力して「保存」ボタンを押下します。

    driverClass: org.h2.Driver # 選択済みの状態
    URL: 先ほどの手順で取得したJDBCの接続URL
    user:先ほどの手順で取得したJDBCの接続URLにあるuser=の値
    password:先ほどの手順で取得したJDBCの接続URLにあるpassword=の値
    schema:先ほどの手順で取得したJDBCの接続URLにある:5432/と?の間の文字列
    max connection: 0 # そのまま
    auto commit: false # そのまま
    

    DB接続情報入力

  4. 組み込みDBの内容をPostgreSQLにコピー

    先の手順で登録に成功すると、「保存」ボタンの横に「組み込みDBで保存したデータをカスタム設定のDBにコピー」ボタンが現れるので、それを押下してデータをコピーします。

  5. 接続先をPostgreSQLに切り替える

    「driverClass」を「org.h2.Driver」から「org.postgresql.Driver」に変更して「保存」ボタンを押下します。

    ※なお、デプロイしなおすと、DB接続設定がクリアされるため、再度同じ内容を入力して切り替える必要があります。(その際は「組み込みDBで保存したデータをカスタム設定のDBにコピー」は実行しないこと)

その他

  • PostgreSQLの接続情報を登録した際、誤った情報を登録してしまい、Server Errorになった

    Server ErrorになるとTopページは表示されますが、ログインなどができなくなってしまいます。再度、デプロイすることでログインできます。その際組み込みDBに登録している内容はクリアされます。

  • PostgreSQLの内容を見るには

    https://postgres.heroku.com/databases では中身を確認できないため、コマンドラインツール(psqlなど)、WEBツール(phpPgAdminなど)・GUIツールなどで見る必要があります。

Heroku上のPHPアプリケーションにBASIC認証を導入する

Heroku上でnginxをWEBサーバとしたPHPアプリケーションに対してBASIC認証をかける

流れ

  • BASIC認証の設定はnginxの設定ファイルに記述
  • IDやパスワードは環境変数に登録
  • htpasswdファイルはデプロイ時に生成

前提

ディレクトリの初期構成は以下の通り。

public/
    index.php
vendor/
composer.json
Procfile

composer.jsonは

{
    "require-dev": {
        "heroku/heroku-buildpack-php": "*"
    }
}

として、composer install or updateをして、vendor/binディレクトリにvendor/bin/heroku-php-nginxがインストールされている。

Procfileは

web: bin/heroku-php-nginx public

として、ドキュメントルートをpublicフォルダとしてデプロイしている。

手順

  1. 環境変数にBASIC認証アカウントを登録
    $ heroku config:set BASIC_AUTH_USERNAME="basic_auth_user"
    $ heroku config:set BASIC_AUTH_PASSWORD="basic_auth_pass"
    

    またはWEBコンソール (https://dashboard.heroku.com/apps/APPNAME/settings) で追加する

  2. nginxにBASIC認証の設定を加えるため、設定の追加をする

    1. 設定用のフォルダを作成する
      $ mkdir heroku
      $ cd heroku
      
    2. nginx_app.confというファイルを作成する。すでにある場合は、auth_basic,auth_basic_user_fileの部分を追記する
      location / {
          auth_basic            "Restricted";
          auth_basic_user_file  $document_root/../.htpasswd;
      }
      

      このサンプルではルート下すべてをBASIC認証の領域とする。

    3. Procfileを編集して、デプロイ時にnginx_app.confを読み込むませる

      web: bin/heroku-php-nginx -C heroku/nginx_app.conf public
      
  3. Herokuの.profile.dの仕組みを使って、htpasswdファイルを生成するbashスクリプトを追加する
    $ mkdir .profile.d
    $ cd .profile.d
    $ vi gen-htpasswd.sh
    

    gen-htpasswd.shは

    #!/usr/bin/env bash
    set -ex
    
    echo -e "${BASIC_AUTH_USERNAME}:$(perl -le 'print crypt($ENV{"BASIC_AUTH_PASSWORD"}, rand(0xffffffff));')" > /app/.htpasswd
    
  4. Herokuにデプロイする

参考