Cài đặt Laravel trên Heroku miễn phí

Heroku là mô hình điện toán đám mây với nền tảng là dịch vụ (Platform as a Service – PaaS), nó hỗ trợ rất nhiều các ngôn ngữ lập trình khác nhau như Ruby on Rails, PHP, Python, Java, Node.js, Scala, Clojure… Heroku giúp bạn quên đi những lo toan về cơ sở hạ tầng mà chỉ tập trung vào các ứng dụng bạn cần phát triển. Heroku có rất nhiều các tính năng ưu việt như:

  • Triển khai nhanh ứng dụng thông qua Git kết hợp với việc sử dụng các kịch bản build.
  • Có nhiều Addon cài đặt thêm như các ứng dụng, cơ sở dữ liệu…
  • Khả năng mở rộng quy mô lớn, quy mô độc lập cho từng ứng dụng không ảnh hưởng bởi các chức năng và hiệu suất.
  • Tách biệt các xử lý bằng dyno (Heroku dyno là một Linux container rút gọn có thể chạy các lệnh người dùng).
  • Cho phép đăng nhập và truy xuất output của mọi thành phần trên từng dyno.

Heroku cho phép bạn tạo miễn phí các dyno để triển khai các ứng dụng, tuy nhiên dyno miễn phí bị hạn chế là sẽ chuyển sang chế độ ngủ nếu không có truy nhập trong 30 phút. Ngoài ra các gói khác của Heroku là mất phí. Heroku hiện đang là đối thủ của HP Clound service, Openshift, Amazon Web service, Google App Engine, Windows Azure…

Cài đặt Laravel trên Heroku

Heroku có những hỗ trợ lớn với các môi trường PHP như hỗ trợ công cụ composer và trở thành điểm lưu trữ tốt cho các ứng dụng PHP. Trong bài viết này chúng ta sẽ cài đặt một ứng dụng Laravel trên Heroku với tốc độ nhanh chóng và cũng là ví dụ để làm quen với Heroku.

Yêu cầu chuẩn bị trước khi cài đặt

Trước khi thực hiện cài đặt, chúng ta cần chuẩn bị một số công cụ trước như sau:

1. Đăng ký tài khoản Heroku

Đăng ký tài khoản trên Heroku rất nhanh chóng, bạn điền các thông tin vào form đăng ký, click Create Free Account. Mặc định Heroku tạo các tài khoản miễn phí, sau đó khi sử dụng, nếu bạn có yêu cầu sẽ chuyển sang tài khoản mất phí. Một email xác thực sẽ được gửi đến địa chỉ email của bạn, thực hiện click vào đường dẫn xác thực là bạn đã có ngay tài khoản Heroku.

2. Cài đặt Composer trên máy

Composer là công cụ quản lý các phụ thuộc các thư viện lập trình bằng PHP, xem Hướng dẫn cài đặt Composer.

3. Cài đặt Heroku Toolbelt (tên khác Heroku CLI – Heroku Command Line Interface).

Heroku CLI là công cụ tạo và quản lý các ứng dụng Heroku từ dòng lệnh/shell trên các hệ điều hành khác nhau:

Cài đặt Heroku trên Windows:

Tải các bản cài đặt Heroku về và cài đặt tùy thuộc nền tảng Windows bạn đang sử dụng: windows-32-bit, windows-64-bit. Chú ý, bộ cài này tích hợp cùng với bộ cài Git do Heroku hỗ trợ git để triển khai ứng dụng.

Cài đặt Heroku trên OSX:

Tải bản cài đặt Heroku cho OSX và cài đặt, hoặc sử dụng brew để cài đặt:

$ brew install heroku
Cài đặt Heroku trên Linux:

Sử dụng các câu lệnh sau để add repository và thực hiện cài đặt CLI:

$ sudo apt-get install software-properties-common # debian only
$ sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
$ curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install heroku

Sau khi đã cài đặt xong, kiểm tra phiên bản Heroku để đảm bảo đã cài đặt thành công:

$ heroku --version
heroku-cli/5.6.0-010a227 (darwin-amd64) go1.7.4
4. Tạo key SSH bảo mật kết nối đến Heroku

Tham khảo bài viết SSH là gì để biết cách tạo cặp khóa private key và public key. Heroku hỗ trợ cả hai định dạng khóa là RSA và DSA. Để add public key vào Heroku sử dụng câu lệnh:

$ heroku keys:add
Found existing public key: /Users/admin/.ssh/id_rsa.pub
Uploading SSH public key /Users/admin/.ssh/id_rsa.pub... done

Mặc định Heroku sẽ tìm kiếm public key tại đường dẫn ~\.ssh\id_rsa.pub.

Các bước thực hiện cài đặt Laravel, git push và triển khai trên Heroku

Bước 1: Cài đặt một bản Laravel mới trên máy local.

c:\xampp\htdocs>composer create-project laravel/laravel laravel-heroku-test
Installing laravel/laravel (v5.4.16)
 - Installing laravel/laravel (v5.4.16): Downloading (100%)
Created project in laravel-heroku-test
> php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 59 installs, 0 updates, 0 removals
 - Installing symfony/polyfill-mbstring (v1.3.0): Loading from cache
 - Installing symfony/var-dumper (v3.2.7): Downloading (100%)
...
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled services file has been removed.
> php artisan key:generate
Application key [base64:91uviK378405ctL2vqwNa8vZYf4VDpOFO58lDQpmzdY=] set successfully.

Chỉnh sửa file .gitignore để bỏ qua các file và thư mục không xử lý với git, chỉnh sửa nội dung file này chỉ còn như sau:

/vendor
/node_modules
Homestead.yaml
Homestead.json
.env

Xóa file .env.example khỏi thư mục laravel-heroku-test.

Bước 2: Tạo Procfile

Heroku dựa trên Procfile để biết cần xử lý gì khi khởi tạo dyno. Xem chi tiết các thiết lập trong phần Custom PHP settings

c:\xampp\htdocs\laravel-heroku-test>echo web:vendor/bin/heroku-php-apache2 public/> Procfile

Bước 3: Đăng nhập Heroku và tạo ứng dụng bằng Heroku CLI

c:\xampp\htdocs\laravel-heroku-test>heroku login
Enter your Heroku credentials:
Email: allaravel.com@gmail.com
Password: **********
Logged in as allaravel.com@gmail.com

c:\xampp\htdocs\laravel-heroku-test>heroku create allaravel-heroku
Creating allaravel-heroku... done
https://allaravel-heroku.herokuapp.com/ | https://git.heroku.com/allaravel-heroku.git

Như vậy chúng ta đã tạo ra ứng dụng tên allaravel-heroku trên Heroku. Thiết lập ngôn ngữ cho ứng dụng:

c:\xampp\htdocs\laravel-heroku-test>heroku buildpacks:set heroku/php

Có thể bỏ qua bước thiết lập ngôn ngữ cho ứng dụng vì khi Git push, Heroku sẽ tự động phát hiện đây là ngôn ngữ PHP.

Bước 4: Push ứng dụng Laravel lên Heroku Git.

Đầu tiên tạo local repository, commit source ứng dụng Laravel vào đó.

c:\xampp\htdocs\laravel-heroku-test>git init
Initialized empty Git repository in c:/xampp/htdocs/laravel-heroku-test/.git/
c:\xampp\htdocs\laravel-heroku-test>git add .
warning: LF will be replaced by CRLF in .env.example.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in .gitattributes.
...
c:\xampp\htdocs\laravel-heroku-test>git commit -m "first commit on Heroku"
...
 create mode 100644 tests/TestCase.php
 create mode 100644 tests/Unit/ExampleTest.php
 create mode 100644 webpack.mix.js

c:\xampp\htdocs\laravel-heroku-test>

Tiếp theo, chúng ta push lên Heroku Git

c:\xampp\htdocs\laravel-heroku-test>git remote add heroku https://git.heroku.com/allaravel-heroku.git
fatal: remote heroku already exists.

Do câu lệnh tạo ứng dụng trong heroku đã mặc định tạo remote heroku, chúng ta chỉ việc sử dụng thôi.

c:\xampp\htdocs\laravel-heroku-test>git push heroku master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 380 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        - php (7.1.3)
remote:        - ext-mbstring (bundled with php)
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote: -----> Installing dependencies...
remote:        Composer version 1.4.1 2017-03-10 09:29:45
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:        Package operations: 31 installs, 0 updates, 0 removals
remote:          - Installing doctrine/inflector (v1.1.0): Loading from cache
remote:          - Installing erusev/parsedown (1.6.2): Loading from cache
remote:          - Installing jakub-onderka/php-console-color (0.1): Loading fro
m cache
remote:          - Installing symfony/polyfill-mbstring (v1.3.0): Loading from c
ache
remote:          - Installing symfony/var-dumper (v3.2.7): Loading from cache
remote:          - Installing psr/log (1.0.2): Loading from cache
remote:          - Installing symfony/debug (v3.2.7): Loading from cache
remote:          - Installing symfony/console (v3.2.7): Loading from cache
remote:          - Installing nikic/php-parser (v3.0.5): Loading from cache
remote:          - Installing jakub-onderka/php-console-highlighter (v0.3.2): Lo
ading from cache
remote:          - Installing dnoegel/php-xdg-base-dir (0.1): Loading from cache

remote:          - Installing psy/psysh (v0.8.3): Loading from cache
remote:          - Installing vlucas/phpdotenv (v2.4.0): Loading from cache
remote:          - Installing symfony/css-selector (v3.2.7): Loading from cache
remote:          - Installing tijsverkoyen/css-to-inline-styles (2.2.0): Loading
 from cache
remote:          - Installing symfony/routing (v3.2.7): Loading from cache
remote:          - Installing symfony/process (v3.2.7): Loading from cache
remote:          - Installing symfony/http-foundation (v3.2.7): Loading from cac
he
remote:          - Installing symfony/event-dispatcher (v3.2.7): Loading from ca
che
remote:          - Installing symfony/http-kernel (v3.2.7): Loading from cache
remote:          - Installing symfony/finder (v3.2.7): Loading from cache
remote:          - Installing swiftmailer/swiftmailer (v5.4.6): Loading from cac
he
remote:          - Installing paragonie/random_compat (v2.0.10): Loading from ca
che
remote:          - Installing ramsey/uuid (3.6.1): Loading from cache
remote:          - Installing symfony/translation (v3.2.7): Loading from cache
remote:          - Installing nesbot/carbon (1.22.1): Loading from cache
remote:          - Installing mtdowling/cron-expression (v1.2.0): Loading from c
ache
remote:          - Installing monolog/monolog (1.22.1): Loading from cache
remote:          - Installing league/flysystem (1.0.37): Loading from cache
remote:          - Installing laravel/framework (v5.4.17): Loading from cache
remote:          - Installing laravel/tinker (v1.0.0): Loading from cache
remote:        Generating optimized autoload files
remote:        > Illuminate\Foundation\ComposerScripts::postInstall
remote:        > php artisan optimize
remote:        Generating optimized class loader
remote:        The compiled services file has been removed.
remote: -----> Preparing runtime environment...
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 16.1M
remote: -----> Launching...
remote:        Released v7
remote:        https://allaravel-heroku.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/allaravel-heroku.git
   d926a9f..8e4d964  master -> master

c:\xampp\htdocs\laravel-heroku-test>

Ok, như vậy đã push và build xong trên Heroku, Heroku sử dụng Procfile cho quá trình build này. Có thể truy nhập luôn vào đường dẫn mà Heroku thông báo https://allaravel-heroku.herokuapp.com/ hoặc có thể sử dụng câu lệnh:

c:\xampp\htdocs\laravel-heroku-test>heroku open

Khi mở ứng dụng lên tại https://allaravel-heroku.herokuapp.com/ thấy báo lỗi “Whoops, looks like something went wrong.”, để xem lỗi rõ hơn, bật chế độ debug lên. Mở file config/app.php sửa debug thành true.

'debug' => env('APP_DEBUG', true),

Mở lại đường dẫn https://allaravel-heroku.herokuapp.com/ lỗi đã cụ thể hơn.

RuntimeException in Encrypter.php line 43:
The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.

À do chúng ta cho file .env vào .gitignore nên nó không push lên Heroku Git. Chúng ta thiết lập key cho ứng dụng Laravel trong config/app.php

    'key' => env('APP_KEY', 'base64:91uviK378405ctL2vqwNa8vZYf4VDpOFO58lDQpmzdY='),
    'cipher' => 'AES-256-CBC',

Key này lấy từ .env hoặc bạn có thể tạo lại key bằng lệnh artisan rồi copy vào config/app.php. (Xem lại Thiết lập cấu hình cho ứng dụng Laravel)

php artisan key:generate
Application key [base64:bib6Gi4iQ/sI3WTq8L7baYcD4wRZrd7dUNOoTOENsUg=] set successfully.

Ok, thực hiện commit và push lên Heroku Git.

c:\xampp\htdocs\laravel-heroku-test>git add .
warning: LF will be replaced by CRLF in config/app.php.
The file will have its original line endings in your working directory.

c:\xampp\htdocs\laravel-heroku-test>git commit -m "third commit"
[master warning: LF will be replaced by CRLF in config/app.php.
The file will have its original line endings in your working directory.
2cf6868] 7th commit
warning: LF will be replaced by CRLF in config/app.php.
The file will have its original line endings in your working directory.
 1 file changed, 1 insertion(+), 1 deletion(-)

c:\xampp\htdocs\laravel-heroku-test>git push heroku master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 368 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        - php (7.1.3)
remote:        - ext-mbstring (bundled with php)
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote: -----> Installing dependencies...
remote:        Composer version 1.4.1 2017-03-10 09:29:45
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:        Package operations: 31 installs, 0 updates, 0 removals
remote:          - Installing doctrine/inflector (v1.1.0): Loading from cache
remote:          - Installing erusev/parsedown (1.6.2): Loading from cache
remote:          - Installing jakub-onderka/php-console-color (0.1): Loading fro
m cache
remote:          - Installing symfony/polyfill-mbstring (v1.3.0): Loading from c
ache
remote:          - Installing symfony/var-dumper (v3.2.7): Loading from cache
remote:          - Installing psr/log (1.0.2): Loading from cache
remote:          - Installing symfony/debug (v3.2.7): Loading from cache
remote:          - Installing symfony/console (v3.2.7): Loading from cache
remote:          - Installing nikic/php-parser (v3.0.5): Loading from cache
remote:          - Installing jakub-onderka/php-console-highlighter (v0.3.2): Lo
ading from cache
remote:          - Installing dnoegel/php-xdg-base-dir (0.1): Loading from cache

remote:          - Installing psy/psysh (v0.8.3): Loading from cache
remote:          - Installing vlucas/phpdotenv (v2.4.0): Loading from cache
remote:          - Installing symfony/css-selector (v3.2.7): Loading from cache
remote:          - Installing tijsverkoyen/css-to-inline-styles (2.2.0): Loading
 from cache
remote:          - Installing symfony/routing (v3.2.7): Loading from cache
remote:          - Installing symfony/process (v3.2.7): Loading from cache
remote:          - Installing symfony/http-foundation (v3.2.7): Loading from cac
he
remote:          - Installing symfony/event-dispatcher (v3.2.7): Loading from ca
che
remote:          - Installing symfony/http-kernel (v3.2.7): Loading from cache
remote:          - Installing symfony/finder (v3.2.7): Loading from cache
remote:          - Installing swiftmailer/swiftmailer (v5.4.6): Loading from cac
he
remote:          - Installing paragonie/random_compat (v2.0.10): Loading from ca
che
remote:          - Installing ramsey/uuid (3.6.1): Loading from cache
remote:          - Installing symfony/translation (v3.2.7): Loading from cache
remote:          - Installing nesbot/carbon (1.22.1): Loading from cache
remote:          - Installing mtdowling/cron-expression (v1.2.0): Loading from c
ache
remote:          - Installing monolog/monolog (1.22.1): Loading from cache
remote:          - Installing league/flysystem (1.0.37): Loading from cache
remote:          - Installing laravel/framework (v5.4.17): Loading from cache
remote:          - Installing laravel/tinker (v1.0.0): Loading from cache
remote:        Generating optimized autoload files
remote:        > Illuminate\Foundation\ComposerScripts::postInstall
remote:        > php artisan optimize
remote:        Generating optimized class loader
remote:        The compiled services file has been removed.
remote: -----> Preparing runtime environment...
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 16.1M
remote: -----> Launching...
remote:        Released v9
remote:        https://allaravel-heroku.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/allaravel-heroku.git
   9e7fc12..2cf6868  master -> master

Giờ chúng ta kiểm tra thử lại ứng dụng Laravel này tại https://allaravel-heroku.herokuapp.com/.

Test cài đặt ứng dụng Laravel trên Heroku miễn phí

Ngăn chặn dyno chuyển sang chế độ ngủ

Gói miễn phí của Heroku như đã nói ở trên dyno sẽ chuyển sang chế độ sleep nếu không có request nào trong 30 phút. Mỗi khi dyno ở chế độ ngủ, một request mới đến sẽ làm nó chuyển chế độ sang hoạt động bình thường và mất khoảng 10-15 giây. Chúng ta phải chấp nhận thôi vì đây là gói miễn phí, tuy nhiên có nhiều cách khiến cho dyno không bao giờ chuyển sang chế độ ngủ:

Sử dụng các service ping:

Các công cụ như Pingdom, Pingometer.comUptimeRobot, Kaffeine … sẽ request ứng dụng theo thời gian bạn lựa chọn, như vậy dyno sẽ không bao giờ vào chế độ sleep.

Cài đặt package Heroku self ping:

Không cần sử dụng đến các công cụ bên thứ ba, bạn có thể cài đặt Heroku Self ping để thực hiện ping một đường dẫn nào đó trong một khoảng thời gain.

Lời kết

Heroku là một nền tảng đáng để thử nghiệm, quá trình cài đặt ứng dụng cực nhanh chóng, hơn nữa nó MIỄN PHÍ. Trong bài viết đầu này, chúng ta chỉ làm quen cách cài đặt cơ bản ứng dụng Laravel trên Heroku, trong những bài tiếp theo sẽ tìm hiểu sâu hơn cách thức cài đặt CSDL, thiết lập dyno… và đưa ứng dụng laravel-test chứa toàn bộ các bài ví dụ cho Học Laravel trong 7 ngày lên Heroku.

4 thoughts on “Cài đặt Laravel trên Heroku miễn phí

      1. Heroku sử dụng file Procfile để nhận biết bắt đầu chạy từ đâu trong project, bạn tạo một file tên Procfile với nội dung:
        web:vendor/bin/heroku-php-apache2 public/
        ở thư mục gốc dự án rồi upload cùng dự án là tự động Heroku sẽ đọc từ đây.

  1. If you want to host a Laravel app on a server, you can also use Cloudways PaaS. With this platform, user can launch a managed laravel server in just a single click without having to manually install or configure the stack.

Add Comment