# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: ERPNext
spec:
    description: One-click ERPNext v15 - Open source ERP for manufacturing, distribution, retail, and services. Zero configuration required.
    coverImage: https://erpnext.com/files/erpnext-hero.png
    icon: https://raw.githubusercontent.com/frappe/erpnext/develop/erpnext/public/images/erpnext-logo.svg
    tags:
        - ERP
        - Business
        - Frappe
        - Accounting
        - HR
        - CRM
        - Manufacturing
        - Open Source
    readme: "# ERPNext - One-Click Deployment\n\n**Zero configuration required!** All credentials are auto-generated. No prompts.\n\n## \U0001F680 Quick Start\n\n1. **Click Deploy** - No forms, no prompts, just deploy!\n2. **Wait 5-10 minutes** - First deployment downloads ERPNext\n3. **Add Domain** - Go to ERPNext service → Domains → Generate Domain\n4. **Get Password** - ERPNext service → Instructions → Admin Password\n5. **Login** - Username: `Administrator`, Password: from step 4\n6. **Setup Wizard** - Configure your company\n\n## \U0001F310 Adding a Domain (Required)\n\nAfter deployment completes:\n1. Go to Zeabur Dashboard → ERPNext service\n2. Click **Domains** tab\n3. Click **Generate Domain** to get a free `*.zeabur.app` domain\n4. Or add your own custom domain\n\n## \U0001F511 Auto-Generated Credentials\n\nAll passwords are automatically generated by Zeabur:\n\n| Credential | Location |\n|------------|----------|\n| **Admin Password** | ERPNext service → Instructions tab |\n| **Database Password** | MariaDB service → Instructions tab |\n\n**Username is always**: `Administrator`\n\n## \U0001F4E6 What's Deployed\n\n| Service | Description |\n|---------|-------------|\n| **ERPNext v15** | Full ERP application |\n| **MariaDB 11.8** | Database with auto-backup |\n| **Redis Cache** | Application caching |\n| **Redis Queue** | Background job queue |\n\n## \U0001F4CB ERPNext Modules\n\n- **Accounting** - GL, AP/AR, bank reconciliation, taxes\n- **Inventory** - Warehouses, batch/serial tracking\n- **Manufacturing** - BOM, work orders, production planning\n- **Buying** - Purchase orders, suppliers, RFQ\n- **Selling** - Sales orders, quotations, customers\n- **HR & Payroll** - Employees, attendance, leave, payroll\n- **CRM** - Leads, opportunities, campaigns\n- **Projects** - Tasks, timesheets, Gantt charts\n- **Assets** - Fixed assets, depreciation\n- **Website** - Built-in website builder\n\n## \U0001F527 Troubleshooting\n\n### Site shows error or blank page\n- **Wait 5-10 minutes** - First startup takes time\n- **Check logs** - View ERPNext service logs in dashboard\n- **Verify services** - All 4 services should be \"Running\"\n\n### Forgot password\n- Check ERPNext service → Instructions tab for auto-generated password\n- Or reset via ERPNext login page (requires email setup)\n\n### Slow performance\n- Upgrade Zeabur plan for more resources\n- Clear cache in ERPNext: Settings → Clear Cache\n\n## \U0001F4DA Resources\n\n- [ERPNext Docs](https://docs.erpnext.com/)\n- [Video Tutorials](https://www.youtube.com/@ERPNext)\n- [Community Forum](https://discuss.frappe.io/)\n- [GitHub](https://github.com/frappe/erpnext)\n\n---\n\n**Enjoy your ERPNext!** Built with Frappe Framework ❤️\n"
    services:
        - name: mariadb
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/mariadb.svg
          template: PREBUILT
          spec:
            source:
                image: mariadb:11.8
            ports:
                - id: database
                  port: 3306
                  type: TCP
            volumes:
                - id: data
                  dir: /var/lib/mysql
            instructions:
                - title: Database Password (Auto-Generated)
                  content: ${MARIADB_ROOT_PASSWORD}
                - title: Database Host
                  content: ${MARIADB_HOST}
            env:
                MARIADB_DATABASE:
                    default: erpnext
                    expose: true
                MARIADB_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                MARIADB_PORT:
                    default: "3306"
                    expose: true
                MARIADB_ROOT_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
        - name: redis-cache
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT
          spec:
            source:
                image: redis:7-alpine
            ports:
                - id: redis
                  port: 6379
                  type: TCP
            env:
                REDIS_CACHE_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
        - name: redis-queue
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT
          spec:
            source:
                image: redis:7-alpine
            ports:
                - id: redis
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            env:
                REDIS_QUEUE_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
        - name: erpnext
          icon: https://raw.githubusercontent.com/frappe/erpnext/develop/erpnext/public/images/erpnext-logo.svg
          template: PREBUILT
          spec:
            source:
                image: frappe/bench:latest
            ports:
                - id: web
                  port: 8000
                  type: HTTP
            volumes:
                - id: sites
                  dir: /home/frappe/frappe-bench/sites
                - id: logs
                  dir: /home/frappe/frappe-bench/logs
            instructions:
                - title: "\U0001F310 Access ERPNext"
                  content: Your ERPNext is at ${ZEABUR_WEB_URL} - First startup takes 5-10 minutes
                - title: "\U0001F464 Username"
                  content: Administrator
                - title: "\U0001F511 Admin Password (Auto-Generated)"
                  content: ${ERPNEXT_ADMIN_PASSWORD}
                - title: ⏱️ Startup Time
                  content: Initial deployment downloads and installs ERPNext. Check logs for progress. Takes 5-10 minutes.
                - title: "\U0001F4CB After Login"
                  content: Complete the ERPNext Setup Wizard to configure your company, currency, and modules.
            env:
                ERPNEXT_ADMIN_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                ERPNEXT_ENCRYPTION_KEY:
                    default: ${PASSWORD}
                    expose: false
                ERPNEXT_PASSWORD:
                    default: ${PASSWORD}
                    expose: false
                MARIADB_HOST:
                    default: ${MARIADB_HOST}
                    expose: false
                MARIADB_ROOT_PASSWORD:
                    default: ${MARIADB_ROOT_PASSWORD}
                    expose: false
                REDIS_CACHE_HOST:
                    default: ${REDIS_CACHE_HOST}
                    expose: false
                REDIS_QUEUE_HOST:
                    default: ${REDIS_QUEUE_HOST}
                    expose: false
            configs:
                - path: /workspace/init-erpnext.sh
                  template: "#!/bin/bash\nset -e\n\necho \"==============================================\"\necho \"  ERPNext v15 - Autonomous Deployment\"\necho \"  All credentials auto-generated by Zeabur\"\necho \"==============================================\"\n\ncd /home/frappe\n\n# Generate encryption key from service password if not set\nENCRYPTION_KEY=\"${ERPNEXT_ENCRYPTION_KEY:-$(echo -n \"${ERPNEXT_PASSWORD}\" | sha256sum | head -c 32)}\"\n\n# Install Node.js 18 via NVM\nexport NVM_DIR=\"/home/frappe/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\"\n\nif ! command -v node &> /dev/null || [[ $(node -v) != v18* ]]; then\n  echo \"\U0001F4E6 Installing Node.js 18...\"\n  if ! command -v nvm &> /dev/null; then\n    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash\n    [ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\"\n  fi\n  nvm install 18\n  nvm use 18\n  nvm alias default 18\nfi\n\necho \"Node: $(node -v) | NPM: $(npm -v)\"\n\n# Check if bench already exists\nif [ -d \"frappe-bench\" ] && [ -f \"frappe-bench/sites/common_site_config.json\" ]; then\n  echo \"✅ Bench exists, updating configuration...\"\n  cd frappe-bench\n\n  # Update common_site_config with current hosts\n  cat > sites/common_site_config.json << EOF\n{\n  \"db_host\": \"${MARIADB_HOST}\",\n  \"db_port\": 3306,\n  \"redis_cache\": \"redis://${REDIS_CACHE_HOST}:6379\",\n  \"redis_queue\": \"redis://${REDIS_QUEUE_HOST}:6379\",\n  \"redis_socketio\": \"redis://${REDIS_QUEUE_HOST}:6379\",\n  \"encryption_key\": \"${ENCRYPTION_KEY}\",\n  \"socketio_port\": 9000\n}\nEOF\n\nelse\n  echo \"\U0001F3D7️ First-time setup - this takes 5-10 minutes...\"\n  echo \"\"\n  echo \"\U0001F4CB Auto-Generated Credentials:\"\n  echo \"   Admin User: Administrator\"\n  echo \"   Admin Pass: (shown in Zeabur dashboard)\"\n  echo \"\"\n\n  # Wait for MariaDB\n  echo \"⏳ Waiting for MariaDB...\"\n  max_attempts=90\n  attempt=0\n  while [ $attempt -lt $max_attempts ]; do\n    if mariadb -h\"${MARIADB_HOST}\" -P3306 -uroot -p\"${MARIADB_ROOT_PASSWORD}\" -e \"SELECT 1\" 2>/dev/null; then\n      echo \"✅ MariaDB ready!\"\n      break\n    fi\n    attempt=$((attempt + 1))\n    if [ $((attempt % 10)) -eq 0 ]; then\n      echo \"   Still waiting... ($attempt/$max_attempts)\"\n    fi\n    sleep 3\n  done\n\n  if [ $attempt -eq $max_attempts ]; then\n    echo \"❌ MariaDB timeout - check mariadb service logs\"\n    exit 1\n  fi\n\n  # Wait for Redis\n  echo \"⏳ Waiting for Redis...\"\n  sleep 5\n\n  # Initialize Frappe Bench\n  echo \"\U0001F4E5 Initializing Frappe Bench v15...\"\n  bench init --skip-redis-config-generation --frappe-branch version-15 frappe-bench\n\n  cd frappe-bench\n\n  # Configure connections\n  echo \"⚙️ Configuring services...\"\n  cat > sites/common_site_config.json << EOF\n{\n  \"db_host\": \"${MARIADB_HOST}\",\n  \"db_port\": 3306,\n  \"redis_cache\": \"redis://${REDIS_CACHE_HOST}:6379\",\n  \"redis_queue\": \"redis://${REDIS_QUEUE_HOST}:6379\",\n  \"redis_socketio\": \"redis://${REDIS_QUEUE_HOST}:6379\",\n  \"encryption_key\": \"${ENCRYPTION_KEY}\",\n  \"socketio_port\": 9000\n}\nEOF\n\n  # Remove Redis from Procfile (using external)\n  sed -i '/^redis/d' Procfile\n\n  # Get ERPNext\n  echo \"\U0001F4E5 Downloading ERPNext v15...\"\n  bench get-app --branch version-15 erpnext\n\n  # Create site with auto-generated password\n  SITE_NAME=\"erpnext.local\"\n  echo \"\U0001F310 Creating site: $SITE_NAME\"\n  bench new-site \"$SITE_NAME\" \\\n    --db-root-password \"${MARIADB_ROOT_PASSWORD}\" \\\n    --admin-password \"${ERPNEXT_ADMIN_PASSWORD}\" \\\n    --no-mariadb-socket \\\n    --set-default\n\n  # Install ERPNext\n  echo \"\U0001F4F2 Installing ERPNext...\"\n  bench --site \"$SITE_NAME\" install-app erpnext\n\n  # Set default site\n  echo \"$SITE_NAME\" > sites/currentsite.txt\n\n  # Production settings\n  echo \"\U0001F527 Applying production settings...\"\n  bench --site \"$SITE_NAME\" set-config developer_mode 0\n  bench --site \"$SITE_NAME\" set-config mute_emails 0\n  bench --site \"$SITE_NAME\" set-config server_script_enabled 1\n\n  # Clear cache\n  bench --site \"$SITE_NAME\" clear-cache\n\n  echo \"\"\n  echo \"==============================================\"\n  echo \"  ✅ ERPNext Setup Complete!\"\n  echo \"==============================================\"\n  echo \"\"\n  echo \"  \U0001F511 Login Credentials:\"\n  echo \"     Username: Administrator\"\n  echo \"     Password: Check 'Admin Password' in Zeabur dashboard\"\n  echo \"\"\n  echo \"  \U0001F4CB Next Steps:\"\n  echo \"     1. Access your ERPNext at your domain\"\n  echo \"     2. Login with above credentials\"\n  echo \"     3. Complete the Setup Wizard\"\n  echo \"\"\n  echo \"==============================================\"\nfi\n\necho \"\"\necho \"\U0001F680 Starting ERPNext server...\"\nexec bench start --skip-redis\n"
                  permission: 493
                  envsubst: true
