#!/bin/bash # ============================================================================== # init-project.sh - Inicializa un nuevo proyecto # ============================================================================== # Uso: ./init-project.sh # # Tipos disponibles: # - backend : Solo backend # - frontend : Solo frontend # - fullstack : Backend + Frontend # - ml : Backend Python/FastAPI # # Ejemplo: ./init-project.sh gamilit-platform fullstack # ============================================================================== set -e # Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Parametros PROJECT_NAME="${1}" PROJECT_TYPE="${2:-fullstack}" # Validar parametros if [ -z "$PROJECT_NAME" ]; then echo -e "${RED}ERROR: Nombre de proyecto requerido${NC}" echo "" echo "Uso: $0 [tipo]" echo "" echo "Tipos disponibles:" echo " - backend : Solo backend" echo " - frontend : Solo frontend" echo " - fullstack : Backend + Frontend (default)" echo " - ml : Backend Python/FastAPI" exit 1 fi # Rutas SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONTROL_PLANE="${SCRIPT_DIR}/../../.." TEMPLATES_DIR="${CONTROL_PLANE}/devtools/docker/templates" REPOS_DIR="${CONTROL_PLANE}/../repos" PROJECT_DIR="${REPOS_DIR}/${PROJECT_NAME}" echo -e "${BLUE}============================================${NC}" echo -e "${BLUE} INICIALIZACION DE PROYECTO${NC}" echo -e "${BLUE}============================================${NC}" echo "" echo "Proyecto: $PROJECT_NAME" echo "Tipo: $PROJECT_TYPE" echo "Directorio: $PROJECT_DIR" echo "" # Verificar que no existe if [ -d "$PROJECT_DIR" ]; then echo -e "${RED}ERROR: El proyecto ya existe: $PROJECT_DIR${NC}" exit 1 fi # ------------------------------------------------------------------------------ # 1. Crear estructura # ------------------------------------------------------------------------------ echo -e "${YELLOW}[1/4] Creando estructura de directorios...${NC}" mkdir -p "$PROJECT_DIR"/{apps,docker,orchestration,docs,.github/workflows} case "$PROJECT_TYPE" in backend) mkdir -p "$PROJECT_DIR"/apps/{backend/src,database/{ddl,seeds,migrations}} ;; frontend) mkdir -p "$PROJECT_DIR"/apps/frontend/src ;; fullstack) mkdir -p "$PROJECT_DIR"/apps/{backend/src,frontend/src,database/{ddl,seeds,migrations}} ;; ml) mkdir -p "$PROJECT_DIR"/apps/{backend/src,ml-engine/src,database} ;; *) echo -e "${RED}ERROR: Tipo desconocido: $PROJECT_TYPE${NC}" exit 1 ;; esac echo -e " ${GREEN}[OK]${NC} Estructura creada" # ------------------------------------------------------------------------------ # 2. Crear package.json root # ------------------------------------------------------------------------------ echo -e "${YELLOW}[2/4] Creando archivos base...${NC}" cat > "$PROJECT_DIR/package.json" << EOF { "name": "${PROJECT_NAME}", "version": "1.0.0", "private": true, "workspaces": [ "apps/*" ], "scripts": { "dev": "echo 'Usar docker-compose up'", "build": "npm run build --workspaces --if-present", "test": "npm run test --workspaces --if-present", "lint": "npm run lint --workspaces --if-present" } } EOF echo -e " ${GREEN}[OK]${NC} package.json" # README cat > "$PROJECT_DIR/README.md" << EOF # ${PROJECT_NAME} ## Setup \`\`\`bash # Prerequisitos: Tener el workspace inicializado # ../control-plane/devtools/scripts/bootstrap/init-workspace.sh # Levantar servicios cd docker docker-compose up -d \`\`\` ## Servicios | Servicio | URL | |----------|-----| | API | http://api.${PROJECT_NAME}.localhost | | Web | http://${PROJECT_NAME}.localhost | ## Estructura \`\`\` ${PROJECT_NAME}/ ├── apps/ │ ├── backend/ │ └── frontend/ ├── docker/ ├── orchestration/ └── docs/ \`\`\` EOF echo -e " ${GREEN}[OK]${NC} README.md" # .gitignore cat > "$PROJECT_DIR/.gitignore" << 'EOF' # Dependencies node_modules/ __pycache__/ venv/ .venv/ # Build dist/ build/ .next/ out/ # Environment .env .env.local .env.*.local # IDE .idea/ .vscode/ *.swp *.swo # OS .DS_Store Thumbs.db # Logs *.log logs/ # Test coverage/ .nyc_output/ # Docker .docker/ EOF echo -e " ${GREEN}[OK]${NC} .gitignore" # ------------------------------------------------------------------------------ # 3. Crear docker-compose # ------------------------------------------------------------------------------ echo -e "${YELLOW}[3/4] Creando docker-compose...${NC}" # Extraer nombre corto para dominios SHORT_NAME=$(echo "$PROJECT_NAME" | sed 's/-platform//' | sed 's/-//') cat > "$PROJECT_DIR/docker/docker-compose.yml" << EOF version: "3.8" x-logging: &default-logging driver: "json-file" options: max-size: "10m" max-file: "3" services: EOF # Agregar backend si aplica if [[ "$PROJECT_TYPE" == "backend" || "$PROJECT_TYPE" == "fullstack" ]]; then cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF ${SHORT_NAME}-api: build: context: ../apps/backend dockerfile: Dockerfile container_name: ${SHORT_NAME}-api restart: unless-stopped expose: - "3000" environment: - NODE_ENV=\${NODE_ENV:-development} - PORT=3000 - DATABASE_URL=\${DATABASE_URL} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 5s retries: 3 labels: - "traefik.enable=true" - "traefik.http.routers.${SHORT_NAME}-api.rule=Host(\`api.${SHORT_NAME}.localhost\`)" - "traefik.http.services.${SHORT_NAME}-api.loadbalancer.server.port=3000" networks: - ${SHORT_NAME}_\${ENV:-local} - infra_shared logging: <<: *default-logging EOF fi # Agregar frontend si aplica if [[ "$PROJECT_TYPE" == "frontend" || "$PROJECT_TYPE" == "fullstack" ]]; then cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF ${SHORT_NAME}-web: build: context: ../apps/frontend dockerfile: Dockerfile container_name: ${SHORT_NAME}-web restart: unless-stopped expose: - "3001" environment: - NODE_ENV=\${NODE_ENV:-development} labels: - "traefik.enable=true" - "traefik.http.routers.${SHORT_NAME}-web.rule=Host(\`${SHORT_NAME}.localhost\`)" - "traefik.http.services.${SHORT_NAME}-web.loadbalancer.server.port=3001" networks: - ${SHORT_NAME}_\${ENV:-local} - infra_shared logging: <<: *default-logging EOF fi # Agregar ML si aplica if [[ "$PROJECT_TYPE" == "ml" ]]; then cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF ${SHORT_NAME}-ml: build: context: ../apps/ml-engine dockerfile: Dockerfile container_name: ${SHORT_NAME}-ml restart: unless-stopped expose: - "8000" environment: - ENV=\${ENV:-development} labels: - "traefik.enable=true" - "traefik.http.routers.${SHORT_NAME}-ml.rule=Host(\`ml.${SHORT_NAME}.localhost\`)" - "traefik.http.services.${SHORT_NAME}-ml.loadbalancer.server.port=8000" networks: - ${SHORT_NAME}_\${ENV:-local} - infra_shared EOF fi # Agregar networks cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF networks: ${SHORT_NAME}_\${ENV:-local}: external: true infra_shared: external: true EOF echo -e " ${GREEN}[OK]${NC} docker-compose.yml" # .env.example cat > "$PROJECT_DIR/docker/.env.example" << EOF # Environment NODE_ENV=development ENV=local # Database DATABASE_URL=postgresql://user:password@postgres:5432/${SHORT_NAME}_db # JWT JWT_SECRET=your-secret-key-here # API URL (for frontend) REACT_APP_API_URL=http://api.${SHORT_NAME}.localhost EOF echo -e " ${GREEN}[OK]${NC} .env.example" # ------------------------------------------------------------------------------ # 4. Crear service descriptors placeholder # ------------------------------------------------------------------------------ echo -e "${YELLOW}[4/4] Creando service descriptors...${NC}" if [[ "$PROJECT_TYPE" == "backend" || "$PROJECT_TYPE" == "fullstack" ]]; then cat > "$PROJECT_DIR/apps/backend/service.descriptor.yml" << EOF # TODO: Completar este service descriptor # Ver: control-plane/orchestration/templates/service-descriptor/SERVICE-DESCRIPTOR-TEMPLATE.yml service: name: "${SHORT_NAME}-api" type: "backend" runtime: "node" version: "1.0.0" description: "TODO: Agregar descripcion" owner_agent: "NEXUS-BACKEND" repository: name: "${PROJECT_NAME}" path: "apps/backend" main_branch: "main" ports: internal: 3000 registry_ref: "projects.TODO.api" # TODO: Actualizar protocol: "http" # TODO: Completar resto del descriptor EOF echo -e " ${GREEN}[OK]${NC} apps/backend/service.descriptor.yml (placeholder)" fi if [[ "$PROJECT_TYPE" == "frontend" || "$PROJECT_TYPE" == "fullstack" ]]; then cat > "$PROJECT_DIR/apps/frontend/service.descriptor.yml" << EOF # TODO: Completar este service descriptor service: name: "${SHORT_NAME}-web" type: "frontend" runtime: "static" version: "1.0.0" description: "TODO: Agregar descripcion" owner_agent: "NEXUS-FRONTEND" repository: name: "${PROJECT_NAME}" path: "apps/frontend" main_branch: "main" ports: internal: 3001 registry_ref: "projects.TODO.web" # TODO: Actualizar protocol: "http" # TODO: Completar resto del descriptor EOF echo -e " ${GREEN}[OK]${NC} apps/frontend/service.descriptor.yml (placeholder)" fi # ------------------------------------------------------------------------------ # Resultado # ------------------------------------------------------------------------------ echo "" echo -e "${BLUE}============================================${NC}" echo -e "${GREEN} PROYECTO CREADO: ${PROJECT_NAME}${NC}" echo -e "${BLUE}============================================${NC}" echo "" echo "Proximos pasos:" echo " 1. Actualizar service descriptors con valores reales" echo " 2. Agregar codigo en apps/" echo " 3. Crear Dockerfiles" echo " 4. Agregar proyecto a ports.registry.yml" echo " 5. cd $PROJECT_DIR/docker && docker-compose up -d" echo ""