Deploy to Heroku Logo

เหตุผลที่เราจะใช้งาน Yii2 กับ Heroku ก็เพราะ เราไม่มี Server เป็นของตัวเอง (555) และเมื่อเรามีความจำเป็นที่จะต้องใช้ Server ที่สามารถ Access ได้จาก Internet ทั่ว ๆ ไป เราก็ต้องหาผู้ให้บริการ และเผอิญว่า Heroku มีบริการ PaaS ที่รองรับ Java, Node.js, Scala, Clojure, Python, PHP และ Go แบบที่มี Plan ให้ใช้งานได้ฟรี (1) และ สะดวกสำหรับการ Deploy PHP (2) ทั้ง 2 ข้อนี้รวมกันนั่นทำให้เราต้องเข้าไป Sign Up กับ Heroku ในทันที

Sign Up และ Git

เมื่อได้ Account มาเรียบร้อยแล้ว หันมาที่เครื่อง Local (Ubuntu) เปิด Terminal แล้วติดตั้ง Heroku CLI ให้เรียบร้อยด้วยคำสั่ง

$ sudo snap install heroku --classic

จากนั้นทำการสร้าง Heroku App

$ cd /var/www/hello
$ git init
$ heroku create
Creating app... !
 ▸    Invalid credentials provided.
Enter your Heroku credentials:
Email: odd.daboss@sdee.co
Password: ***********
Creating app... done, ⬢ guarded-bastion-40430
https://guarded-bastion-40430.herokuapp.com/ | https://git.heroku.com/guarded-bastion-40430.git

ใส่ Email และ Password ที่เราใช้ตอนที่ทำการ Sign Up เสร็จแล้วจะได้ Heroku App มา 1 ตัว ในตัวอย่างนี้คือ guarded-bastion-40430 (สำหรับ Free Plan ในขั้นแรกจะให้เราสามารถสร้าง App ได้สูงสุด 5 ตัว - อ่านรายละเอียดเพิ่มเติมที่นี่)

เมื่อได้ App มาแล้ว เราก็จะได้ Git มาด้วยเช่นกัน (ตรวจสอบด้วยคำสั่ง git remote -v หรือถ้าต้องจัดการเพิ่มเอาเองก็จัดการเพิ่ม Remote ซะให้เรียบร้อย)

$ git remote -v
heroku	https://git.heroku.com/guarded-bastion-40430.git (fetch)
heroku	https://git.heroku.com/guarded-bastion-40430.git (push)

Procfile สำหรับ Apache2 บน Heroku

สร้าง Procfile ที่มีบรรทัดนี้ web: vendor/bin/heroku-php-apache2 web/ ไว้ที่ /var/www/hello ของเราด้วยคำสั่ง

$ cat > Procfile
web: vendor/bin/heroku-php-apache2 web/
<Ctrl-d>

ที่ Heroku เราจะใช้ไฟล์นี้เพื่อบอกให้ Root Directory ไปอยู่ที่ web

แก้ไข composer.json

ใน composer.json ให้เพิ่มในส่วนของ require ด้วย 2 รายการนี้:

"fxp/composer-asset-plugin": "*",
"ext-gd": "*"

fxp/composer-asset-plugin อันนี้ต้องใช้แต่โดยปกติเราจะลงเป็น Global ไว้ก็เลยเอามาเพิ่มไว้ในนี้ด้วย ถัดมา ext-gd คือ สิ่งที่เราต้องใช้เพื่อแสดง Captcha ในหน้า Contact - เสร็จแล้วให้สั่ง composer update ด้วย

แก้ไข web/index.php

ตามค่า Default แล้ว Heroku จะ Deploy เป็น Production ซึ่งถ้าเราจะใช้ Yii2 สำหรับ Deploy Production ให้เรา Comment 2 บรรทัดตามที่บอกอยู่ใน web/index.php ออกไป

<?php

// comment out the following two lines when deployed to production
// defined('YII_DEBUG') or define('YII_DEBUG', true); --->>> Comment!
// defined('YII_ENV') or define('YII_ENV', 'dev'); ------>>> Comment!

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

$config = require __DIR__ . '/../config/web.php';

(new yii\web\Application($config))->run();

Pretty URLs

สร้างไฟล์ web/.htaccess ตามนี้

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

Push & Deploy

$ git add .
$ git commit -m "first commit to heroku"
$ git push heroku master
Counting objects: 96, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (77/77), done.
Writing objects: 100% (96/96), 42.80 KiB | 2.04 MiB/s, done.
Total 96 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
.
.
.
remote: Verifying deploy... done.
To https://git.heroku.com/guarded-bastion-40430.git
 * [new branch]      master -> master

ทุกครั้งที่เรา Push ขึ้นไป Heroku จะทำการ Build และ Deploy ให้เราทุกครั้งโดยอัตโนมัติ และถ้าทุกอย่างเรียบร้อยเราก็เข้าไปดูผลลัพธ์ที่หน้าเว็บได้เลย จะเข้าจาก URL (ในตัวอย่างนี้คือ https://guarded-bastion-40430.herokuapp.com/) หรือจะ Login เข้า Heroku คลิกที่ App ตัวที่เราใช้ แล้วเลือก Open app ที่มุมบนด้านขวาของหน้าเว็บก็ได้เช่นกัน - ขอให้สนุกกับ Yii2 และ Heroku นะครับ!