## ⚠️ Server này KHÔNG phải máy trống — đang dùng chung cho nhiều dịch vụ khác
Kiểm tra thực tế (`netstat -tulpn`, `docker ps` ngày 2026-08-28) cho thấy server đang chạy sẵn:
- Docker 20.10.7 + Compose v2.21.0 (đã cài, không cần cài lại) với **~8 docker network/project khác** đang hoạt động.
- Nginx (đã cài, đang phục vụ ít nhất 1 domain khác qua port 80/443/8443) + Apache2 (port 8888/444) song song.
- PM2 chạy ít nhất 1 app Node khác (port 8076/8084/8442).
...
...
@@ -17,6 +18,7 @@ Kiểm tra thực tế (`netstat -tulpn`, `docker ps` ngày 2026-08-28) cho th
- Redis độc lập chạy sẵn ở `127.0.0.1:6379` (**không phải Redis của app này** — Redis của app này chạy trong container riêng, không public port, không đụng nhau).
**Hệ quả cho việc deploy:**
- Không cài lại Docker/Nginx/Certbot — chỉ dùng lại.
- Không dùng port `3003` mặc định — đã bị chiếm. Đổi sang `7003` (đã sửa trong `docker-compose.yml`, đã build-test local).
-**Không đụng vào firewall/ufw** — nếu bật ufw với rule tối thiểu sẽ cắt đứt các dịch vụ/port khác đang mở cho các app/client khác trên cùng server. Bỏ hẳn bước này.
...
...
@@ -27,6 +29,7 @@ Kiểm tra thực tế (`netstat -tulpn`, `docker ps` ngày 2026-08-28) cho th
## Bước 0 — Chuẩn bị trước khi làm gì trên server
1.**Trỏ DNS**: bản ghi A `pg.haiyenstore.asia` → `123.31.12.55`.
```bash
dig +short pg.haiyenstore.asia
```
...
...
@@ -44,6 +47,7 @@ ssh -p 2222 root@123.31.12.55
```
Có 1 dòng cảnh báo `sudo: unable to resolve host poss` khi chạy `sudo` — vô hại (thiếu entry trong `/etc/hosts`), có thể bỏ qua hoặc sửa nhanh:
```bash
echo "127.0.0.1 poss" | sudo tee -a /etc/hosts
```
...
...
@@ -75,11 +79,13 @@ cd payment-gate-hai-yen
## Bước 4 — Tạo `.env` trên server (KHÔNG commit file này)
Từ máy local (chú ý port SSH `-P 2222` viết hoa cho `scp`):
@@ -167,11 +175,13 @@ Kiểm tra response: `domain` phải là `https://pg.megapay.vn` (production, kh
## Bước 9 — Đảm bảo container tự khởi động lại
`restart: unless-stopped` đã có sẵn trong `docker-compose.yml` — container tự chạy lại khi Docker daemon khởi động (kể cả sau reboot), miễn Docker daemon tự chạy khi boot (thường mặc định đã bật sẵn, vì server này đã dùng Docker từ trước). Xác nhận:
```bash
systemctl is-enabled docker
```
**Không nên tự `reboot` server này để test** — đang có nhiều dịch vụ khác chạy chung, reboot ảnh hưởng tất cả. Nếu cần test container tự hồi phục, chỉ nên:
```bash
docker compose restart app
```
...
...
@@ -190,16 +200,16 @@ docker compose up -d --build
## Troubleshooting thường gặp
| Triệu chứng | Nguyên nhân thường gặp | Cách kiểm tra |
|---|---|---|
| `docker compose up` báo port đã dùng | Port `7003` bị ai đó chiếm sau này | `sudo lsof -i :7003`, đổi port khác trong `docker-compose.yml` + nginx config |
| `sudo nginx -t` báo lỗi | Có thể do đụng site config khác, không phải do file mới | Đọc kỹ dòng lỗi, dòng có ghi rõ file/dòng gây lỗi |
| Certbot fail "Could not find domain" | DNS chưa trỏ đúng/chưa lan truyền | `dig +short pg.haiyenstore.asia` |
| `502 Bad Gateway` từ Nginx | App container chưa chạy/crash, hoặc sai port trong nginx config | `docker compose ps`, `docker compose logs app` |
| callBackUrl vẫn ra domain cũ | `.env` sai `EPAY_REQ_DOMAIN`/`EPAY_RETURN_URL`/`EPAY_NOTIFY_URL` | `docker compose exec app env \| grep EPAY` |
| Response vẫn ra `domain: sandbox.megapay.vn`| `.env` chưa có/sai `EPAY_DOMAIN` | `docker compose exec app env \| grep EPAY_DOMAIN` |
| Dịch vụ KHÁC trên server đột nhiên lỗi sau khi deploy | Trùng port/tài nguyên với app này | So port đang dùng trước/sau bằng `sudo lsof -i` — không nên xảy ra nếu làm đúng bước 2 |
| Triệu chứng | Nguyên nhân thường gặp | Cách kiểm tra |
| `docker compose up` báo port đã dùng | Port `7003` bị ai đó chiếm sau này | `sudo lsof -i :7003`, đổi port khác trong `docker-compose.yml` + nginx config |
| Dịch vụ KHÁC trên server đột nhiên lỗi sau khi deploy | Trùng port/tài nguyên với app này | So port đang dùng trước/sau bằng `sudo lsof -i` — không nên xảy ra nếu làm đúng bước 2 |