Triển khai
builderx_api được triển khai bằng Ansible với Elixir release đóng gói trong image Docker. Playbook nằm ở ansible/.
Các môi trường
| Môi trường | Đối tượng | Inventory |
|---|---|---|
| Local | Dev cá nhân | docker-compose.yml |
| Staging | QA team | ansible/inventory.yaml (group store_staging_*) |
| Production | Khách hàng | ansible/inventory.yaml (group store_prod_*) |
Artifact build
Dockerfilemulti-stage:- Build
mix releasevớiMIX_ENV=prod. - Copy release sang image runtime gọn nhẹ.
- Build
- FE nội bộ ở
assets/được build trong stage:assets(npm ci && npm run deploy) trước khi Elixir compile.
Kiểm tra build local:
make build
Lệnh deploy (Makefile)
| Lệnh | Mô tả |
|---|---|
make deploy | Deploy backend + publish consumer. |
make deploy-backend | Chỉ deploy backend. |
make deploy-worker | Deploy nhóm worker (cron, consumer). |
make deploy-publish-consumer | Deploy publish consumer (kênh publish landing). |
make deploy-staging | Deploy stack staging. |
Mỗi lệnh map tới:
ansible-playbook -i ansible/inventory.yaml ansible/<playbook>.yaml
Hotfix
Khi cần ship fix khẩn:
# Kiểm tra những gì sẽ thay đổi
make hotfix-status
# Apply HEAD của branch hiện tại
make hotfix-head
# Cho staging
make hotfix-staging-status
make hotfix-staging-head
Playbook hotfix giả định fix đã được merge vào
master(prod) hoặcdevelop(staging).
Migration khi deploy
-
Sau khi release lên server, chạy migration:
make migrate# tương đương: docker compose exec builderx_api mix ecto.migrate -r BuilderxApi.Citus -
Repo Postgres thường cũng cần migrate:
docker compose exec builderx_api mix ecto.migrate -r BuilderxApi.Repo -
Migration schema chạy trên bảng lớn của prod nên thực hiện ngoài giờ cao điểm và thông báo ops trước.
Restart / Reload
- Elixir release hỗ trợ hot reload qua RPC, nhưng team thường
docker compose restart builderx_apicho an toàn. - Service worker / consumer nên restart từng node để không gián đoạn indexing.
Smoke test sau deploy
GET /healthztrả 200.- Đăng nhập trên staging
builderx_spa. - Tạo đơn test, kiểm tra event chạy qua
Rabbit.IndexingConsumer. - Sentry không nổi spike error trong 10 phút.
Rollback
- CI giữ image trước với tag
:previous. - Các bước:
- SSH vào server.
- Đổi tag image về
:previous. docker compose up -d builderx_api.- Chạy lại smoke test.
- Hoàn tác migration có rủi ro — thường ship migration sửa lỗi thay vì
ecto.rollbacktrên prod.
CI/CD pipeline
- Push branch → CI chạy
mix test+ lint. - Merge
develop→ CI build image staging và chạymake deploy-staging(nếu enable). - Merge
master→ CI build image prod và đánh tag. - Operator chạy
make deploy(manual gate). - Theo dõi Sentry và Grafana trong một giờ.
Monitoring khi vận hành
- Sentry — project
builderx-api. - Grafana / Prometheus — metric host + Postgres + Rabbit.
- Phoenix LiveDashboard —
/dashboard, chỉ super-admin. - Log — gom qua ELK / Loki tuỳ env.
Best practice
- Không sửa DB prod trực tiếp. Mọi thay đổi data phải đi qua module context (mix task hoặc IEx RPC).
- Hot-fix data: viết script
mix run priv/scripts/<name>.exs, qua code review, chạy có lock. - Trước khi
make deploy: đảm bảomasterlà commit muốn deploy và đãgit pull. - Không chạy hai lệnh deploy song song trên cùng cluster.