Backend API server cho hệ thống e-commerce ShopSifu, được xây dựng với NestJS, PostgreSQL, Redis, và Elasticsearch.
- OS: Ubuntu 20.04+ / Debian 11+ / CentOS 8+
- Docker: 20.10+
- Docker Compose: 2.0+
- Node.js: 18.x hoặc 20.x
- npm: 9.x+
- PM2: (tùy chọn, để quản lý process)
# Cài đặt Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Cài đặt Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Logout và login lại để áp dụng group docker
exit
# (login lại)
# Kiểm tra cài đặt
docker --version
docker-compose --version# Clone repository (hoặc upload code lên server)
cd /path/to/your/workspace
git clone <repository-url> server-shopsifu
cd server-shopsifu
# Cài đặt Node.js dependencies
npm install# Copy file .env mẫu (nếu có) hoặc tạo mới
cp .env.example .env # hoặc tạo file .env mới
# Chỉnh sửa file .env với các thông tin của bạn
nano .envQuan trọng: Đảm bảo các biến sau trong .env đúng với Docker setup:
# Database - kết nối tới PostgreSQL container
DATABASE_URL=postgresql://shopsifu:Shopsifu2025@localhost:5432/shopsifu?schema=public&connection_limit=5
# Redis - kết nối tới Redis container
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=Shopsifu2025
REDIS_URL=redis://:Shopsifu2025@localhost:6379
# Elasticsearch - kết nối tới Elasticsearch container
ELASTICSEARCH_NODE=http://localhost:9200# Khởi động core services
docker-compose -f docker-compose.core.yml up -d
# Kiểm tra status
docker-compose -f docker-compose.core.yml ps
# Xem logs (nếu cần)
docker-compose -f docker-compose.core.yml logs -fĐợi khoảng 30-60 giây để các services khởi động hoàn toàn, đặc biệt là PostgreSQL và Elasticsearch.
# Generate Prisma Client
npm run generate
# Chạy database migrations
npm run migrate
# Seed dữ liệu ban đầu
npm run seed# Khởi động monitoring services (Prometheus, Grafana, Kibana, etc.)
docker-compose -f docker-compose.monitoring.yml up -d
# Hoặc khởi động tất cả (core + monitoring)
docker-compose up -d# Build ứng dụng
npm run build
# Khởi động với PM2 (recommended cho production)
pm2 start ecosystem.config.js
# Hoặc khởi động trực tiếp
npm start
# Hoặc development mode
npm run devXem hướng dẫn chi tiết trong docs/nginx-setup.md hoặc:
# Copy Nginx config
sudo cp nginx-config/api.shopsifu.live.conf /etc/nginx/sites-available/
sudo ln -s /etc/nginx/sites-available/api.shopsifu.live.conf /etc/nginx/sites-enabled/
# Test và reload Nginx
sudo nginx -t
sudo systemctl reload nginx# Cài đặt Certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx
# Lấy SSL certificate
sudo certbot --nginx -d api.shopsifu.live
sudo certbot --nginx -d grafana.shopsifu.live
sudo certbot --nginx -d prometheus.shopsifu.live
sudo certbot --nginx -d kibana.shopsifu.live
sudo certbot --nginx -d elasticsearch.shopsifu.live
# Auto-renewal (đã tự động cấu hình)
sudo certbot renew --dry-runChúng tôi cung cấp script để dễ dàng migrate:
# Sử dụng script migration
./scripts/migrate.sh
# Hoặc chạy các bước thủ công dưới đây# Backup PostgreSQL
docker exec shopsifu_postgres pg_dump -U shopsifu shopsifu > backup_postgres_$(date +%Y%m%d_%H%M%S).sql
# Backup Redis (nếu cần)
docker exec shopsifu_redis redis-cli --rdb /data/dump.rdb -a Shopsifu2025
docker cp shopsifu_redis:/data/dump.rdb ./backup_redis_$(date +%Y%m%d_%H%M%S).rdb
# Backup Elasticsearch (nếu cần)
# Xem: https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-register-repository.html
# Backup volumes (nếu muốn backup toàn bộ)
docker run --rm -v shopsifu_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_data_$(date +%Y%m%d_%H%M%S).tar.gz /data
docker run --rm -v shopsifu_redis_data:/data -v $(pwd):/backup alpine tar czf /backup/redis_data_$(date +%Y%m%d_%H%M%S).tar.gz /data
docker run --rm -v shopsifu_elasticsearch_data:/data -v $(pwd):/backup alpine tar czf /backup/elasticsearch_data_$(date +%Y%m%d_%H%M%S).tar.gz /dataLàm theo Bước 1-6 ở trên.
# Restore PostgreSQL
cat backup_postgres_YYYYMMDD_HHMMSS.sql | docker exec -i shopsifu_postgres psql -U shopsifu -d shopsifu
# Restore Redis (nếu có backup)
docker cp backup_redis_YYYYMMDD_HHMMSS.rdb shopsifu_redis:/data/dump.rdb
docker restart shopsifu_redis
# Restore volumes (nếu backup volumes)
docker run --rm -v shopsifu_postgres_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres_data_YYYYMMDD_HHMMSS.tar.gz"
docker run --rm -v shopsifu_redis_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/redis_data_YYYYMMDD_HHMMSS.tar.gz"
docker run --rm -v shopsifu_elasticsearch_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/elasticsearch_data_YYYYMMDD_HHMMSS.tar.gz"- Cập nhật DNS records trên Cloudflare hoặc DNS provider
- Cấu hình Nginx như Bước 8
- Lấy SSL certificates như Bước 9
# Khởi động
docker-compose -f docker-compose.core.yml up -d
# Dừng
docker-compose -f docker-compose.core.yml down
# Restart
docker-compose -f docker-compose.core.yml restart
# Xem logs
docker-compose -f docker-compose.core.yml logs -f [service_name]
# Xem status
docker-compose -f docker-compose.core.yml ps
# Truy cập vào container
docker exec -it shopsifu_postgres psql -U shopsifu -d shopsifu
docker exec -it shopsifu_redis redis-cli -a Shopsifu2025
docker exec -it shopsifu_elasticsearch curl http://localhost:9200# Khởi động
docker-compose -f docker-compose.monitoring.yml up -d
# Dừng
docker-compose -f docker-compose.monitoring.yml down
# Restart
docker-compose -f docker-compose.monitoring.yml restart# Khởi động tất cả
docker-compose up -d
# Dừng tất cả
docker-compose down
# Restart tất cả
docker-compose restart
# Xem logs tất cả
docker-compose logs -f
# Xem status tất cả
docker-compose ps# Backup volume
docker run --rm -v shopsifu_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz /data
# Restore volume (CẨN THẬN: sẽ ghi đè dữ liệu hiện tại!)
docker run --rm -v shopsifu_postgres_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres_backup.tar.gz --strip 1"# Kiểm tra container đang chạy
docker ps | grep postgres
# Kiểm tra logs
docker logs shopsifu_postgres
# Kiểm tra kết nối từ host
docker exec -it shopsifu_postgres psql -U shopsifu -d shopsifu -c "SELECT version();"# Kiểm tra container
docker ps | grep redis
# Test kết nối
docker exec -it shopsifu_redis redis-cli -a Shopsifu2025 PING# Kiểm tra logs
docker logs shopsifu_elasticsearch
# Kiểm tra memory (Elasticsearch cần đủ RAM)
free -h
# Kiểm tra health
curl http://localhost:9200/_cluster/health# Đóng idle connections
docker exec -it shopsifu_postgres psql -U shopsifu -d shopsifu -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'shopsifu' AND state = 'idle' AND pid != pg_backend_pid();"
# Hoặc restart PostgreSQL container
docker restart shopsifu_postgres# Kiểm tra port nào đang được sử dụng
sudo netstat -tulpn | grep :5432
sudo netstat -tulpn | grep :6379
sudo netstat -tulpn | grep :9200
# Dừng service đang chiếm port hoặc đổi port trong docker-compose.yml- Application:
http://localhost:3000/health - PostgreSQL:
docker exec shopsifu_postgres pg_isready -U shopsifu - Redis:
docker exec shopsifu_redis redis-cli -a Shopsifu2025 PING - Elasticsearch:
curl http://localhost:9200/_cluster/health
- Grafana:
http://localhost:3001(admin/Shopsifu2025) - Prometheus:
http://localhost:9090 - Kibana:
http://localhost:5601 - Elasticsearch:
http://localhost:9200
Xem file .env.example (nếu có) hoặc file .env để biết các biến môi trường cần thiết.
Lưu ý quan trọng:
- Không commit file
.envvào git - Thay đổi các password mặc định trong production
- Sử dụng secrets management (AWS Secrets Manager, HashiCorp Vault, etc.) cho production
# 1. Setup Docker
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
# 2. Clone & Install
git clone <repo> && cd server-shopsifu && npm install
# 3. Configure
cp .env.example .env && nano .env
# 4. Start Core Services
docker-compose -f docker-compose.core.yml up -d
# 5. Setup Database
npm run generate && npm run migrate && npm run seed
# 6. Start App
npm run build && npm startdocker-compose.yml: File chính, include cả core và monitoringdocker-compose.core.yml: Core services (PostgreSQL, Redis, Elasticsearch)docker-compose.monitoring.yml: Monitoring services (Prometheus, Grafana, Kibana, Exporters)
- Đổi mật khẩu mặc định trong
.envvàdocker-compose.yml - Không expose services ra ngoài internet trừ khi cần (dùng Nginx reverse proxy)
- Sử dụng SSL/TLS cho tất cả connections
- Regular backups cho database
- Update Docker images thường xuyên để có security patches
Nếu gặp vấn đề, vui lòng:
- Kiểm tra logs:
docker-compose logs -f [service_name] - Kiểm tra health checks
- Xem phần Troubleshooting ở trên
- Tạo issue trên GitHub repository
This project is licensed under the MIT License - see the LICENSE file for details.
TedyDev
Happy Coding! 🎉