Thủ thuật
Xây dựng 'nhà máy phần mềm' tự vận hành: Tự động hóa từ viết code đến triển khai
(giờ Việt Nam)
Tóm tắt AI
Tác giả chia sẻ cách thiết lập hệ thống AI tự chủ thực hiện toàn bộ quy trình phát triển phần mềm, từ viết code, kiểm thử đến triển khai trên server nội bộ với bảo mật cao.
Bản dịch AI

tl;dr: Nó đã hoạt động! Chỉ với một câu lệnh (prompt), nó đã tạo ra một kho lưu trữ (repo), viết ứng dụng và các bài kiểm thử, vượt qua CI, cấp phát Postgres và triển khai ứng dụng hoàn chỉnh dưới giao thức HTTPS mà tôi không cần phải nhắn thêm bất kỳ tin nhắn nào. Nếu bạn chỉ muốn xem kết quả, bạn có thể tìm thấy video demo ở cuối bài.
LLM lại trở nên thú vị rồi! Có lẽ chúng luôn như vậy và chỉ là tôi đã bị mắc kẹt trong "thung lũng thất vọng" (trough of disillusionment). Gần đây, bất cứ khi nào cần một công cụ nhỏ, tôi chỉ việc xây dựng nó.
Hôm nọ, khi đang ở phòng gym, tôi muốn có một ứng dụng theo dõi tập luyện. Ứng dụng tôi nghĩ đến chỉ đơn thuần là CRUD, nhưng tất cả các phiên bản trên app store đều đòi phí 12 bảng/tháng, nên tôi đã dùng Claude để tạo nhanh một cái. Rất thú vị, nhưng việc cấp quyền root trên máy tính cho một LLM ở chế độ tự động vẫn khiến tôi cảm thấy không an tâm.
Vì vậy, thử thách đặt ra là: làm thế nào để tạo ra một môi trường phát triển tác tử (agentic) hoàn toàn từ xa, nơi chúng ta kiểm soát LLM một cách có cấu trúc thay vì chỉ tin tưởng nó? Tôi muốn đưa ra chỉ dẫn và để nó tự động thực hiện toàn bộ quy trình SDLC:
Tất cả đều chạy trên máy chủ tại nhà của tôi mà không tốn thêm chi phí hạ tầng đám mây nào. Chi phí duy trì duy nhất cho thử nghiệm này là 20 bảng cho gói đăng ký Codex.
Các máy chủ
Đây là những "cỗ máy" của tôi.
Máy ở phía dưới là một chiếc i3 lõi kép đời 2014 mà tôi đã dùng làm homelab trong 5 năm qua. Nó đang đảm nhận việc lưu trữ blog này và khoảng 45 Docker container khác, từ Pi-hole cho đến toàn bộ stack Prometheus / Loki / Grafana. Nó cũng được chuyển tiếp cổng 443 từ router của tôi. Tôi sẽ rất bực nếu một LLM làm hỏng nó, nên đó không phải là thứ chúng ta dùng hôm nay.
Máy ở trên là một chiếc i7 thế hệ thứ 10 với 32GB RAM, tôi mua mới từ eBay và chưa cài đặt gì cả. Quá hoàn hảo.
Stack công nghệ
Stack phát triển cốt lõi được tự lưu trữ (self-hosted) thông qua Coolify. Việc suy luận (inference) và các tích hợp như Tailscale, Telegram, DNS và ACME vẫn nằm ngoài máy chủ này. Bạn cũng có thể tự lưu trữ phần suy luận, nhưng tôi không có phần cứng và tôi thà để OpenAI "trợ giá" cho các thử nghiệm của mình còn hơn.
Nguồn tham khảo
Đây không phải là một hướng dẫn chi tiết từ A-Z. Tôi có thể viết một script Ansible để thiết lập tất cả; hãy để lại issue trên kho lưu trữ GitHub bên dưới nếu bạn muốn. Tuy nhiên, nếu bạn đã đọc đến đây, có lẽ bạn cũng có thể tự tìm ra cách làm.
Mạng lưới
Rào cản bảo mật đầu tiên rất rõ ràng: nó nằm trên một phần cứng riêng biệt. Hermes có thể chạy lệnh rm -rf / và tệ nhất thì tôi chỉ mất vài giờ để cài đặt lại.
Lớp bảo mật tiếp theo là mạng. Máy chủ cũ của tôi có cổng 443 được chuyển tiếp từ router; máy này thì không. Không có cổng vào (ingress) từ bên ngoài, giúp loại bỏ bề mặt tấn công lớn và tất cả các loại "bức xạ nền" của internet từ những kẻ dò quét /wp-admin trên mọi bản ghi DNS A mà tôi thiết lập.
Nhưng nếu không có cổng vào, làm sao tôi có thể:
Tôi đã thiết lập Tailscale với máy chủ cũ đóng vai trò là exit node. Khi tôi không ở nhà, việc chọn nó sẽ định tuyến lưu lượng truy cập qua máy chủ đó và Pi-hole, thứ mà tôi đang dùng cho DNS tùy chỉnh. Pi-hole cho phép bạn thêm các quy tắc dnsmasq như sau:
Bất kỳ yêu cầu nào đến *.internal.jakeshomelab.me giờ đây sẽ phân giải về máy chủ mới của tôi, nơi reverse proxy của Coolify tiếp nhận và phục vụ các dịch vụ mới của tôi.
Chứng chỉ SSL
Với Caddy hoặc Traefik và các nhãn Docker, bạn có thể phục vụ cổng 3000 trên container X từ https://my-service.internal.jakeshomelab.me. Chỉ cần trỏ một bản ghi A vào máy chủ, nó sẽ liên hệ với Let’s Encrypt, hoàn thành thử thách ACME và lấy chứng chỉ SSL. Tôi đã học được điều này ba năm trước và nó vẫn giống như phép thuật vậy.
Vấn đề nằm ở bản ghi A. Tôi không muốn công khai liên kết my-service.internal.jakeshomelab.me với địa chỉ IP của mình, bất kể người khác có truy cập được hay không. Tôi muốn có một chứng chỉ SSL cho một dịch vụ "ma".
Để giải quyết vấn đề này, tôi chuyển sang dùng DNS-01. Thành thật mà nói, đây là điều mới mẻ với tôi, nhưng cách thức hoạt động như sau:
Sau đó, khi tôi đăng ký một URL mới, Traefik / Coolify sẽ:
Thế là xong! Bạn hiện có một URL HTTPS hợp lệ, có thể truy cập được trong tailnet của mình mà không cần bản ghi A hoặc AAAA công khai nào trỏ đến dịch vụ. Tên máy chủ (hostname) có thể vẫn xuất hiện trong các nhật ký minh bạch chứng chỉ (certificate-transparency logs) công khai, nhưng dịch vụ chỉ có thể truy cập được từ tailnet.
Phần tuyệt nhất là Coolify thực hiện việc này một cách tự động. Tác tử (agent) của chúng ta có thể tạo một dịch vụ tại bất kỳ tên miền phụ nào và nó sẽ ✨tự động✨ xử lý mọi thứ.
Vì vậy, kết hợp tất cả những điều này lại, bạn sẽ có kết quả sau:
Thiết lập tương tự cũng bao phủ các công cụ, vì vậy Coolify, Hermes, Forgejo và Firecrawl đều nằm trên các tên miền phụ cục bộ của riêng chúng.
Stack phát triển & các MCP
Bây giờ chúng ta đã có một chiếc máy (gần như) biệt lập, hãy chuyển sang phần công cụ. Các công cụ này đã khá quen thuộc; việc kết hợp chúng lại với nhau mới là phần thú vị.
Forgejo
Chúng ta cần một nơi bền vững để lưu trữ mã nguồn và chạy CI. Tôi quyết định không dùng GitHub vì:
Forgejo là một giải pháp thay thế tự lưu trữ tuyệt vời. Tệp Docker Compose được liên kết ở trên thiết lập Forgejo và các runner của nó; việc tự đăng ký bản thân và runner cần thêm một chút công sức, nhưng tài liệu hướng dẫn rất đầy đủ.
Tôi cũng đã đính kèm một tệp Compose để đồng bộ hóa các dự án ngược lại với GitHub. Điều đó sẽ đưa token GH của bạn vào môi trường, nhưng đó là sự đánh đổi mà bạn phải tự quyết định.
Kỹ năng Hermes cho Forgejo được liên kết ở trên cho phép tác tử toàn quyền kiểm soát instance này.
Hermes
Hermes là một trợ lý cá nhân theo phong cách OpenClaw với các khả năng tác tử. Tôi chưa bao giờ tham gia vào cơn sốt OpenClaw nên không thể so sánh hai cái, nhưng Hermes có một vài tính năng mà tôi thấy rất hữu ích:
Việc thiết lập Hermes và Firecrawl với đúng các khóa ở đúng nơi là một công việc cực kỳ phiền phức. Tôi đã thêm các tệp Docker Compose thân thiện với Coolify vào kho lưu trữ được liên kết ở trên.
Coolify
Bài viết được AI dịch và tổng hợp tự động từ Hacker News Nổi bật (buzzing.cc bản dịch tiếng Trung). Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.