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