NTM Solutions

Bài đăng nổi bật

🚀 Laravel 12 (2026) — Từ PHP Core đến Full Stack📘

Nếu cập nhật theo Laravel 12 LTS (2026) thì mình sẽ chia thành các phần như sau để người học đi từ PHP Core → Laravel → Triển khai dự án th...

Thứ Hai, 21 tháng 9, 2026

🚀LARAVEL 13 — BÀI 45 — DEPLOY SHARED HOSTING

Sau khi hoàn thành:

Bài 41 — REST API
Bài 42 — API Resource
Bài 43 — Sanctum
Bài 44 — API Authentication

chúng ta đã hoàn thành phần REST API.

Bây giờ bắt đầu:

PHẦN 10 — TRIỂN KHAI

Và bài đầu tiên là:

Deploy Laravel 13 lên Shared Hosting

Mục tiêu của bài này là đưa project Blog CMS từ:

Máy tính cá nhân
       ↓
Laragon
       ↓
127.0.0.1:8000

lên:

Shared Hosting
       ↓
domain.com
       ↓
Laravel 13
       ↓
MySQL

1. Shared Hosting là gì?

Shared Hosting là loại hosting trong đó nhiều website cùng sử dụng tài nguyên của một server.

Ví dụ:

SERVER
│
├── Website A
├── Website B
├── Website C
├── Blog Laravel
└── Website D

Nhà cung cấp hosting thường quản lý sẵn:

  • Web server

  • PHP

  • MySQL/MariaDB

  • SSL

  • Domain

  • FTP

  • File Manager

  • Database

  • Cron Job

Người dùng chủ yếu quản lý website của mình.


2. Shared Hosting phù hợp với Laravel không?

Có.

Laravel có thể chạy trên Shared Hosting nếu hosting đáp ứng các yêu cầu cần thiết.

Đối với Laravel 13, server production cần PHP >= 8.3 cùng các extension PHP cần thiết như:

Ctype
cURL
DOM
Fileinfo
Filter
Hash
Mbstring
OpenSSL
PCRE
PDO
Session
Tokenizer
XML

Đây là các yêu cầu được Laravel 13 liệt kê trong tài liệu deployment chính thức.

Vì vậy trước khi mua hosting:

KHÔNG chỉ hỏi:
"Hosting có PHP không?"

mà phải kiểm tra:

PHP 8.3+
MySQL
PDO
Mbstring
OpenSSL
Fileinfo
Composer hoặc cách cài dependencies
Cron Job
Document Root

3. Laravel không giống PHP thuần

Với PHP thuần, chúng ta có thể upload:

index.php
config.php

vào:

public_html/

và chạy.

Laravel có cấu trúc:

blog/
│
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env
└── artisan

Không nên biến toàn bộ project thành thư mục public.

Laravel được thiết kế để web server phục vụ ứng dụng thông qua:

public/index.php

Laravel cũng cảnh báo không nên phục vụ application từ project root vì có thể làm lộ các file cấu hình và dữ liệu nhạy cảm.


4. Cấu trúc đúng

Giả sử project nằm:

/home/user/blog/

thì:

/home/user/blog/
│
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
│   ├── index.php
│   ├── build/
│   └── ...
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env
└── artisan

Web server phải trỏ vào:

/home/user/blog/public

chứ không phải:

/home/user/blog

Sơ đồ:

                 DOMAIN
                    │
                    ▼
          /home/user/blog/public
                    │
                    ▼
               index.php
                    │
                    ▼
              Laravel 13

5. Document Root là gì?

Document Root là thư mục mà web server dùng để phục vụ website.

Ví dụ:

example.com
       ↓
Document Root
       ↓
/home/user/blog/public

Khi người dùng truy cập:

https://example.com

web server sẽ tìm:

public/index.php

Laravel xử lý request từ đó.


6. Tuyệt đối không làm thế này

Không nên:

public_html/
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── .env
├── artisan
└── index.php

Vì bạn đã đưa cả:

.env
artisan
composer.json
config/

vào vùng có khả năng được web server phục vụ.

Đây là cấu hình không an toàn.

Laravel yêu cầu web server trỏ tới thư mục public thay vì project root.


7. Có hai cách triển khai phổ biến

Trên Shared Hosting thường có hai tình huống.

Cách 1 — Hosting cho đổi Document Root

Đây là cách sạch nhất.

Ví dụ:

/home/user/blog/public

được cấu hình làm Document Root của:

example.com

Khi đó:

example.com
      ↓
blog/public

Cách 2 — Hosting bắt buộc dùng public_html

Một số Shared Hosting cấu hình:

public_html/

là web root mặc định và không cho đổi.

Khi đó có thể tổ chức project theo kiểu:

/home/user/
│
├── blog/
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── database/
│   ├── resources/
│   ├── routes/
│   ├── storage/
│   ├── vendor/
│   └── .env
│
└── public_html/
    ├── index.php
    ├── build/
    ├── storage/
    └── ...

Nhưng cách này cần cấu hình index.php đúng đường dẫn tới project.


8. public/index.php

Trong Laravel, file:

public/index.php

là entry point của ứng dụng.

Nó khởi động Laravel:

<?php

use Illuminate\Foundation\Application;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
    require $maintenance;
}

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$app->handleRequest(Request::capture());

Điểm quan trọng là:

__DIR__.'/../vendor/autoload.php'

và:

__DIR__.'/../bootstrap/app.php'

đều giả định:

public/
├── index.php
│
└── ../
    ├── vendor/
    └── bootstrap/

Vì vậy không được tùy tiện di chuyển index.php mà không điều chỉnh cấu trúc.


9. Chuẩn bị project trước khi deploy

Trước khi upload:

php artisan optimize:clear

Sau đó kiểm tra:

php artisan migrate:status

Kiểm tra route:

php artisan route:list

Kiểm tra package:

composer show

Nếu sử dụng frontend:

npm run build

Laravel sử dụng Vite để build CSS/JavaScript thành các asset production. Laravel cũng hướng dẫn chạy npm install && npm run build khi chuẩn bị application.


10. Build frontend

Nếu project Blog CMS đang sử dụng Vite:

npm install

sau đó:

npm run build

Thông thường kết quả sẽ tạo:

public/build/

Ví dụ:

public/
└── build/
    ├── assets/
    │   ├── app-xxxxx.css
    │   └── app-xxxxx.js
    └── manifest.json

Khi deploy:

Phải upload cả public/build/.

Nếu quên:

CSS mất
JS mất
Layout vỡ

11. node_modules có cần upload không?

Thông thường:

node_modules/

không cần upload lên hosting nếu bạn đã chạy:

npm run build

ở máy local.

Thứ cần deploy là asset đã build:

public/build/

Do đó:

node_modules/

có thể không cần đưa lên production.


12. vendor có cần upload không?

Có hai phương án.

Phương án A — Composer có trên hosting

Upload:

composer.json
composer.lock

sau đó trên server:

composer install --no-dev --optimize-autoloader

Phương án B — Hosting không có Composer

Có thể chạy Composer ở máy local:

composer install --no-dev --optimize-autoloader

sau đó upload:

vendor/

lên hosting.

Tuy nhiên phải đảm bảo môi trường production tương thích.

Nếu hosting cung cấp SSH + Composer:

Nên ưu tiên chạy Composer trực tiếp trên server.


13. composer install khác composer update

Khi deploy:

composer install

thường phù hợp hơn:

composer update

Vì:

composer.lock

đã khóa phiên bản package.

Production nên cài đúng dependency đã được kiểm tra ở môi trường development.

Ví dụ:

composer install --no-dev --optimize-autoloader

14. Không upload .env từ máy local một cách máy móc

Đây là lỗi rất thường gặp.

Local:

APP_ENV=local
APP_DEBUG=true
APP_URL=http://127.0.0.1:8000

Production không nên giữ nguyên.

Ví dụ production:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://example.com

Database cũng phải đổi:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog_production
DB_USERNAME=blog_user
DB_PASSWORD=********

15. APP_KEY

Laravel cần:

APP_KEY=

Nếu project đã có key:

APP_KEY=base64:xxxxxxxxxxxxxxxx

thì khi deploy project hiện tại:

Không tự ý tạo APP_KEY mới.

Nếu tạo key mới trên production:

php artisan key:generate

có thể khiến dữ liệu đã mã hóa bằng key cũ không còn giải mã được.

Đối với một project đã chạy thật:

APP_KEY

là thông tin rất quan trọng.


16. Cấu hình Database

Trong cPanel hoặc control panel của hosting:

MySQL Databases

tạo:

Database
User
Password

Ví dụ:

Database:
user_blog

User:
user_blog

Password:
********

Sau đó .env:

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=user_blog

DB_USERNAME=user_blog

DB_PASSWORD=********

Tên thực tế có thể được hosting tự động thêm prefix:

account_user_blog
account_blog

Do đó phải dùng đúng thông tin mà hosting cung cấp.


17. Import Database

Local có database:

laravel13

Có thể export bằng:

phpMyAdmin

chọn:

Export

format:

SQL

Sau đó vào phpMyAdmin trên hosting:

Import

chọn:

database.sql

và import.


18. Migration hay Import SQL?

Có hai cách.

Cách 1 — Import database

Export:

local.sql

Import:

production database

Phù hợp khi:

đã có dữ liệu

Cách 2 — Migration

Nếu database production mới:

php artisan migrate --force

Laravel sẽ tạo bảng theo migration.

Tham số:

--force

cho phép migration chạy trong môi trường production mà không yêu cầu xác nhận tương tác.


19. Khi nào dùng Seeder?

Nếu cần dữ liệu mặc định:

php artisan db:seed --force

Ví dụ:

categories
admin
default settings

Nhưng phải cẩn thận với Seeder production.

Không nên chạy Seeder chứa:

User::truncate();

hoặc:

Post::truncate();

trên database thật.


20. Upload source lên hosting

Project:

blog/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── vendor/
├── artisan
├── composer.json
├── composer.lock
└── .env

Có thể upload thông qua:

FTP
SFTP
File Manager
SSH
Git

Nếu hosting hỗ trợ Git/SSH thì triển khai bằng Git thường thuận tiện hơn khi project tiếp tục cập nhật.


21. Cấu trúc Shared Hosting khuyến nghị

Nếu hosting cho phép đổi Document Root:

/home/account/
│
└── blog/
    │
    ├── app/
    ├── bootstrap/
    ├── config/
    ├── database/
    ├── public/
    ├── resources/
    ├── routes/
    ├── storage/
    ├── vendor/
    ├── .env
    └── artisan

Domain:

example.com

Document Root:

/home/account/blog/public

Đây là cấu trúc sạch nhất.


22. Nếu phải dùng public_html

Ví dụ hosting bắt buộc:

public_html/

thì có thể:

/home/account/
│
├── blog/
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── database/
│   ├── resources/
│   ├── routes/
│   ├── storage/
│   ├── vendor/
│   └── .env
│
└── public_html/
    ├── index.php
    ├── .htaccess
    ├── build/
    └── storage/

index.php phải trỏ đúng tới:

../blog/vendor/autoload.php

và:

../blog/bootstrap/app.php

Ví dụ:

require __DIR__.'/../blog/vendor/autoload.php';

$app = require_once __DIR__.'/../blog/bootstrap/app.php';

Tuy nhiên đường dẫn chính xác phụ thuộc cấu trúc hosting.

Nếu hosting cho phép đổi Document Root, nên dùng cách đó thay vì phải sửa index.php.


23. .htaccess

Nếu Shared Hosting sử dụng Apache, Laravel thường cần rewrite request về:

index.php

Trong thư mục:

public/

Laravel có file:

.htaccess

để xử lý việc này trên Apache.

Cấu trúc:

public/
├── .htaccess
├── index.php
└── build/

Không nên lấy một .htaccess tùy tiện trên Internet rồi thay thế mà không hiểu nó làm gì.


24. Storage

Đây là phần rất dễ gặp lỗi khi deploy Blog CMS.

Local:

php artisan storage:link

tạo symbolic link:

public/storage
        ↓
storage/app/public

Laravel 13 cũng dùng cơ chế này cho public disk.

Ví dụ upload:

$post->image = $request
    ->file('image')
    ->store('posts', 'public');

Database có thể lưu:

posts/abc123.jpg

File thực tế:

storage/app/public/posts/abc123.jpg

URL:

/storage/posts/abc123.jpg

25. Tạo Storage Link trên Hosting

Nếu hosting có SSH:

php artisan storage:link

Laravel tạo:

public/storage

trỏ tới:

storage/app/public

Đây là cách chính thức được Laravel hướng dẫn cho public disk.

Nếu Shared Hosting không cho tạo symbolic link:

Cách xử lý phụ thuộc control panel/hosting.

Không nên tự ý biến:

storage/app/public

thành một thư mục public bằng cách di chuyển lung tung.


26. Kiểm tra Upload Image

Sau deploy:

Admin
 ↓
Posts
 ↓
Create
 ↓
Upload Image
 ↓
Save

Kiểm tra:

storage/app/public/posts/

có file.

Sau đó browser:

https://example.com/storage/posts/image.jpg

phải hiển thị được.

Nếu database có:

posts/abc.jpg

nhưng browser:

404

thì kiểm tra:

public/storage

trước tiên.


27. Quyền thư mục

Laravel cần ghi vào:

storage/

và:

bootstrap/cache/

Laravel 13 yêu cầu web server process có quyền ghi vào hai thư mục này.

Trên Linux có thể gặp:

Permission denied

khi Laravel cần:

write
cache
log
session
upload

Không nên tùy tiện:

chmod -R 777 .

Đây là cách xử lý quá rộng và không nên dùng như giải pháp mặc định.


28. Storage cần quyền ghi

Ví dụ:

storage/
├── app/
├── framework/
└── logs/

Laravel cần ghi:

storage/logs/
storage/framework/
storage/app/

Đặc biệt Blog CMS của chúng ta có:

Upload Image

nên:

storage/app/public/

cũng phải hoạt động bình thường.


29. Kiểm tra .env

Production:

APP_NAME="Blog CMS"

APP_ENV=production

APP_KEY=base64:xxxxxxxx

APP_DEBUG=false

APP_URL=https://example.com

Database:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=account_blog
DB_USERNAME=account_blog
DB_PASSWORD=********

30. APP_DEBUG=false

Đây là một trong những cấu hình quan trọng nhất.

Không nên:

APP_DEBUG=true

trên production.

Nếu xảy ra exception mà:

APP_DEBUG=true

Laravel có thể hiển thị rất nhiều thông tin nội bộ.

Ví dụ:

Database
Paths
Environment
Stack Trace
Configuration

Laravel khuyến cáo production phải đặt:

APP_DEBUG=false

để tránh làm lộ thông tin nhạy cảm.


31. Sau khi sửa .env

Nếu application đã cache config:

php artisan config:clear

Sau đó có thể kiểm tra lại.

Khi production đã cấu hình chính xác:

php artisan config:cache

Laravel khuyến nghị cache configuration khi deploy production.


32. Optimize Laravel

Laravel 13 cung cấp:

php artisan optimize

Lệnh này cache các thành phần phù hợp cho production.

Có thể dùng:

php artisan optimize

Sau khi deploy.

Laravel cũng cung cấp:

php artisan optimize:clear

để xóa các cache optimization.


33. Cache Configuration

Production:

php artisan config:cache

Sau khi chạy:

config/

được tối ưu thành cache.

Một lưu ý rất quan trọng:

Khi configuration đã được cache, không nên gọi env() trực tiếp bên ngoài các file configuration.

Laravel ghi rõ sau khi config:cache, .env sẽ không được load như trong môi trường chưa cache và các lời gọi env() ngoài config có thể trả về null.

Đúng:

config('app.name');

Không nên:

env('APP_NAME');

trong controller/model/service.


34. Cache Routes

Nếu application có nhiều route:

php artisan route:cache

Laravel tạo route cache để giảm thời gian đăng ký route.

Blog CMS của chúng ta hiện có:

Web Routes
Admin Routes
Blog Routes
API Routes
Authentication Routes

nên khi production ổn định có thể cache route.


35. Cache Views

Có thể chạy:

php artisan view:cache

Laravel sẽ precompile Blade views thay vì chờ compile khi request đầu tiên tới view.


36. Optimize toàn bộ

Thay vì chạy từng lệnh:

php artisan config:cache
php artisan route:cache
php artisan view:cache

có thể sử dụng:

php artisan optimize

Laravel cung cấp optimize như một bước tổng hợp cho deployment production.


37. Quy trình Deploy chuẩn

Với Blog CMS hiện tại, quy trình có thể là:

LOCAL
  │
  ├── Code
  ├── Test
  ├── npm run build
  ├── composer install --no-dev
  │
  ▼
UPLOAD
  │
  ├── app
  ├── bootstrap
  ├── config
  ├── database
  ├── public
  ├── resources
  ├── routes
  ├── storage
  ├── vendor
  ├── artisan
  └── ...
  │
  ▼
SERVER
  │
  ├── .env production
  ├── Database
  ├── Migration
  ├── Storage link
  └── Permission
  │
  ▼
OPTIMIZE
  │
  └── php artisan optimize
  │
  ▼
DOMAIN

38. Một quy trình thực tế

Giả sử project đã hoàn thành.

Bước 1

Local:

npm install

Bước 2

Build:

npm run build

Bước 3

Composer:

composer install --no-dev --optimize-autoloader

Bước 4

Upload project.

Bước 5

Tạo database trên hosting.

Bước 6

Import database hoặc migrate.

Bước 7

Tạo .env production.

Bước 8

Cấu hình:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://example.com

Bước 9

Cấu hình database.

Bước 10

Tạo storage link:

php artisan storage:link

Bước 11

Optimize:

php artisan optimize

Bước 12

Mở:

https://example.com

39. Nếu có lỗi 500

Đừng đoán.

Kiểm tra:

storage/logs/

Laravel ghi log vào hệ thống logging của application.

Ví dụ:

storage/logs/laravel.log

Có thể kiểm tra:

tail -f storage/logs/laravel.log

nếu hosting có SSH.

Hoặc mở File Manager:

storage
└── logs

40. Lỗi Class not found

Ví dụ:

Class "App\Models\Post" not found

Kiểm tra:

composer install

hoặc:

composer dump-autoload

Nếu production:

composer install --no-dev --optimize-autoloader

41. Lỗi Vite manifest not found

Ví dụ:

Vite manifest not found

Kiểm tra:

public/build/

Có:

manifest.json

hay không.

Nếu không:

npm install
npm run build

sau đó upload:

public/build/

42. CSS không chạy

Nếu trang:

HTML

hiển thị nhưng:

CSS

mất:

kiểm tra:

public/build/

và:

@vite([
    'resources/css/app.css',
    'resources/js/app.js'
])

Ngoài ra kiểm tra:

APP_URL=https://example.com

và xem URL asset trong browser.


43. Image không hiển thị

Kiểm tra:

storage/app/public/

và:

public/storage

Có link hay không.

Nếu có SSH:

php artisan storage:link

Sau đó kiểm tra:

https://example.com/storage/...

Laravel sử dụng public/storage làm symbolic link tới storage/app/public cho public disk.


44. Database không kết nối

Lỗi:

SQLSTATE[HY000]

kiểm tra:

DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

Đặc biệt:

DB_DATABASE
DB_USERNAME

trên Shared Hosting thường có prefix.

Ví dụ bạn nghĩ:

DB_DATABASE=blog

nhưng hosting thực tế:

DB_DATABASE=abc_blog

45. Migration lỗi

Chạy:

php artisan migrate:status

để kiểm tra migration.

Nếu database production đã có dữ liệu:

Không chạy migrate:fresh.

Không dùng:

php artisan migrate:fresh

trên database production có dữ liệu quan trọng.

Lệnh này có thể xóa toàn bộ bảng.


46. APP_URL

Local:

APP_URL=http://127.0.0.1:8000

Production:

APP_URL=https://example.com

Điều này đặc biệt quan trọng với:

URL
Mail
Storage
Asset
Notification

Ví dụ:

asset('storage/'.$post->image)

có thể tạo URL dựa trên cấu hình application.


47. HTTPS

Production nên sử dụng:

https://

thay vì:

http://

Ví dụ:

https://example.com

SSL thường được Shared Hosting cung cấp thông qua:

Let's Encrypt

hoặc hệ thống SSL của nhà cung cấp.

Sau khi bật HTTPS, kiểm tra:

Login
Register
API
Image
CSS
JS
Form

đều hoạt động qua HTTPS.


48. Kiểm tra toàn bộ Blog CMS

Sau deploy, đừng chỉ mở:

/

Hãy test:

/
/login
/register
/blog
/blog/{slug}
/admin/users
/api/posts

và:

/api/login

49. Test Authentication

API:

POST /api/login

lấy token.

Sau đó:

GET /api/user

với:

Authorization: Bearer TOKEN

Nếu hoạt động:

Laravel
+
Sanctum
+
Database
+
HTTPS

đã kết nối đúng.


50. Health Check

Laravel 13 có health route mặc định:

/up

Nếu application khởi động bình thường, route này trả về:

200

Laravel cung cấp route này để monitoring application trong production.

Ví dụ:

https://example.com/up

Nếu hosting cho phép:

200 OK

là một dấu hiệu tốt rằng application đã boot thành công.


51. Checklist Deploy Laravel 13

Trước khi kết luận deploy thành công:

☐ PHP >= 8.3

☐ Database đã tạo

☐ Database credentials đúng

☐ APP_KEY đúng

☐ APP_ENV=production

☐ APP_DEBUG=false

☐ APP_URL=https://domain.com

☐ Composer dependencies đã cài

☐ public/ là Document Root

☐ public/build/ tồn tại

☐ storage/ có quyền ghi

☐ bootstrap/cache/ có quyền ghi

☐ storage:link đã tạo

☐ Migration đã chạy

☐ Homepage hoạt động

☐ Login hoạt động

☐ Register hoạt động

☐ Admin hoạt động

☐ Upload Image hoạt động

☐ Blog hoạt động

☐ API hoạt động

☐ Sanctum hoạt động

☐ HTTPS hoạt động

☐ /up hoạt động

52. Những lỗi người mới thường gặp

Lỗi 1

Đưa toàn bộ Laravel vào:

public_html

và cho web server chạy trực tiếp từ đó.

Vấn đề

Có thể làm lộ file nội bộ.

Giải pháp

Document Root:

project/public

Lỗi 2

Quên:

npm run build

Kết quả

CSS mất
JS mất

Lỗi 3

Quên:

php artisan storage:link

Kết quả

Upload thành công

nhưng:

Image 404

Lỗi 4

Để:

APP_DEBUG=true

trên production.

Kết quả

Có nguy cơ lộ thông tin nội bộ.


Lỗi 5

Database .env vẫn là:

DB_DATABASE=laravel13
DB_USERNAME=root
DB_PASSWORD=

Kết quả

Production không kết nối database.


Lỗi 6

Upload code nhưng quên:

vendor/

và hosting không có Composer.

Kết quả

Class not found

Lỗi 7

Upload code mới nhưng không clear/cache lại configuration.

Có thể gặp tình trạng:

.env đã sửa

nhưng Laravel vẫn sử dụng configuration cache cũ.

Khi đó:

php artisan optimize:clear

sau đó cấu hình lại và:

php artisan optimize

53. Deploy không chỉ là Upload File

Đây là điều quan trọng nhất của bài.

Deploy Laravel không phải:

Upload
    ↓
Done

Mà là:

Code
 ↓
Dependencies
 ↓
Environment
 ↓
Database
 ↓
Document Root
 ↓
Storage
 ↓
Permission
 ↓
Frontend Build
 ↓
Cache
 ↓
HTTPS
 ↓
Testing
 ↓
Production

54. Kiến trúc Blog CMS sau khi Deploy

Sau bài này project có thể hình dung:

                    INTERNET
                        │
                        ▼
                  example.com
                        │
                        ▼
                 HTTPS / Web Server
                        │
                        ▼
                   public/
                        │
                  index.php
                        │
                        ▼
                  Laravel 13
                        │
       ┌────────────────┼────────────────┐
       │                │                │
       ▼                ▼                ▼
   Web Routes        API Routes       Storage
       │                │                │
       ▼                ▼                ▼
     Breeze          Sanctum       Uploaded Images
       │                │
       ▼                ▼
    Session           Token
       │                │
       └────────┬───────┘
                ▼
              MySQL

Đây đã là một ứng dụng Laravel thực tế thay vì chỉ chạy trên localhost.


55. Ghi nhớ

Laravel 13

PHP >= 8.3

Web Root

project/public

Không dùng

project/

làm web root.

Frontend

npm run build

Dependencies

composer install --no-dev --optimize-autoloader

Database

php artisan migrate --force

Storage

php artisan storage:link

Production

APP_ENV=production
APP_DEBUG=false

Optimize

php artisan optimize

Health Check

/up

56. Tổng kết Bài 45

Trong bài này chúng ta đã đưa Laravel 13 từ:

LOCALHOST

lên:

SHARED HOSTING

Đã học:

Shared Hosting
        ↓
PHP 8.3+
        ↓
Document Root
        ↓
public/
        ↓
.env
        ↓
MySQL
        ↓
Composer
        ↓
Vite
        ↓
Storage
        ↓
Permission
        ↓
HTTPS
        ↓
Optimization

Đối với Blog CMS của khóa học, quy trình quan trọng nhất cần nhớ là:

                 LOCAL
                   │
                   ▼
             Test Application
                   │
                   ▼
             npm run build
                   │
                   ▼
          composer install
                   │
                   ▼
                UPLOAD
                   │
                   ▼
           Configure .env
                   │
                   ▼
           Configure Database
                   │
                   ▼
            Run Migration
                   │
                   ▼
          php artisan storage:link
                   │
                   ▼
            php artisan optimize
                   │
                   ▼
                 HTTPS
                   │
                   ▼
                TEST
                   │
                   ▼
              PRODUCTION

Và có một nguyên tắc đặc biệt quan trọng:

Laravel phải được phục vụ từ thư mục public, không phải từ project root.

Laravel 13 cũng yêu cầu production có quyền ghi cho storage và bootstrap/cache, đồng thời khuyến nghị các bước caching/optimization phù hợp khi triển khai.


🎯 Sau Bài 45

Chúng ta đã hoàn thành:

Bài 45 — Deploy Shared Hosting

Tiếp theo:

🖥️ Bài 46 — Deploy VPS

Lúc đó chúng ta sẽ không còn chỉ sử dụng hosting control panel nữa mà bắt đầu làm việc trực tiếp với server:

VPS
 ↓
Ubuntu
 ↓
SSH
 ↓
PHP
 ↓
Composer
 ↓
MySQL
 ↓
Nginx
 ↓
Laravel

Sau đó Bài 47 — Nginx sẽ đi sâu vào web server và cách cấu hình Laravel với Nginx.

x1
quay về MỤC LỤC

Không có nhận xét nào:

Đăng nhận xét

Facebook Youtube RSS