Update project documentation and scripts for improved setup and bilingual support
- Enhanced `README.md` with a quick start guide and detailed project structure. - Updated `SETUP_GUIDE.md` by removing it as it was redundant. - Improved `local-development.md` and `development.md` with clearer instructions for database migrations. - Added bilingual comments in various scripts for better understanding and usability. - Updated `.gitignore` to include specific build scripts while ignoring others. - Enhanced `scripts` for database management, including backup and seeding functionalities with bilingual support.
This commit is contained in:
11
scripts/build/build-all.sh
Executable file
11
scripts/build/build-all.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🔨 Building all services and apps..."
|
||||
|
||||
# EN: Build all packages using pnpm workspace
|
||||
# VI: Build tất cả các package sử dụng pnpm workspace
|
||||
pnpm build
|
||||
|
||||
echo "✅ Build completed!"
|
||||
28
scripts/build/build-service.sh
Executable file
28
scripts/build/build-service.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
SERVICE=$1
|
||||
|
||||
# EN: Validate arguments
|
||||
# VI: Xác thực tham số
|
||||
if [ -z "$SERVICE" ]; then
|
||||
echo "Usage: $0 <service-name>"
|
||||
echo "Example: $0 auth-service"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EN: Check if service exists
|
||||
# VI: Kiểm tra xem service có tồn tại không
|
||||
if [ ! -d "services/$SERVICE" ]; then
|
||||
echo "❌ Service $SERVICE not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔨 Building $SERVICE..."
|
||||
|
||||
# EN: Build specific service using pnpm filter
|
||||
# VI: Build service cụ thể sử dụng pnpm filter
|
||||
pnpm --filter "@goodgo/$SERVICE" build
|
||||
|
||||
echo "✅ Build completed!"
|
||||
@@ -5,30 +5,43 @@ set -e
|
||||
SERVICE=$1
|
||||
BACKUP_DIR="${2:-./backups}"
|
||||
|
||||
# EN: Validate arguments
|
||||
# VI: Xác thực tham số
|
||||
if [ -z "$SERVICE" ]; then
|
||||
echo "Usage: $0 <service-name> [backup-dir]"
|
||||
echo "Example: $0 auth-service"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EN: Create backup directory if not exists
|
||||
# VI: Tạo thư mục backup nếu chưa tồn tại
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# EN: Generate timestamped filename
|
||||
# VI: Tạo tên file với dấu thời gian
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="$BACKUP_DIR/${SERVICE}_${TIMESTAMP}.sql"
|
||||
|
||||
echo "💾 Backing up database for $SERVICE..."
|
||||
|
||||
# Extract database URL from .env or environment
|
||||
# EN: Extract database URL from .env or environment
|
||||
# VI: Trích xuất database URL từ .env hoặc biến môi trường
|
||||
cd "services/$SERVICE"
|
||||
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
# EN: Check local .env file
|
||||
# VI: Kiểm tra file .env cục bộ
|
||||
if [ -f ".env" ]; then
|
||||
DATABASE_URL=$(grep DATABASE_URL .env | cut -d '=' -f2- | tr -d '"' | tr -d "'")
|
||||
# EN: Check shared env file
|
||||
# VI: Kiểm tra file env chia sẻ
|
||||
elif [ -f "../../deployments/local/.env.local" ]; then
|
||||
DATABASE_URL=$(grep DATABASE_URL ../../deployments/local/.env.local | cut -d '=' -f2- | tr -d '"' | tr -d "'")
|
||||
fi
|
||||
fi
|
||||
|
||||
# EN: Validate DATABASE_URL is set
|
||||
# VI: Xác thực DATABASE_URL đã được thiết lập
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "❌ DATABASE_URL not found. Please set it in:"
|
||||
echo " - services/$SERVICE/.env"
|
||||
@@ -37,17 +50,23 @@ if [ -z "$DATABASE_URL" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Use pg_dump directly with DATABASE_URL (works with Neon and standard PostgreSQL)
|
||||
# EN: Use pg_dump directly with DATABASE_URL (works with Neon and standard PostgreSQL)
|
||||
# VI: Sử dụng pg_dump trực tiếp với DATABASE_URL (hoạt động với Neon và PostgreSQL chuẩn)
|
||||
#
|
||||
# Neon URLs format: postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require
|
||||
# Standard format: postgresql://user:pass@host:port/dbname
|
||||
|
||||
# Check if pg_dump supports connection string (PostgreSQL 11+)
|
||||
# EN: Check if pg_dump supports connection string (PostgreSQL 11+)
|
||||
# VI: Kiểm tra xem pg_dump có hỗ trợ connection string không (PostgreSQL 11+)
|
||||
if pg_dump --version | grep -qE "1[1-9]|2[0-9]"; then
|
||||
# Use connection string directly (supports Neon)
|
||||
# EN: Use connection string directly (supports Neon)
|
||||
# VI: Sử dụng connection string trực tiếp (hỗ trợ Neon)
|
||||
pg_dump "$DATABASE_URL" > "../$BACKUP_FILE"
|
||||
else
|
||||
# Fallback: Parse connection string for older pg_dump
|
||||
# Remove query parameters for parsing
|
||||
# EN: Fallback: Parse connection string for older pg_dump
|
||||
# VI: Dự phòng: Phân tích connection string cho bản pg_dump cũ hơn
|
||||
# EN: Remove query parameters for parsing
|
||||
# VI: Loại bỏ các tham số query để phân tích
|
||||
CLEAN_URL=$(echo $DATABASE_URL | sed 's/?.*//')
|
||||
DB_USER=$(echo $CLEAN_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p')
|
||||
DB_PASS=$(echo $CLEAN_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p')
|
||||
|
||||
@@ -4,12 +4,16 @@ set -e
|
||||
|
||||
SERVICE=$1
|
||||
|
||||
# EN: Validate argument
|
||||
# VI: Xác thực tham số
|
||||
if [ -z "$SERVICE" ]; then
|
||||
echo "Usage: $0 <service-name>"
|
||||
echo "Example: $0 auth-service"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EN: Check if service exists
|
||||
# VI: Kiểm tra xem service có tồn tại không
|
||||
if [ ! -d "services/$SERVICE" ]; then
|
||||
echo "❌ Service $SERVICE not found"
|
||||
exit 1
|
||||
@@ -19,7 +23,8 @@ echo "🌱 Seeding database for $SERVICE..."
|
||||
|
||||
cd "services/$SERVICE"
|
||||
|
||||
# Check if DATABASE_URL is set
|
||||
# EN: Check if DATABASE_URL is set
|
||||
# VI: Kiểm tra DATABASE_URL đã được thiết lập chưa
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
if [ -f ".env" ]; then
|
||||
export $(grep -v '^#' .env | xargs)
|
||||
|
||||
@@ -13,7 +13,8 @@ NC='\033[0m' # No Color
|
||||
echo -e "${YELLOW}This script helps you set up Neon database for all environments.${NC}"
|
||||
echo ""
|
||||
|
||||
# Check if .env.local exists
|
||||
# EN: Check if .env.local exists
|
||||
# VI: Kiểm tra xem .env.local có tồn tại không
|
||||
ENV_LOCAL="deployments/local/.env.local"
|
||||
if [ ! -f "$ENV_LOCAL" ]; then
|
||||
echo "📝 Creating $ENV_LOCAL from example..."
|
||||
@@ -36,7 +37,8 @@ echo ""
|
||||
|
||||
read -p "Enter development DATABASE_URL (main branch): " dev_url
|
||||
if [ -n "$dev_url" ]; then
|
||||
# Update .env.local
|
||||
# EN: Update .env.local with new URL
|
||||
# VI: Cập nhật .env.local với URL mới
|
||||
if grep -q "DATABASE_URL=" "$ENV_LOCAL"; then
|
||||
sed -i.bak "s|DATABASE_URL=.*|DATABASE_URL=$dev_url|" "$ENV_LOCAL"
|
||||
rm -f "${ENV_LOCAL}.bak"
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
|
||||
set -e
|
||||
|
||||
# EN: Warn user about production deployment
|
||||
# VI: Cảnh báo người dùng về việc deploy lên production
|
||||
echo "⚠️ WARNING: You are about to deploy to PRODUCTION!"
|
||||
read -p "Are you sure? (yes/no): " confirm
|
||||
|
||||
# EN: Check user confirmation
|
||||
# VI: Kiểm tra xác nhận của người dùng
|
||||
if [ "$confirm" != "yes" ]; then
|
||||
echo "Deployment cancelled"
|
||||
exit 1
|
||||
@@ -12,11 +16,15 @@ fi
|
||||
|
||||
echo "🚀 Deploying to production..."
|
||||
|
||||
# EN: Verify KUBECONFIG environment variable is set
|
||||
# VI: Xác minh biến môi trường KUBECONFIG đã được thiết lập
|
||||
if [ -z "$KUBECONFIG" ]; then
|
||||
echo "❌ KUBECONFIG environment variable not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EN: Apply Kubernetes configurations and wait for rollout
|
||||
# VI: Áp dụng cấu hình Kubernetes và đợi quá trình rollout hoàn tất
|
||||
kubectl apply -f deployments/production/kubernetes/
|
||||
kubectl rollout status deployment/auth-service -n production
|
||||
|
||||
|
||||
@@ -4,11 +4,15 @@ set -e
|
||||
|
||||
echo "🚀 Deploying to staging..."
|
||||
|
||||
# EN: Verify KUBECONFIG environment variable is set
|
||||
# VI: Xác minh biến môi trường KUBECONFIG đã được thiết lập
|
||||
if [ -z "$KUBECONFIG" ]; then
|
||||
echo "❌ KUBECONFIG environment variable not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EN: Apply Kubernetes configurations and wait for rollout
|
||||
# VI: Áp dụng cấu hình Kubernetes và đợi quá trình rollout hoàn tất
|
||||
kubectl apply -f deployments/staging/kubernetes/
|
||||
kubectl rollout status deployment/auth-service -n staging
|
||||
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
|
||||
SERVICE=$1
|
||||
|
||||
# EN: Check usage
|
||||
# VI: Kiểm tra cách sử dụng
|
||||
if [ -z "$SERVICE" ]; then
|
||||
echo "Usage: $0 <service-name>"
|
||||
echo "Usage: $0 <service-name> / Cách dùng: $0 <tên-service>"
|
||||
echo "Example: $0 auth-service"
|
||||
echo ""
|
||||
echo "Or use 'docker' to view Docker logs:"
|
||||
echo "Or use 'docker' to view Docker logs: / Hoặc dùng 'docker' để xem log Docker:"
|
||||
echo " $0 docker <container-name>"
|
||||
exit 1
|
||||
fi
|
||||
@@ -15,12 +17,16 @@ if [ "$SERVICE" = "docker" ]; then
|
||||
CONTAINER=$2
|
||||
if [ -z "$CONTAINER" ]; then
|
||||
echo "Usage: $0 docker <container-name>"
|
||||
echo "Available containers:"
|
||||
echo "Available containers: / Các container khả dụng:"
|
||||
docker ps --format "{{.Names}}"
|
||||
exit 1
|
||||
fi
|
||||
# EN: Follow docker logs
|
||||
# VI: Theo dõi log docker
|
||||
docker logs -f "$CONTAINER"
|
||||
else
|
||||
# EN: Start development logs using pnpm
|
||||
# VI: Bắt đầu log phát triển sử dụng pnpm
|
||||
cd "services/$SERVICE"
|
||||
pnpm dev
|
||||
fi
|
||||
|
||||
@@ -13,20 +13,22 @@ GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Check if we're in the project root
|
||||
# EN: Check if we're in the project root
|
||||
# VI: Kiểm tra xem có đang ở root project không
|
||||
if [ ! -f "package.json" ]; then
|
||||
echo -e "${RED}❌ Error: Must run from project root${NC}"
|
||||
echo -e "${RED}❌ Error: Must run from project root / Lỗi: Phải chạy từ root project${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Setup shared environment
|
||||
# EN: Setup shared environment
|
||||
# VI: Thiết lập môi trường chia sẻ
|
||||
echo ""
|
||||
echo "📦 Step 1: Setup shared environment (deployments/local/.env.local)"
|
||||
if [ -f "deployments/local/.env.local" ]; then
|
||||
echo -e "${YELLOW}⚠️ deployments/local/.env.local already exists${NC}"
|
||||
read -p "Overwrite? (y/n): " overwrite
|
||||
echo -e "${YELLOW}⚠️ deployments/local/.env.local already exists / đã tồn tại${NC}"
|
||||
read -p "Overwrite? (y/n): / Ghi đè? (y/n): " overwrite
|
||||
if [ "$overwrite" != "y" ]; then
|
||||
echo "Skipping shared environment setup"
|
||||
echo "Skipping shared environment setup / Bỏ qua thiết lập môi trường chia sẻ"
|
||||
else
|
||||
cp deployments/local/env.local.example deployments/local/.env.local
|
||||
echo -e "${GREEN}✅ Created deployments/local/.env.local${NC}"
|
||||
@@ -36,11 +38,13 @@ else
|
||||
echo -e "${GREEN}✅ Created deployments/local/.env.local${NC}"
|
||||
fi
|
||||
|
||||
# Setup service-specific environments
|
||||
# EN: Setup service-specific environments
|
||||
# VI: Thiết lập môi trường cụ thể cho từng service
|
||||
echo ""
|
||||
echo "📦 Step 2: Setup service-specific environments"
|
||||
|
||||
# Function to setup service env
|
||||
# EN: Function to setup service env
|
||||
# VI: Hàm để setup env cho service
|
||||
setup_service_env() {
|
||||
local service=$1
|
||||
local service_path="services/$service"
|
||||
|
||||
@@ -4,6 +4,8 @@ set -e
|
||||
|
||||
SERVICE=$1
|
||||
|
||||
# EN: Validate arguments
|
||||
# VI: Xác thực tham số
|
||||
if [ -z "$SERVICE" ]; then
|
||||
echo "Usage: $0 <service-name>"
|
||||
echo "Example: $0 auth-service"
|
||||
@@ -12,7 +14,8 @@ fi
|
||||
|
||||
echo "🚀 Starting $SERVICE..."
|
||||
|
||||
# Check if service exists
|
||||
# EN: Check if service exists
|
||||
# VI: Kiểm tra xem service có tồn tại không
|
||||
if [ ! -d "services/$SERVICE" ]; then
|
||||
echo "❌ Service $SERVICE not found"
|
||||
exit 1
|
||||
|
||||
@@ -4,7 +4,8 @@ set -e
|
||||
|
||||
echo "🚀 Initializing GoodGo Microservices Project..."
|
||||
|
||||
# Check prerequisites
|
||||
# EN: Check prerequisites
|
||||
# VI: Kiểm tra các điều kiện tiên quyết
|
||||
if ! command -v pnpm &> /dev/null; then
|
||||
echo "❌ PNPM is not installed. Please install it first: npm install -g pnpm"
|
||||
exit 1
|
||||
@@ -14,17 +15,20 @@ if ! command -v docker &> /dev/null; then
|
||||
echo "⚠️ Docker is not installed. Some features may not work."
|
||||
fi
|
||||
|
||||
# Install dependencies
|
||||
# EN: Install dependencies
|
||||
# VI: Cài đặt các gói phụ thuộc
|
||||
echo "📦 Installing dependencies..."
|
||||
pnpm install
|
||||
|
||||
# Generate Prisma clients
|
||||
# EN: Generate Prisma clients
|
||||
# VI: Tạo Prisma generic clients
|
||||
echo "🔧 Generating Prisma clients..."
|
||||
cd services/auth-service
|
||||
pnpm prisma:generate || echo "⚠️ Prisma generation skipped (database not available)"
|
||||
cd ../..
|
||||
|
||||
# Setup environment files
|
||||
# EN: Setup environment files
|
||||
# VI: Thiết lập các file biến môi trường
|
||||
echo "📝 Setting up environment files..."
|
||||
if [ ! -f "services/auth-service/.env" ]; then
|
||||
cp services/auth-service/env.example services/auth-service/.env
|
||||
|
||||
@@ -4,6 +4,8 @@ set -e
|
||||
|
||||
echo "📦 Installing all dependencies..."
|
||||
|
||||
# EN: Install dependencies using pnpm
|
||||
# VI: Cài đặt dependencies sử dụng pnpm
|
||||
pnpm install
|
||||
|
||||
echo "✅ Dependencies installed!"
|
||||
|
||||
@@ -4,19 +4,23 @@ set -e
|
||||
|
||||
echo "🧹 Cleaning up temporary files..."
|
||||
|
||||
# Remove node_modules (optional, comment out if you want to keep them)
|
||||
# EN: Remove node_modules (optional, comment out if you want to keep them)
|
||||
# VI: Xóa node_modules (tùy chọn, comment lại nếu muốn giữ)
|
||||
# find . -name "node_modules" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
# Remove build artifacts
|
||||
# EN: Remove build artifacts
|
||||
# VI: Xóa các file build
|
||||
find . -name "dist" -type d -prune -exec rm -rf {} \;
|
||||
find . -name ".next" -type d -prune -exec rm -rf {} \;
|
||||
find . -name "build" -type d -prune -exec rm -rf {} \;
|
||||
find . -name "*.tsbuildinfo" -type f -delete
|
||||
|
||||
# Remove logs
|
||||
# EN: Remove logs
|
||||
# VI: Xóa file logs
|
||||
find . -name "*.log" -type f -delete
|
||||
|
||||
# Remove cache
|
||||
# EN: Remove cache
|
||||
# VI: Xóa cache
|
||||
find . -name ".turbo" -type d -prune -exec rm -rf {} \;
|
||||
find . -name ".cache" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ set -e
|
||||
|
||||
SERVICE_NAME=$1
|
||||
|
||||
# EN: Validate arguments
|
||||
# VI: Xác thực tham số
|
||||
if [ -z "$SERVICE_NAME" ]; then
|
||||
echo "Usage: $0 <service-name>"
|
||||
echo "Example: $0 payment-service"
|
||||
@@ -12,6 +14,8 @@ fi
|
||||
|
||||
SERVICE_DIR="services/$SERVICE_NAME"
|
||||
|
||||
# EN: Check if service directory already exists
|
||||
# VI: Kiểm tra xem thư mục service đã tồn tại chưa
|
||||
if [ -d "$SERVICE_DIR" ]; then
|
||||
echo "❌ Service $SERVICE_NAME already exists"
|
||||
exit 1
|
||||
@@ -19,19 +23,23 @@ fi
|
||||
|
||||
echo "📦 Creating new service: $SERVICE_NAME..."
|
||||
|
||||
# Copy template
|
||||
# EN: Copy template
|
||||
# VI: Copy template
|
||||
cp -r services/_template "$SERVICE_DIR"
|
||||
|
||||
# Update package.json
|
||||
# EN: Update package.json
|
||||
# VI: Cập nhật package.json
|
||||
cd "$SERVICE_DIR"
|
||||
sed -i.bak "s/@goodgo\/service-template/@goodgo\/$SERVICE_NAME/g" package.json
|
||||
rm package.json.bak
|
||||
|
||||
# Update .env.example
|
||||
# EN: Update .env.example
|
||||
# VI: Cập nhật .env.example
|
||||
sed -i.bak "s/SERVICE_NAME=service-name/SERVICE_NAME=$SERVICE_NAME/g" .env.example 2>/dev/null || true
|
||||
rm .env.example.bak 2>/dev/null || true
|
||||
|
||||
# Update Dockerfile port if needed
|
||||
# EN: Update Dockerfile port if needed
|
||||
# VI: Cập nhật port Dockerfile nếu cần
|
||||
# (Keep default 5000, user can change later)
|
||||
|
||||
cd ../..
|
||||
|
||||
Reference in New Issue
Block a user