## ⚠️ Server này KHÔNG phải máy trống — đang dùng chung cho nhiều dịch vụ khác
## ⚠️ 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:
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.
- 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.
- 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).
- 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
...
@@ -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).
- 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:**
**Hệ quả cho việc deploy:**
- Không cài lại Docker/Nginx/Certbot — chỉ dùng lại.
- 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 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.
-**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
...
@@ -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
## 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`.
1.**Trỏ DNS**: bản ghi A `pg.haiyenstore.asia` → `123.31.12.55`.
```bash
```bash
dig +short pg.haiyenstore.asia
dig +short pg.haiyenstore.asia
```
```
...
@@ -44,6 +47,7 @@ ssh -p 2222 root@123.31.12.55
...
@@ -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:
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
```bash
echo "127.0.0.1 poss" | sudo tee -a /etc/hosts
echo "127.0.0.1 poss" | sudo tee -a /etc/hosts
```
```
...
@@ -75,11 +79,13 @@ cd payment-gate-hai-yen
...
@@ -75,11 +79,13 @@ cd payment-gate-hai-yen
## Bước 4 — Tạo `.env` trên server (KHÔNG commit file này)
## 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`):
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
...
@@ -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
## 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:
`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
```bash
systemctl is-enabled docker
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:
**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
```bash
docker compose restart app
docker compose restart app
```
```
...
@@ -191,7 +201,7 @@ docker compose up -d --build
...
@@ -191,7 +201,7 @@ docker compose up -d --build
## Troubleshooting thường gặp
## Troubleshooting thường gặp
| Triệu chứng | Nguyên nhân thường gặp | Cách kiểm tra |
| 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 |
| `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 |