Bài viết này hướng dẫn deploy dự án mẫu (PHP + MySQL) lên VPS theo cách thủ công: export database từ máy local, tạo database trên VPS, import qua phpMyAdmin, upload mã nguồn và các lưu ý khi chạy migration cũng như khi sau này tạo bài viết mới ở local và muốn đưa lên VPS.

1. Chuẩn bị trên máy local

Đảm bảo dự án chạy ổn định local (MAMP hoặc XAMPP), đã có dữ liệu bài viết, cấu hình database trong config/database.local.php.

2. Export database ra file (Terminal)

Mở Terminal, chạy lệnh export database myapp ra Desktop (thay user/password nếu bạn dùng khác):

mysqldump -h 127.0.0.1 -u myapp -pmyapp123 myapp > ~/Desktop/myapp_backup_$(date +%Y-%m-%d_%H-%M).sql

Hoặc export chỉ bảng bài viết (nhẹ hơn, dùng khi chỉ cần đồng bộ bài viết):

mysqldump -h 127.0.0.1 -u myapp -pmyapp123 myapp posts > ~/Desktop/myapp_posts.sql

File .sql sẽ nằm trên Desktop, dùng để import lên VPS.

3. Tạo database mới trên VPS

Đăng nhập VPS qua SSH. Nếu dùng MySQL/MariaDB:

sudo mysql -u root -e \"
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'mat_khau_manh';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
\"

Thay mat_khau_manh bằng mật khẩu an toàn. Ghi lại user và password để điền vào config/database.local.php trên VPS.

4. Import database qua phpMyAdmin

  • Mở phpMyAdmin trên VPS (thường qua panel như cPanel, DirectAdmin hoặc cài riêng).
  • Chọn database myapp (hoặc tạo mới nếu chưa có).
  • Vào tab Import → Chọn file myapp_backup_....sql đã tải từ Desktop lên (upload qua SFTP/FTP trước nếu file nằm trên máy bạn).
  • Chọn Go / Thực hiện để import. Đợi đến khi báo thành công.

Nếu import cả file backup đầy đủ thì toàn bộ bảng (posts, users, orders, config...) sẽ có trên VPS. Nếu chỉ import file myapp_posts.sql thì chỉ có bảng posts (cần đã tạo sẵn các bảng khác bằng migration hoặc schema trước).

5. Upload mã nguồn lên VPS

  • Dùng SFTP, SCP hoặc FileZilla: kết nối VPS, đưa toàn bộ thư mục dự án (trừ .git nếu không dùng Git) vào thư mục web, ví dụ /var/www/myapp.
  • Hoặc nén thư mục dự án thành myapp.zip, upload lên VPS rồi giải nén: unzip myapp.zip -d /var/www/myapp.
  • Đặt quyền thư mục cho web server: sudo chown -R www-data:www-data /var/www/myappsudo chmod -R 755 /var/www/myapp, thư mục data/ cần ghi: sudo chmod -R 775 /var/www/myapp/data.

6. Cấu hình trên VPS

  • Tạo file config/database.local.php trên VPS (copy từ config/database.local.php.example), điền đúng host, dbname, user, password của MySQL trên VPS.
  • Cấu hình Nginx hoặc Apache trỏ document root tới thư mục chứa index.php (ví dụ /var/www/myapp).
  • Bật PHP (php-fpm) và chỉnh rewrite nếu cần (try_files $uri $uri/ /index.php?$query_string).

7. Chạy migration trên VPS

Sau khi upload code và import DB, nếu có thay đổi cấu trúc bảng (thêm cột, thêm bảng) thì chạy migration:

cd /var/www/myapp
php install/migrate.php

Lưu ý migration:

  • Migration chỉ chạy các file trong install/migrations/ chưa được ghi vào bảng schema_migrations. Chạy nhiều lần an toàn, không bị trùng.
  • Nên chạy migration bằng CLI (php install/migrate.php), tránh gọi qua trình duyệt (?run=1) trên production để hạn chế rủi ro.
  • Nếu lần đầu deploy đã import đủ bảng từ file schema.sql hoặc từ backup đầy đủ thì migration 001 có thể đã “được coi là chạy” (bảng đã tồn tại). Các migration tiếp theo (002, 003...) vẫn chạy bình thường khi bạn thêm file mới.

8. Lần sau tạo bài viết mới ở local — đưa lên VPS thế nào?

Bài viết lưu trong database (bảng posts), không nằm trong file đẩy bằng Git. Để có bài viết mới trên VPS bạn cần đưa dữ liệu lên:

  1. Export từ local: mysqldump -h 127.0.0.1 -u myapp -pmyapp123 myapp posts > ~/Desktop/myapp_posts.sql
  2. Upload file .sql lên VPS (SFTP/FTP).
  3. Trên VPS: Import vào database myapp. Nếu file export có DROP TABLE + CREATE TABLE + INSERT thì lần import sẽ thay thế toàn bộ bảng posts trên VPS bằng bản local (bài chỉ có trên VPS sẽ mất). Nếu bạn muốn chỉ thêm bài mới mà không xóa bài cũ trên VPS, cần export dạng chỉ INSERT và dùng INSERT IGNORE (trùng id thì bỏ qua) hoặc chỉ export các bài có ngày tạo mới hơn.

Khuyến nghị: Nếu bạn chỉ chỉnh và tạo bài ở local, VPS chỉ là bản copy thì mỗi lần cập nhật: export cả DB (hoặc ít nhất bảng posts) từ local → upload file .sql → import vào DB trên VPS. Code thì đẩy bằng Git (git push, trên VPS git pull) hoặc upload lại thư mục thay đổi.

9. Tóm tắt quy trình deploy thủ công

BướcViệc cần làm
1Export DB từ local (mysqldump) ra file .sql trên Desktop
2Trên VPS: tạo database myapp và user MySQL
3Import file .sql qua phpMyAdmin (hoặc mysql < file.sql)
4Upload mã nguồn lên VPS (SFTP / Git pull)
5Tạo config/database.local.php, cấu hình Nginx/Apache
6Chạy php install/migrate.php nếu có migration mới

Kết luận

Deploy thủ công dự án mẫu lên VPS gồm: export database bằng Terminal, tạo database và user trên VPS, import qua phpMyAdmin, upload mã nguồn, cấu hình và chạy migration. Khi tạo bài viết mới ở local, cần export (ít nhất bảng posts) và import lại lên VPS để bài xuất hiện trên site production.