Tất cả bài viết
56 bài viết về Backend, Cloud, DevOps và Homelab
Gửi thông báo Telegram từ NestJS: alert lỗi, deploy và monitor
Tích hợp Telegram Bot API vào NestJS: TelegramModule, exception filter bắt 5xx, BullMQ job fail, app start và deploy xong — không cần thư viện ngoài.
Race condition trong MySQL: isolation level nào giải quyết được?
MySQL có 4 isolation level nhưng mặc định REPEATABLE READ không chặn được mọi race condition. Dirty read, lost update, phantom read — từng loại xảy ra khi nào, isolation level nào ngăn được, và khi nào cần SELECT FOR UPDATE.
Tại sao không nên dùng database để validate input trong backend
Nhiều backend dựa vào NOT NULL, VARCHAR(n), UNIQUE constraint của database để bắt lỗi input. Quan điểm này sai về kiến trúc — database không phải lớp validate. Validate đúng chỗ: DTO hoặc service layer, trước khi data chạm vào DB.
MySQL Deadlock: cách đọc log InnoDB và giảm xác suất xảy ra
Deadlock trong MySQL tự resolve nhưng rollback transaction ngẫu nhiên gây lỗi ở app layer. Cách đọc SHOW ENGINE INNODB STATUS để biết chính xác dòng nào bị lock, nguyên nhân phổ biến, và 5 cách giảm xác suất deadlock.
N+1 Query trong ORM: cách phát hiện bằng SQL log và fix bằng eager loading
N+1 query không gây lỗi nhưng làm API chậm dần khi data tăng — ORM gửi 1 query lấy danh sách rồi lặp N query con. Cách bật SQL log để bắt, đếm query per request, và fix bằng include, batch, hoặc DataLoader.
SQL có xử lý dữ liệu lớn được không? Vai trò của index và query
Vì sao SQL vẫn xử lý tốt dữ liệu lớn nếu schema, index và query đúng cách, từ lọc trước khi join đến tối ưu MySQL cho bài toán hàng triệu khách hàng.
MySQL query chậm vì ORDER BY và LIMIT: nguyên nhân và cách tối ưu
ORDER BY kết hợp LIMIT có thể gây filesort trên triệu bản ghi dù bảng đã có index. Giải thích cách MySQL chọn execution plan, cách đọc EXPLAIN, và 4 pattern tối ưu thực tế.
Cách nâng NestJS 7 lên 11 bằng AI mà không đổi logic code
Cách nâng NestJS cũ lên mới bằng AI mà ít lỗi: nâng từng major version, khoanh breaking change, review git diff và giữ nguyên logic code.
Cách phân biệt DTO, Model và Entity trong backend
Cách phân biệt DTO, Model và Entity trong backend để tránh dùng lẫn giữa controller, service và database, đặc biệt khi dùng TypeORM và validate đầu vào.
Cách tách bạch Backend, Frontend và Tester để tránh đổ lỗi
Cách tách bạch Backend, Frontend và Tester để tránh đổ lỗi, lệch logic và tranh cãi khi thiết kế API, validate dữ liệu và test hệ thống.
Cloudflare Workers vs Pages: khi nào dùng cái nào?
Workers là serverless function thuần, Pages là hosting tĩnh có kèm Functions — bảng so sánh rõ, use case cụ thể, và cách chọn đúng cho từng loại dự án.
Cách dùng Cloudflare Queues và KV cho side project
Dùng Cloudflare Queues xử lý job bất đồng bộ và Workers KV lưu cache/config, hợp dự án cá nhân chạy trên Workers hoặc Pages.
4 tính năng Cloudflare nên dùng: DNS, CDN, SSL và DDoS Protection
Phân tích 4 tính năng cốt lõi của Cloudflare — DNS nhanh hơn, CDN miễn phí, SSL tự động và chặn DDoS — và lý do thực tế nên bật từng tính năng cho website.
Cloudflare D1 Database: khi nào nên dùng?
Cloudflare D1 là managed SQLite serverless cho Workers và Pages, hợp side project nhỏ nhưng có giới hạn nếu cần chuyển sang MySQL/PostgreSQL.
So sánh Cloudflare R2 và AWS S3: chi phí, egress fee và free tier
So sánh Cloudflare R2 và AWS S3 về giá, egress fee, free tier, khi nào R2 rẻ hơn S3 và cách migrate bằng endpoint.
Synology trên Proxmox: ưu nhược điểm, SHR và RAID
Ưu nhược điểm của Synology DSM trên Proxmox qua Xpenology, kèm so sánh RAID 0/1/5/6, SHR và SHR-2.
Cách dùng Proxmox để tạo nhiều VM riêng cho từng dự án
Hướng dẫn cài Proxmox VE, tạo VM, dùng template để clone nhanh và quản lý storage — phù hợp cho homelab muốn vọc dự án riêng biệt mà không sợ ảnh hưởng nhau.
Chiến lược caching giảm tải database và API
Các chiến lược caching thực tế để giảm tải database và API: cache-aside, write-through, write-behind, TTL và cache invalidation.
5 extension VSCode nên cài cho backend dev
Remote SSH, Docker, Prettier, ESLint và Code Spell Check: 5 extension VSCode giải quyết các việc dev thực tế hằng ngày.
Cách cân bằng tải với HAProxy trên Docker Compose
Hướng dẫn triển khai HAProxy làm load balancer với Docker Compose, bao gồm cấu hình round-robin, health check và Stats UI để giám sát backend.
Áp dụng SOLID để giảm coupling trong dự án lớn
Cách áp dụng SOLID vào code thực tế để giảm coupling, giảm code rối, dễ test, dễ mở rộng và đỡ đau đầu hơn khi dự án bắt đầu lớn lên.
Stateless và stateful khi scale nhiều instance
Giải thích stateless và stateful cho backend, kèm lỗi hay gặp khi scale như schedule chạy trùng, lưu file local và giữ state trong memory.
Quản lý EC2 production: Docker logs, CPU và RAM
Checklist vận hành EC2 production: giới hạn Docker logs, tránh đầy disk và theo dõi CPU, RAM, disk, network, status checks.
Chuyển nameserver sang Cloudflare và trỏ DNS
Cách chuyển nameserver domain sang Cloudflare, trỏ A record hoặc CNAME về VPS, phân biệt DNS only với Proxied và khi nào nên bật proxy.
Cách cài Linux Mint, thiết lập sau khi cài và sử dụng hằng ngày
Hướng dẫn cài Linux Mint từ USB boot, chọn đúng edition, các thiết lập nên làm sau khi cài và cách dùng Linux Mint hằng ngày. Có kèm link tải chính thức.
PC cũ làm gì? Linux, mini server, homelab và NAS
Cách tận dụng PC cũ chạy Linux làm mini server, NAS, homelab hoặc app cá nhân, kèm hướng bắt đầu thực tế với Ubuntu.
Cách dùng Tailscale Funnel để đưa máy ra Internet
Cách dùng Tailscale để truy cập máy từ xa và dùng Tailscale Funnel để đưa web service ra Internet, kèm phân biệt với Serve và các ưu nhược điểm thực tế.
Biến PC cũ thành NAS với Ubuntu, Samba và WebDAV
Cách tận dụng PC cũ làm NAS lưu trữ với Ubuntu, chia sẻ file trong mạng nội bộ bằng Samba và truy cập hoặc chia sẻ file qua Internet bằng WebDAV trên HTTPS.
Cách đưa app ra Internet bằng AWS EC2 và Elastic IP
Hướng dẫn thực tế để tạo EC2 trên AWS, hiểu Security Group, gắn Elastic IP và đưa app ra Internet theo cách dễ làm nhưng an toàn hơn.
Dùng EC2 t3.micro, Headscale và Tailscale cho homelab
Dùng EC2 t3.micro làm host Headscale, nối nhiều PC bằng Tailscale và thêm Nginx để reverse proxy hoặc public app khi cần.
Xây dựng blog tĩnh miễn phí với Cloudflare Pages
Cách dùng Cloudflare Pages host blog tĩnh miễn phí, web tĩnh là gì, vì sao static assets dễ scale và các giới hạn cần biết.
Vai trò của index và những kiểu query làm MySQL chậm
Vì sao index quan trọng trong MySQL, và những kiểu query hay làm chậm như chưa đánh index, SELECT quá nhiều data, hoặc lấy dư dữ liệu rồi mới xử lý ở code.
NestJS xử lý lỗi logic bằng error code nội bộ và LogicalException
Cách chuẩn hoá lỗi logic trong NestJS bằng message code, LogicalException, HttpException và error code để debug nhanh hơn.
Cách thiết kế database nhất quán, ít lệch dữ liệu
Nguyên tắc thiết kế database để giữ dữ liệu nhất quán: naming, primary key, foreign key, unique, not null và chuẩn hoá vừa đủ.
Cách cài Docker trên Ubuntu bằng docker.io
Cách cài Docker nhanh trên Ubuntu bằng sudo apt install docker.io, thêm user bằng usermod -aG docker và test bằng docker run hello-world.
So sánh Codex, Claude Code, Cursor và Copilot
So sánh Codex, Claude Code, Cursor và GitHub Copilot: giá, VS Code extension, autocomplete, agent coding và nên chọn gì.
PM2 chạy NestJS production: restart, log và reboot
Cách dùng PM2 để chạy NestJS trên VPS hoặc server Linux, gồm build app, start bằng ecosystem file, xem log, restart khi crash và tự khởi động lại sau reboot.
Cài Ollama local với Docker Compose và Open WebUI
Hướng dẫn cài Ollama local bằng Docker Compose, dùng Open WebUI để chat, gọi local API miễn phí và chọn model phù hợp với cấu hình máy cá nhân.
GPT-5.5 là gì, có gì mới và đã có trong ChatGPT, API chưa?
GPT-5.5 là model mới của OpenAI công bố ngày 23/04/2026. Bài viết tóm tắt điểm mới chính, rollout trong ChatGPT và thời điểm GPT-5.5 có trong API.
Claude Fable 5 là gì và vì sao access bị tạm dừng?
Claude Fable 5 được Anthropic công bố ngày 09/06/2026, nhưng access Fable 5 và Mythos 5 bị tạm dừng ngày 12/06/2026 theo thông báo chính thức.
BullMQ Job stalled với ElastiCache dù Redis vẫn chạy
Phân tích nguyên nhân và cách khắc phục lỗi BullMQ timeout, Job stalled khi dùng AWS ElastiCache (Redis).
Cách cài Ubuntu 24.04 LTS cho người dùng Việt
Hướng dẫn cài Ubuntu 24.04 LTS từng bước cho máy dev hoặc desktop cá nhân, kèm lưu ý gõ tiếng Việt ổn định.
Cách dùng Synology NAS: SMB, Drive, Photos
Cách dùng Synology NAS cho SMB/Samba, Synology Drive, Photos, mobile app và chia sẻ file nội bộ hoặc qua Internet có kiểm soát.
Cách dùng Cloudflare Tunnel khi không mở được port
Cách dùng Cloudflare Tunnel để đưa một PC cũ hoặc mini server ra Internet khi không mở được port router, bị CGNAT hoặc đang ở mạng chung cư.
Docker Compose cho local dev nhiều project
Cách dùng Docker Compose để chạy nhiều project song song không trùng port, tách riêng MySQL và Redis cho từng app, và giữ môi trường dev sạch, dễ reset.
Redis queue trong NestJS với BullMQ: cách triển khai
Cách dùng Redis làm queue trong NestJS với BullMQ, từ luồng producer-consumer, retry, delay job đến các lưu ý production khi xử lý email, webhook và tác vụ nền.
Nginx Proxy Manager với Docker Compose và SSL
Chạy Nginx Proxy Manager bằng Docker Compose, trỏ nhiều domain về một server, reverse proxy app nội bộ và xin SSL Let's Encrypt.
Ubuntu nên dùng ibus-bamboo hay fcitx5-unikey?
So sánh ibus-bamboo và fcitx5-unikey trên Ubuntu, gồm GNOME, Electron apps, lỗi predict bar và cách chọn bộ gõ ổn định.
Xpenology trên Proxmox VE 8.2.4 với passthrough HDD
Hướng dẫn cài đặt Xpenology DSM 7.2.1 trên Proxmox VE 8.2.4 và cấu hình passthrough HDD để đọc SMART thông qua passthrough.
Resize EC2 EBS volume và mở rộng XFS không mất dữ liệu
Các bước mở rộng EBS volume và filesystem XFS trên EC2 Ubuntu một cách an toàn.
NestJS mất kết nối Redis: cấu hình ioredis reconnect
Cách cấu hình ioredis trong NestJS để reconnect an toàn khi Redis disconnect, gặp TCP idle timeout hoặc ElastiCache failover trả về READONLY.
Tối ưu MySQL query với 300k+ records
Case study tối ưu query MySQL từ 12s xuống 200ms với explain, index và query rewrite.
Container exit 137: debug OOMKilled và memory limit
Debug container restart vô hạn với exit code 137 trên Docker và Kubernetes, set --max-old-space-size đúng tỷ lệ, và detect memory leak bằng heap snapshot.
Proxmox cluster mất quorum và cách khôi phục
pvecm status báo 'not in quorum', VMs bị freeze — cách dùng pvecm expected, pvecm delnode và setup QDevice để phòng tránh lần sau.
Thêm ổ cứng vào SHR Synology không mất dữ liệu
Cách add drive vào SHR storage pool trên DSM, xem tiến trình reshape qua /proc/mdstat, và những lưu ý tránh mất dữ liệu khi mở rộng.
Nginx 413 dù đã set client_max_body_size: cách fix
Tại sao Nginx trả 413 dù đã set client_max_body_size, và cách fix khi có nhiều layer proxy hoặc reverse proxy.