Cuối tuần vừa rồi, tôi đã dành hai ngày để mày mò server và hoàn thành hai công việc lớn:
- Xây dựng instance Mastodon cá nhân tại địa chỉ @skyue@m.skyue.com - Mời bạn theo dõi!
- Di chuyển blog từ AWS sang Alibaba Cloud Hong Kong, đồng thời chuyển cơ sở dữ liệu Typecho từ MySQL sang SQLite3.
Nguồn gốc ý tưởng
Năm ngoái, tôi đã quyết định chọn Lightsail của AWS để triển khai blog Typecho vì quảng cáo giá chỉ 3,5 đô la/tháng (CPU đơn/ RAM 512MB/ SSD 20GB). Tuy nhiên, thực tế sử dụng lại cho thấy chi phí trung bình là khoảng 7 đô la/tháng. Rõ ràng là tôi đã bị “lừa” một chút! Nhưng mức giá 7 đô cũng không quá cao so với sự tiện lợi, nên tôi vẫn tiếp tục dùng dù cảm thấy chưa hài lòng hoàn toàn.
!Hóa đơn Lightsail AWS tháng 9
Gần đây, khi có nhu cầu xây dựng instance Mastodon, tôi đã quyết định đầu tư vào máy chủ nhẹ Alibaba Cloud Hong Kong. Với cấu hình vượt trội hơn hẳn: CPU f88 bóng đá đơn/ RAM 2GB/ SSD 50GB nhưng giá chỉ vỏn vẹn 34 Nhân dân tệ/tháng (~120 nghìn đồng). Đây là cơ hội tuyệt vời để di chuyển cả blog sang hệ thống mới!
Xây dựng Instance Mastodon
Hướng dẫn tham khảo: Cách sử dụng Docker để xây dựng instance Mastodon (Phần 1): Hướng dẫn cơ bản
Tôi đã làm theo từng bước trong bài viết trên, chỉ gặp hai lỗi nhỏ mà tôi đã báo lại cho tác giả chỉnh sửa. Đặc biệt lưu ý phần Cài đặt và cấu hình Nginx, đoạn mã sau đây rất quan trọng:
sudo snap install core; sudo snap refresh core # Nếu không có snap thì cài đặt bằng apt install snapd
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d tên miền của bạn
Đoạn mã này được dùng để cài đặt chứng chỉ SSL, hỗ trợ truy cập qua HTTPS. Trong quá trình di chuyển blog Typecho sau đó, tôi cũng tái sử dụng các lệnh này để thêm chứng chỉ SSL cho blog. Cách này đơn giản và hiệu quả hơn nhiều so với việc phải đăng ký, tải về, upload chứng chỉ và cấu hình như trước đây.
Di chuyển Blog Typecho
Phương án Di chuyển MySQL
Ban đầu, tôi chỉ dự định di chuyển server và thay thế Apache bằng Nginx vì Mastodon đang sử dụng Nginx, điều này giúp tiết kiệm tài nguyên và tối ưu hiệu suất.
Do đó, tôi đã thực hiện hai bước chính:
- Đóng gói thư mục gốc của trang web cũ và chuyển sang thư mục website trên server mới, sau đó cấu hình Nginx chỉ vào thư mục này.
- Xuất cơ sở dữ liệu MySQL từ server cũ và nhập vào server mới. Quy trình xuất/nhập MySQL có thể tham khảo hướng dẫn Di chuyển Blog Typecho. Việc cài đặt MySQL trên server mới có thể tham khảo bài viết Cài đặt MySQL trên Ubuntu 18.04.
Một mẹo nhỏ trong quá trình di chuyển file giữa các server: Nếu server cũ vẫn hoạt động, bạn có thể đặt file cần di chuyển vào thư mục gốc của site và sử dụng lệnh wget
từ server mới để lấy chúng.
Sau khi hoàn tất việc di chuyển file và cơ sở dữ liệu, cũng như cấu hình xong Nginx, tôi nghĩ mọi thứ đã sẵn sàng. Tuy nhiên, khi truy cập blog, tôi gặp lỗi kết nối cơ sở dữ liệu. Sau một hồi tìm hiểu, tôi phát hiện ra rằng vấn đề nằm ở quyền truy cập của tài khoản root trong MySQL. Giải pháp có thể tham khảo tại Giải quyết lỗi MySQL ERROR 1698 (28000): Access denied for user ‘root’@’localhost’.
Việc “giải quyết” này nghe thì dễ nhưng thực tế đã khiến tôi phải gỡ bỏ và cài đặt lại MySQL hàng chục lần! Mỗi lần sửa quyền root theo hướng dẫn trực tuyến, tôi lại không thể đăng nhập MySQL bằng mật khẩu root. Cuối cùng, tôi tình cờ phát hiện rằng mình có thể đăng nhập MySQL mà không cần mật khẩu. Từ đó, tôi đã thiết lập mật khẩu trong tệp config.ini.php
của blog thành rỗng, nhờ vậy mà có thể truy cập dữ liệu blog một cách thành công.
Từ kinh nghiệm này, tôi nhận ra rằng việc di chuyển MySQL quá phức tạp, vì vậy tôi quyết định chuyển sang SQLite. SQLite chỉ là một file duy nhất, do đó việc di chuyển chỉ cần sao chép file này là đủ.
Chuyển MySQL sang SQLite3
Blog của tôi có lưu lượng truy cập UV mỗi ngày rất thấp, thường dưới 50 người dùng, vì vậy SQLite hoàn toàn đáp ứng được yêu cầu.
Đầu tiên, tôi cần chuyển đổi dữ liệu MySQL thành file SQLite. Tôi đã tìm thấy một thư viện Python tên là mysql-to-sqlite3 có khả năng thực hiện nhiệm vụ này. Sau khi cài đặt, tôi chạy lệnh sau để xuất cơ sở dữ liệu blog thành file DB của SQLite:
mysql2sqlite -f blog.db -d blog -u root
# -f: Tên file SQLite xuất ra (bắt buộc)
# -d: Cơ sở dữ liệu MySQL cần xuất, trong trường hợp của tôi là blog (bắt buộc)
# -u: Tên người dùng MySQL (bắt buộc)
# -p: Mật khẩu MySQL (nếu có)
Tiếp theo, tôi chỉnh sửa tệp config.ini.php
, thay đoạn mã sau:
/*
$db = new Typecho_Db('Pdo_Mysql', 'blog_');
$db->addServer(array (
'host' => 'localhost',
'user' => 'root',
'password' => '',
'charset' => 'utf8',
'port' => '3306',
'database' => 'blog',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
Bằng đoạn mã sau:
/*
$db = new Typecho_Db('Pdo_SQLite', 'blog_');
$db->addServer(array (
'file' => 'Đường dẫn tuyệt đối tới file cơ sở dữ liệu SQLite',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
Sau khi hoàn tất chỉnh sửa, tôi thử truy cập blog nhưng vẫn gặp lỗi quyền hạn:
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Lỗi này liên quan đến quyền file, và giải pháp khá đơn giản. Theo hướng dẫn tại Các vấn đề còn lại sau khi chuyển blog Typecho, tôi chạy lệnh sau:
chown -R :www-data
Sau khi thực hiện, tôi có thể truy cập blog một cách bình thường.
Hiện tại, nổ hũ 90 bài cào blog mà bạn đang đọc chính là phiên bản sử dụng Typecho + SQLite.
Sửa đổi lần cuối vào 2025-02-10