+13

Bài 18: Deploy project Laravel, VueJS lên Heroku

Chào mừng các bạn quay trở lại với series học Laravel với VueJS của mình, ở bài trước mình đã hướng dẫn các bạn cách phân quyền trong Laravel và bài này chúng ta sẽ cùng tìm hiểu cách upload project lên Heroku sau đó setup database nhé.

Đầu tiên là chúng ta sẽ sử dụng nguyên project như của bài trước nhé, code các bạn có thể lấy ở đây

Chuẩn bị

Đâù tiên chúng ta cần cài đặt Heroku CLI để có thể dùng command nhé.

Trước hết ta chạy command sau:

npm install -g heroku

Để test heroku cài đặt thành công chưa, ta chạy command:

heroku --version

Nếu có kết quả dạng heroku/7.0.0 (darwin-x64) node-v8.0.0 là ổn rồi đó.

Tiếp theo các bạn lên trang heroku.com và tạo một tài khoản. Sau đó ta mở command line tại thư mục gốc của project và login bằng cách:

heroku login

Hoàn tất bước này ta bắt đầu bước sau nhé 😃

Bắt tay vào làm thôi ^^

Tạo project

Vẫn ở cửa sổ command line ta mở ở thư mục gốc project. Ta chạy lệnh sau:

heroku create

Command này sẽ tạo một app tương ứng với project của chúng ta trên hệ thống của heroku. Các bạn có thể xem kết quả trực tiếp sau khi chạy command ở https://dashboard.heroku.com/apps.

Tạo Procfile

Tiếp theo ta bắt buộc phải tạo một file đặt tên là Procfile, file này đặt ở mức ngoài cùng của thư mục gốc. Nội dung của file này đơn giản như sau:

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

Các bạn chú ý nhé, ở trên phần hướng dẫn với PHP trên trang chủ Heroku thì code bên trên không phải là public mà là web nhưng vì ta dùng Laravel nên ta cần phải trỏ tới folder public nhé 😃 Tiếp theo ta chạy command sau để push toàn bộ project lên heroku:

git add .
git commit -m update
git push heroku master

Hoàn thành ta chạy git status để chắc chắn các file đã được push lên.

Sau đó các bạn chạy command sau để mở project trên trình duyệt:

heroku open

Setup

Sau khi mở trên trình duyệt thì các bạn sẽ thấy lỗi Something went wrong, bởi vì app của chúng ta chưa chạy key:generate nhưng trên trình duyệt không thấy báo lỗi đó vì file .env trên server có biến APP_DEBUG đang để là false nên ta không debug project được. Để có thể debug ta mở project trên https://dashboard.heroku.com/apps, vào mục Settings, click Reveal config vars, thêm một biến mới là APP_DEBUG có giá trị true.

Tiếp theo ta cần fix lỗi key:generate bằng cách chạy command:

heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)

Sau đó ta chạy lại heroku open để mở app một lần nữa, và ta sẽ thấy kết quả hiện trên màn hình. Oops, nhưng mà form bị lỗi css tùm lum rồi @@. Mở console thì thấy báo lỗi mixed content... was load over HTTPS...., lỗi này bởi vì các resources(js, css...) của chúng ta chưa được load bằng https. Để fix lỗi đó ta làm như sau. Mở app/Providers/AppServiceProvider và sửa lại như sau:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Contracts\Routing\UrlGenerator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(UrlGenerator $url)
    {
        Schema::defaultStringLength(191);
        if(env('REDIRECT_HTTPS')) {
            $url->formatScheme('https');
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        if(env('REDIRECT_HTTPS')) {
            $this->app['request']->server->set('HTTPS', true);
        }
    }
}

Sau đó quay lại app của chúng ta ở trên trang https://dashboard.heroku.com/apps, mở Settings và Reveal config vars. Thêm 2 biến mới tên:

  • REDIRECT_HTTPS giá trị true
  • APP_URL giá trị là tên đường dẫn app của bạn khi chạy heroku open ví dụ của mình là https://boiling-waters-95127.herokuapp.com/ Sau đó ta cần commit lại project vì khi nãy có sửa code phần AppServiceProvider nhé:
git add .
git commit -m "fix https"
git push heroku master

Sau đó chạy heroku open một lần nữa và ta đã thấy không còn lỗi css nữa. Thử đăng nhập thì bị báo lỗi connection refused vì ta chưa setup database. Cùng sang phần sau nhé 😉

Setup database

Vì hiện tại trên Heroku không cung cấp phpmyadmin nên ta sẽ sử dụng postgre sql nhé 😃, cách setup và migrate không khác gì mysql thông thường và quan trọng là nó FREE nhé các bạn 😎

Để cài đặt postgre sql cho project ta chạy command sau:

heroku addons:create heroku-postgresql:hobby-dev

Sau đó để kiểm tra cài đặt thành công hay chưa ta vào config vars của app trên trang heroku.com nếu thấy có thêm một biến mới là DATABASE_URL và có giá trị là ok rồi đó 😎. heroku

Tiếp theo ta quay trở lại project mở config/database.php và thêm vào phần đầu file như sau:

<?php

$url = parse_url(getenv('DATABASE_URL'));
$host = $url['host'] ?? null;
$username = $url['user'] ?? null;
$password = $url['pass'] ?? null;
$database = substr($url['path'], 1) ?? null;

return [
........

Đoạn code trên đơn giản là ta lấy thông tin về database từ biến DATABASE_URL.

Tiếp theo scroll xuống dưới ta có thể thấy Laravel định nghĩa sẵn cho chúng ta các loại DB, ta thêm mới một loại nữa như sau:

...
'pgsql_production' => [
    'driver' => 'pgsql',
    'host' => $host,
    'port' => env('DB_PORT', '5432'),
    'database' => $database,
    'username' => $username,
    'password' => $password,
    'charset' => 'utf8',
    'prefix' => '',
    'schema' => 'public',
    'sslmode' => 'prefer',
],
...

Sau đó lại scroll lên đầu phần default ta sửa lại như sau để sử dụng connection ta vừa khai báo làm connection mặc định:

'default' => env('DB_CONNECTION', 'pgsql_production'),

Tiếp theo ta cần commit lại code nhé:

git add .
git commit -m "setup db"
git push heroku master

OK chạy app thôi nào, heroku open, sau đó ta đăng nhập và bị báo lỗi table doesn't exist..., WTFFFFFFFFFF .

Ta đã quên một bước quan trọng đó là migrateseed data. Chạy command sau nhé:

heroku run php artisan migrate

Nhớ chọn yes nếu bị hỏi nhé. Cuối cùng là F5 lại page và đăng nhập thử nhé các bạn. Bùm, kết quả cuối cùng 😄 laravel_heroku

Kết thúc

Sau bài này ta đã biết cách upload một project Laravel và VueJS lên heroku. Từ đó sau này đã có thêm một nơi để test free 😃. Vì bây giờ muốn test project kiểu này ta thường cần phải có VPS mà cái đó chả bao giờ dễ kiếm cả 😄.

Cám ơn các bạn đã theo dõi, nếu có vấn đề gì ở bước nào các bạn cứ comment bên dưới cho mình nhé ^^!


All rights reserved

Bình luận

Đăng nhập để bình luận
Avatar
@duongricky
thg 8 16, 2018 9:00 SA

web: vendor/bin/heroku-php-apache2 public/ Em chưa hiểu chổ nào lắm a, a nói rõ giúp em với

Avatar

em có thể xem ở đây nhé: https://devcenter.heroku.com/articles/getting-started-with-laravel#creating-a-procfile cơ bản là để Heroku biết được những command nào nên chạy khi ta khởi động app, ví dụ khi up lên heroku em ko cần tự tay chạy php artisan serve nữa.

Avatar
@duongricky
thg 8 18, 2018 3:28 CH

tks a !!!

Avatar
@tuan_1
thg 10 1, 2018 9:56 SA

cho em hỏi? Khi kết nối được nhưng tại sao lại ko đăng nhập được như dưới localhost

Avatar
@maitrungduc1410
thg 10 1, 2018 10:35 SA

em đã migrate dữ liệu chưa, thử đăng kí 1 tài khoản mởi xem, mở console trên chrome xem có bất kì lỗi gì khi gửi request không em nhé, anh mới dùng lại tut này deploy 1 app chiều nay vẫn oke

Avatar
@duongricky
thg 10 3, 2018 8:50 SA

echo web: vendor/bin/heroku-php-apache2 public/ Procfile Lệnh này để tạo à anh

Avatar
@maitrungduc1410
thg 10 3, 2018 11:44 SA

uk em

Avatar
@oliverusselldev
thg 2 11, 2019 10:40 SA

Instead of Heroku, I would recommend using Cloudways PaaS. If you are using this platform, you don't have to know how to hosting Laravel project manually. This is because this platform provides Laravel configured server on top infrastructures in just few clicks.

Avatar

thank you for your answer, it will be good to have a try 😃

Avatar
@duongricky
thg 4 18, 2019 8:25 SA

Anh ơi cho e hỏi vấn đề này chút ạ, hiện tại e đang build website = laravel và vuejs, e phân vân ở chỗ khi nào chúng ta nên dùng component của vuejs, khi nào nên xài blade template của laravel, e nghĩ như này mấy cái đăng nhập vào hệ thống thì nên sử dụng blade template còn sử dụng component cho việc list danh sách các người dùng, bài viết, bla bla, ... có hợp lý không a

Avatar

chào em, việc dùng component hay blade thì theo anh, đều là HTML cả, nhưng tuỳ nhu cầu từng project mà ta làm cho hợp lý. Theo thực tế a hay làm và a cũng để ý từ các site, thì những trang như đăng nhập họ sẽ dùng blade, sau đó khi login thành công vào trong app rồi thì mới dùng đến component của Vue, vì có 1 số vấn đề quan trọng liên quan đến redirect user tuỳ theo trạng thái đã đăng nhập hay chưa, nên để chắc chắn thì khi user đăng nhập ta mới trả về trang blade chứa Vue/React app còn không thì redirect đến trang khác. Cả bên React a cũng thấy ng ta hay làm thế. Việc này không có chuẩn, đây chỉ là 1 cách để e tham khảo thôi nhé, a cũng thấy 1 số site làm full 1 app Vue/React từ trang chủ, đăng nhập đến app bên trong, redirect dùng vue/react-router 😄

Avatar
@duongricky
thg 4 20, 2019 3:16 SA

vâng e cảm ơn ạ, thôi thì mình cứ đi theo cái thông dụng !!!

Avatar
@ltt
thg 4 22, 2019 4:36 CH
Avatar
@binh27112004
thg 4 9, 2020 3:17 SA

Em dùng host của Hostinger có cách nào deploy lên không ạ 😦 tại hostinger không chạy được lệnh php artisan serve ạ

Avatar

Với hostinger thì cấu hình hơi phức tạp hơn chút vì (chắc là) e đang dùng dịch vụ hosting, hầu như chẳng thể cấu hình gì nhiều.

e xem tut này để biết cách setup project laravel trên Hostinger nhé.

Lời khuyên: đầu tư chút tiền (vài chục k VNĐ / 1 tháng) thuê 1 con VPS mà làm + học e à (của AWS hoặc Digital Ocean hay Google cloud cũng đc,....), thì e sẽ toàn quyền cấu hình chỉnh sửa, và tutorial trên mạng cũng nhiều hơn để e tham khảo

Avatar
@binh27112004
thg 4 9, 2020 6:58 SA

Dạ vâng ạ. Nhưng khi em deploy lên Heroku thử ý. Tới bước nhập lệnh heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show). Em bị báo như này là sao ạ. ! artisan is invalid. Must be in the format FOO=bar.

Avatar

Bài tut này a cũng viết đc 1 tgian rồi, a tin là từ đó đến giờ đã có nhiều thay đổi, a sẽ làm lại và reply e sớm nhất nhé, 😄

Avatar
@truonghaha
thg 10 16, 2021 6:35 SA

Anh cho em hỏi vuejs riêng và laravel riêng , thì deploy thế nào ạ

Avatar
+13
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí