Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[1m'\nGREY=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[90m'\nRED=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[31m'\nGREEN=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[32m'\nYELLOW=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[33m'\nMAGENTA=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[35m'\nCYAN=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[36m'\nNC=

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…

\\033[0m'\n\ninfo() { printf \"${BOLD}${GREY}>${NC} %s\\n\" \"$*\"; }\nwarn() { printf \"${YELLOW}! %s${NC}\\n\" \"$*\"; }\nerror() { printf \"${RED}x %s${NC}\\n\" \"$*\" >&2; }\ncompleted() { printf \"${GREEN}✓${NC} %s\\n\" \"$*\"; }\n\nprint_banner() {\n printf \"\\n${MAGENTA}\"\n cat \u003c\u003c'EOF'\n _____ _ _ _\n | ____| | ___ ___| |_(_) ___\n | _| | |/ _ \\/ __| __| |/ _ \\\n | |___| | __/\\__ \\ |_| | (_) |\n |_____|_|\\___||___/\\__|_|\\___/\n\nEOF\n printf \"${NC}\"\n}\n\ncheck_node() {\n if ! command -v node &>/dev/null; then\n error \"Node.js is required but not installed.\"\n printf \" Install it from: ${CYAN}https://nodejs.org${NC}\\n\"\n exit 1\n fi\n local node_major\n node_major=$(node -e \"process.stdout.write(String(process.versions.node.split('.')[0]))\")\n if [ \"$node_major\" -lt 18 ]; then\n error \"Node.js >= 18 required (found v$(node --version)).\"\n exit 1\n fi\n}\n\ninstall_cli() {\n if command -v elestio &>/dev/null; then\n info \"Updating Elestio CLI...\"\n else\n info \"Installing Elestio CLI...\"\n fi\n npm install -g elestio --silent 2>/dev/null || npm install -g elestio\n completed \"Elestio CLI installed ($(elestio --version 2>/dev/null || echo 'latest'))\"\n}\n\ninstall_skill() {\n local skills_dir=\"$1\"\n local name=\"$2\"\n local temp_dir=\"$3\"\n local dest=\"$skills_dir/$SKILL_NAME\"\n\n mkdir -p \"$skills_dir\"\n rm -rf \"$dest\" 2>/dev/null || true\n mkdir -p \"$dest\"\n\n cp \"$temp_dir/SKILL.md\" \"$dest/\"\n\n completed \"$name: skill installed ${CYAN}$dest${NC}\"\n}\n\n# Targets: [dir, name]\ndeclare -a TARGETS=(\n \"$HOME/.claude/skills|Claude Code\"\n \"$HOME/.codex/skills|OpenAI Codex\"\n \"$HOME/.config/opencode/skill|OpenCode\"\n \"$HOME/.cursor/skills|Cursor\"\n)\n\n# Detect available tools\ndeclare -a FOUND=()\nfor target in \"${TARGETS[@]}\"; do\n dir=\"${target%%|*}\"\n parent=\"${dir%/*}\"\n [ -d \"$parent\" ] && FOUND+=(\"$target\")\ndone\n\nif [ ${#FOUND[@]} -eq 0 ]; then\n error \"No supported tools found.\"\n printf \"\\nSupported:\\n\"\n printf \" - Claude Code (~/.claude)\\n\"\n printf \" - OpenAI Codex (~/.codex)\\n\"\n printf \" - OpenCode (~/.config/opencode)\\n\"\n printf \" - Cursor (~/.cursor)\\n\"\n exit 1\nfi\n\nprint_banner\n\n# Install the official Elestio CLI\ncheck_node\ninstall_cli\nprintf \"\\n\"\n\n# Download skill files\ninfo \"Downloading skill from ${CYAN}$REPO${NC}...\"\ntemp_dir=$(mktemp -d)\ngit clone --depth 1 --quiet \"$REPO\" \"$temp_dir\"\nprintf \"\\n\"\n\nfor target in \"${FOUND[@]}\"; do\n dir=\"${target%%|*}\"\n name=\"${target##*|}\"\n install_skill \"$dir\" \"$name\" \"$temp_dir\"\ndone\n\n# Local installs (skip if CWD is $HOME)\nif [ \"$(pwd)\" != \"$HOME\" ]; then\n declare -a LOCAL_TARGETS=(\n \".claude/skills|Claude Code (local)\"\n \".codex/skills|OpenAI Codex (local)\"\n \".config/opencode/skill|OpenCode (local)\"\n \".cursor/skills|Cursor (local)\"\n )\n for target in \"${LOCAL_TARGETS[@]}\"; do\n dir=\"${target%%|*}\"\n name=\"${target##*|}\"\n parent=\"${dir%/*}\"\n [ -d \"./$parent\" ] && install_skill \"./$dir\" \"$name\" \"$temp_dir\"\n done\nfi\n\nrm -rf \"$temp_dir\"\n\nprintf \"\\n${GREEN}✓ Elestio skill installed successfully!${NC}\\n\"\nprintf \"\\n\"\nwarn \"Restart your tool(s) to load the skill.\"\nprintf \"\\n\"\ninfo \"Re-run anytime to update.\"\nprintf \"\\n\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":3383,"content_sha256":"0871832b91ba61b9218ad84c8a18304c8c57e152991fa7a6f8e6ad39f2fb9ba1"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Elestio Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Version:","type":"text","marks":[{"type":"strong"}]},{"text":" 2.4 ","type":"text"},{"text":"Purpose:","type":"text","marks":[{"type":"strong"}]},{"text":" Deploy and manage services on Elestio DevOps platform ","type":"text"},{"text":"Status:","type":"text","marks":[{"type":"strong"}]},{"text":" Ready to use ","type":"text"},{"text":"Last Updated:","type":"text","marks":[{"type":"strong"}]},{"text":" 2026-09-22","type":"text"}]},{"type":"paragraph","content":[{"text":"Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support.","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill uses the ","type":"text"},{"text":"official Elestio CLI","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"elestio","type":"text","marks":[{"type":"code_inline"}]},{"text":" command, installed via ","type":"text"},{"text":"npm install -g elestio","type":"text","marks":[{"type":"code_inline"}]},{"text":"). When the ","type":"text"},{"text":"Elestio MCP connector","type":"text","marks":[{"type":"strong"}]},{"text":" is available instead (tools such as ","type":"text"},{"text":"deploy_template","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deploy_catalog_pipeline","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"list_clusters","type":"text","marks":[{"type":"code_inline"}]},{"text":"), use its tools: the rules below apply the same way. See \"Using the Elestio MCP connector\" for the tool that matches each command.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use This Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this skill when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User wants to deploy PostgreSQL, MySQL, Redis, MongoDB, Elasticsearch, etc.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User says \"deploy\", \"spin up\", \"create a server\", \"I need a database\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User mentions ANY open-source software (WordPress, Grafana, n8n, Metabase, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User wants to deploy custom code via CI/CD","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User needs to manage backups, firewall, SSL, SSH access","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User asks about service status, costs, or credentials","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Trigger phrases:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Deploy PostgreSQL\" -> ","type":"text"},{"text":"elestio deploy postgresql","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"I need a Redis cache\" -> ","type":"text"},{"text":"elestio deploy redis","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Set up n8n for automation\" -> ","type":"text"},{"text":"elestio deploy n8n","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Deploy my app from GitHub\" -> CI/CD workflow (Phase 4)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"What services are running?\" -> ","type":"text"},{"text":"elestio services","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"How much is this costing?\" -> ","type":"text"},{"text":"elestio billing","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When NOT to Use This Skill","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Initial account setup","type":"text","marks":[{"type":"strong"}]},{"text":" - Signup, payment, approval must be done manually by human","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Interactive SSH sessions","type":"text","marks":[{"type":"strong"}]},{"text":" - Use direct SSH instead","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complex Docker Compose editing","type":"text","marks":[{"type":"strong"}]},{"text":" - SSH into the server directly","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Decision Tree: What Should I Deploy?","type":"text"}]},{"type":"paragraph","content":[{"text":"There are THREE deployment shapes, not two. Choosing wrong is the single most common cause of a failed deployment.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Is the software in the Elestio catalog? (elestio templates search \u003cname>)\n|\n+-- YES\n| |\n| +-- Does the user want a managed, isolated VM? (production databases,\n| | anything needing backups / monitoring / support)\n| | -> MANAGED SERVICE\n| | elestio deploy \u003ctemplate> --project \u003cid>\n| |\n| +-- Does the user want replication / high availability?\n| | -> CLUSTER (19 templates only: elestio clusters templates)\n| | elestio deploy \u003ctemplate> --cluster --nodes \u003cn> --project \u003cid>\n| |\n| +-- Does the user want it cheap, or several apps on one VM?\n| -> PIPELINE FROM CATALOG TEMPLATE\n| elestio cicd deploy-template \u003csoftware> --target \u003cvmID>\n|\n+-- NO, it is the user's own code\n |\n +-- In a Git repo?\n | -> elestio cicd create --auto --target \u003cvmID> --name X --repo owner/repo\n |\n +-- Just a docker-compose file?\n -> elestio cicd create \u003cpipeline.json>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CRITICAL: catalog software in a pipeline","type":"text"}]},{"type":"paragraph","content":[{"text":"To run catalog software (Vaultwarden, Redis, Metabase, ...) on a CI/CD target, you MUST use ","type":"text"},{"text":"elestio cicd deploy-template","type":"text","marks":[{"type":"code_inline"}]},{"text":" (MCP: ","type":"text"},{"text":"deploy_catalog_pipeline","type":"text","marks":[{"type":"code_inline"}]},{"text":"). You must NOT use ","type":"text"},{"text":"elestio cicd create","type":"text","marks":[{"type":"code_inline"}]},{"text":" (MCP: ","type":"text"},{"text":"create_pipeline_docker","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"create_pipeline_auto","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"paragraph","content":[{"text":"cicd create","type":"text","marks":[{"type":"code_inline"}]},{"text":" builds an EMPTY pipeline. It does not know the software's ports, environment variables or install scripts, so the pipeline deploys and nothing runs. This is the most frequently reported failure.","type":"text"}]},{"type":"paragraph","content":[{"text":"deploy-template","type":"text","marks":[{"type":"code_inline"}]},{"text":" reads the template's ","type":"text"},{"text":"elestio.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" (from ","type":"text"},{"text":"github.com/elestio-examples/\u003csoftware>","type":"text","marks":[{"type":"code_inline"}]},{"text":") and configures the pipeline from it.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# RIGHT\nelestio cicd deploy-template vaultwarden --target \u003cvmID>\n\n# WRONG -- produces an empty pipeline\nelestio cicd create --auto --target \u003cvmID> --name vaultwarden --repo elestio-examples/vaultwarden","type":"text"}]},{"type":"paragraph","content":[{"text":"From CLI 1.3.0 this works for the whole catalogue, including software that mounts files from its repo or needs its install scripts (Chromadb, Kafka, ClickHouse, WordPress, n8n...). The pipeline points at the ","type":"text"},{"text":"elestio-examples","type":"text","marks":[{"type":"code_inline"}]},{"text":" repo and ","type":"text"},{"text":"Elestio clones it on the VM itself","type":"text","marks":[{"type":"strong"}]},{"text":", so those files exist and the scripts run. No Git account, nothing copied anywhere.","type":"text"}]},{"type":"paragraph","content":[{"text":"On CLI 1.2.x and earlier, the only route inlined the compose file, and roughly half the catalogue could not work that way. If you are on an older CLI, upgrade (","type":"text"},{"text":"npm install -g elestio@latest","type":"text","marks":[{"type":"code_inline"}]},{"text":") rather than falling back to the dashboard.","type":"text"}]},{"type":"paragraph","content":[{"text":"To check the catalog: elestio templates search \u003csoftware-name> # everything elestio cicd templates \u003csoftware-name> # deployable as a pipeline elestio clusters templates # supports clustering","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Using the Elestio MCP connector","type":"text"}]},{"type":"paragraph","content":[{"text":"When the Elestio MCP tools are available (claude.ai connector, Claude Code MCP server...), use them instead of the CLI. They cover the same operations, and every rule in this skill applies to them. Destructive tools require ","type":"text"},{"text":"\"confirm\": true","type":"text","marks":[{"type":"code_inline"}]},{"text":": ask the user first, exactly as you would before ","type":"text"},{"text":"--force","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Task","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CLI","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MCP tool","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Find software","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio templates search \u003cname>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"search_templates","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deploy a managed service","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio deploy \u003ctemplate>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deploy_template","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deploy a cluster","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio deploy \u003ctemplate> --cluster --nodes N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deploy_template","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"cluster_nodes","type":"text","marks":[{"type":"code_inline"}]},{"text":" (and ","type":"text"},{"text":"cluster_mode","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What can cluster","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters templates","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"list_cluster_templates","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wait for a deployment","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio wait \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"wait_for_deployment","type":"text","marks":[{"type":"code_inline"}]},{"text":" (for a cluster, pass the comma-separated ","type":"text"},{"text":"providerServerID","type":"text","marks":[{"type":"code_inline"}]},{"text":" as-is)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CI/CD target","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio deploy CI-CD-Target","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deploy_cicd_target","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Catalog software in a pipeline","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd deploy-template \u003csoftware> --target \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deploy_catalog_pipeline","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (supports ","type":"text"},{"text":"dry_run","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Your own repo in a pipeline","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd create --auto ...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"create_pipeline_auto","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Your own compose in a pipeline","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd create \u003cpipeline.json>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"create_pipeline_docker","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pipelines on a target","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd pipelines \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"list_pipelines","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Clusters in a project","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"list_clusters","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cluster and its nodes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters info \u003cclusterID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get_cluster","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Promote a replica","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters promote \u003cclusterID> \u003cvmID> --force","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"promote_cluster_node","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Automatic failover on/off","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters failover \u003cclusterID> on|off","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"set_cluster_auto_failover","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rebuild replicas","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters resync \u003cclusterID> --force","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"resync_cluster","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Lock / unlock a cluster","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters lock|unlock \u003cclusterID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"lock_cluster","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"unlock_cluster","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Add a node","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters add-node \u003cclusterID> [--dry-run]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"add_cluster_node","type":"text","marks":[{"type":"code_inline"}]},{"text":" (supports ","type":"text"},{"text":"dry_run","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Remove a node","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters remove-node \u003cclusterID> \u003cvmID> --force","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"remove_cluster_node","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cluster firewall","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters firewall|firewall-restrict|firewall-open \u003cclusterID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get_cluster_firewall","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"set_cluster_port_access","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Delete a cluster","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio clusters delete \u003cclusterID> --force","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delete_cluster","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build history of a pipeline","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd pipeline-history \u003cvmID> \u003cpipelineID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get_pipeline_history","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Delete a pipeline","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd pipeline-delete \u003cvmID> \u003cpipelineID> --force","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delete_pipeline","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Live logs of a service","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio logs \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get_service_logs","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Audit trail of a service","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio audits \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get_service_audits","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"The MCP has no dry run for ","type":"text"},{"text":"deploy_template","type":"text","marks":[{"type":"code_inline"}]},{"text":": before a cluster, state the VM count and monthly cost yourself (","type":"text"},{"text":"list_providers_and_sizes","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"provider","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"region","type":"text","marks":[{"type":"code_inline"}]},{"text":" gives the price per VM) and get the user's go-ahead. Called without a filter, ","type":"text"},{"text":"list_providers_and_sizes","type":"text","marks":[{"type":"code_inline"}]},{"text":" only returns each provider's regions.","type":"text"}]},{"type":"paragraph","content":[{"text":"MCP ","type":"text"},{"text":"provider","type":"text","marks":[{"type":"code_inline"}]},{"text":" values: ","type":"text"},{"text":"netcup","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"hetzner","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"ovh","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aws","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"lightsail","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"azure","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"scaleway","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"linode","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"digitalocean","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"vultr","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"tcloud","type":"text","marks":[{"type":"code_inline"}]},{"text":". Outside netcup and OVH, ","type":"text"},{"text":"deploy_template","type":"text","marks":[{"type":"code_inline"}]},{"text":" needs an explicit ","type":"text"},{"text":"region","type":"text","marks":[{"type":"code_inline"}]},{"text":". ","type":"text"},{"text":"attach_volume","type":"text","marks":[{"type":"code_inline"}]},{"text":" takes ","type":"text"},{"text":"storage_type","type":"text","marks":[{"type":"code_inline"}]},{"text":" (","type":"text"},{"text":"NVME","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"HDD","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup (One-Time -- Human Action Required)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Prerequisites","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create Account:","type":"text","marks":[{"type":"strong"}]},{"text":" https://dash.elest.io/signup","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify Email:","type":"text","marks":[{"type":"strong"}]},{"text":" Check inbox, click verification link","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add Credit Card:","type":"text","marks":[{"type":"strong"}]},{"text":" https://dash.elest.io/account/payment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wait for Approval:","type":"text","marks":[{"type":"strong"}]},{"text":" Usually instant, sometimes 24-48h","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create API Token:","type":"text","marks":[{"type":"strong"}]},{"text":" https://dash.elest.io/account/security -> Manage API Tokens -> Create Token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure skill:","type":"text","marks":[{"type":"strong"}]},{"text":" Give email + API token to agent","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Configure Credentials","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio login --email \"[email protected]\" --token \"xxx_...\"\nelestio auth test","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Verify Setup","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Should show: [SUCCESS] Authenticated as [email protected]\nelestio auth test\n\n# List projects (should show at least one)\nelestio projects","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Start Examples","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy PostgreSQL (2 commands)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Find template ID\nelestio templates search postgresql\n# -> ID: 11, PostgreSQL\n\n# 2. Deploy (uses defaults: netcup/nbg/MEDIUM-2C-4G)\nelestio deploy postgresql --project 112 --name my-db\n# -> Waits for deployment, shows credentials when ready","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy Redis Cache","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio deploy redis --project 112","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy WordPress","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio deploy wordpress --project 112","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy a Cluster (replication / HA)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Check the software supports clustering and see its minimum node count\nelestio clusters templates\n\n# 2. ALWAYS dry-run first: billing is per VM, --nodes 3 bills 3 VMs\nelestio deploy postgresql --cluster --nodes 3 --project 112 --dry-run\n\n# 3. Deploy\nelestio deploy postgresql --cluster --nodes 3 --project 112\n\n# 4. Follow it\nelestio clusters list --project 112\nelestio clusters info \u003cclusterID>","type":"text"}]},{"type":"paragraph","content":[{"text":"Rules:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--nodes","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the TOTAL, primary included. ","type":"text"},{"text":"--nodes 3","type":"text","marks":[{"type":"code_inline"}]},{"text":" = 1 primary + 2 replicas.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ClickHouse, Vault, OpenSearch, RabbitMQ, rke2 and Nats need at least 3 nodes.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Everything else starts at 2. Maximum is 15.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--cluster-mode multi-master","type":"text","marks":[{"type":"code_inline"}]},{"text":" works for MySQL only; all others are ","type":"text"},{"text":"primary-replica","type":"text","marks":[{"type":"code_inline"}]},{"text":" (the default).","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy Catalog Software as a Pipeline (Vaultwarden, Redis, Metabase...)","type":"text"}]},{"type":"paragraph","content":[{"text":"This is the route to use whenever the user wants catalog software on a CI/CD target rather than a dedicated VM.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Create a CI/CD target if none exists (this is a VM; pipelines share it)\nelestio deploy CI-CD-Target --project 112 --name my-target\n# -> note the vmID\n\n# 2. Confirm the software is available as a pipeline template\nelestio cicd templates vaultwarden\n\n# 3. ALWAYS dry-run first: it prints the ports, env vars and lifecycle hooks\n# that will be applied, and creates nothing\nelestio cicd deploy-template vaultwarden --target \u003cvmID> --dry-run\n\n# 4. Deploy (default route: Elestio clones the template repo on the VM)\nelestio cicd deploy-template vaultwarden --target \u003cvmID>","type":"text"}]},{"type":"paragraph","content":[{"text":"On success the CLI prints the software's URL, login and generated password.","type":"text"}]},{"type":"paragraph","content":[{"text":"Three routes. Use the default.","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"repo (default)","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"inline (","type":"text"},{"text":"--inline-compose","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git (","type":"text"},{"text":"--owner \u003cgit-user>","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What the pipeline runs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The ","type":"text"},{"text":"elestio-examples","type":"text","marks":[{"type":"code_inline"}]},{"text":" repo, cloned on the VM by Elestio","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Only the inlined ","type":"text"},{"text":"docker-compose.yml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A copy of the repo in the user's Git account","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Needs a Git account","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Install scripts (pre/postInstall)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Run","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skipped","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Run","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Files the compose mounts or reads (","type":"text"},{"text":"env_file","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Present","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Missing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Present","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Works for","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The whole catalogue","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Templates needing no repo file","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Every template","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"The default route sends ","type":"text"},{"text":"imageData.dockerExample","type":"text","marks":[{"type":"code_inline"}]},{"text":" (the template repo URL), ","type":"text"},{"text":"branch","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"repoName","type":"text","marks":[{"type":"code_inline"}]},{"text":". The backend stores them as the pipeline's ","type":"text"},{"text":"gitConfig.repoURL","type":"text","marks":[{"type":"code_inline"}]},{"text":" and the deployment agent clones that repo with Elestio's own Git token. This is exactly what the dashboard does.","type":"text"}]},{"type":"paragraph","content":[{"text":"--inline-compose","type":"text","marks":[{"type":"code_inline"}]},{"text":" is for a compose file of your own. On that route the CLI refuses templates whose compose mounts or reads a repo file, naming them: the file may ship in the repo (n8n's ","type":"text"},{"text":"./n8n-task-runners.json","type":"text","marks":[{"type":"code_inline"}]},{"text":"), be generated by an install script (Kafka's ","type":"text"},{"text":"./jaas/*.conf","type":"text","marks":[{"type":"code_inline"}]},{"text":"), or be an ","type":"text"},{"text":"env_file","type":"text","marks":[{"type":"code_inline"}]},{"text":". Do not pass ","type":"text"},{"text":"--force","type":"text","marks":[{"type":"code_inline"}]},{"text":" to get past it; use the default route instead.","type":"text"}]},{"type":"paragraph","content":[{"text":"The git route is unavailable","type":"text","marks":[{"type":"strong"}]},{"text":": it needs ","type":"text"},{"text":"POST /api/cicd/createRepoByTemplate","type":"text","marks":[{"type":"code_inline"}]},{"text":", which the Elestio API returns 404 for (the controller exists but is not registered in the backend route whitelist). It is also unnecessary now that the default route exists.","type":"text"}]},{"type":"paragraph","content":[{"text":"ALWAYS verify a deployment instead of assuming it worked:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio cicd pipelines \u003cvmID> # Build column must say \"success\"\nelestio cicd pipeline-history \u003cvmID> \u003cpipelineID> # Status, duration, log file","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy Custom App from GitHub (user's own code)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Deploy CI/CD target\nelestio deploy CI-CD-Target --project 112 --name my-cicd\n\n# 2. Auto-create pipeline\nelestio cicd create --auto --target \u003cvmID> --name my-app --repo owner/repo --mode github --auth-id \u003cauthID>\n# -> Site is live at https://\u003cname>-u\u003cuserID>.vm.elestio.app/","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this ONLY for the user's own repository. For catalog software, use ","type":"text"},{"text":"cicd deploy-template","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead -- see above.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy Custom App (Manual -- Docker mode)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Deploy CI/CD target\nelestio deploy CI-CD-Target --project 112 --name my-cicd\n\n# 2. Add SSH key for agent access\nelestio ssh-keys add \u003cvmID> --name \"agent-key\" --key \"ssh-ed25519 AAAA...\"\n\n# 3. Generate pipeline config\nelestio cicd template docker > pipeline.json\n# Edit pipeline.json with correct CI/CD target info (see JSON reference below)\n\n# 4. Create pipeline\nelestio cicd create pipeline.json\n\n# 5. SSH and configure\nssh root@\u003cipv4>\ncd /opt/app/\u003cpipeline-name>\n# Edit docker-compose.yml, add code, docker-compose up -d","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Pipeline JSON Reference (Docker mode -- ","type":"text"},{"text":"createCiCdExistServer","type":"text","marks":[{"type":"code_inline"}]},{"text":" payload)","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not write this by hand.","type":"text","marks":[{"type":"strong"}]},{"text":" Generate it with ","type":"text"},{"text":"elestio cicd template docker","type":"text","marks":[{"type":"code_inline"}]},{"text":" and replace the ","type":"text"},{"text":"REPLACE","type":"text","marks":[{"type":"code_inline"}]},{"text":" values. The endpoint takes the dashboard's whole form state, and every divergence has produced a 500 or a pipeline that never builds. Current shape (CLI 1.1.0, verified live):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"cluster\": {\n \"isCluster\": false,\n \"createNew\": false,\n \"target\": {\n \"displayName\": \"REPLACE\",\n \"id\": \"REPLACE\",\n \"serverName\": \"REPLACE\",\n \"vmID\": \"REPLACE\",\n \"vmProvider\": \"REPLACE\",\n \"vmRegion\": \"REPLACE\",\n \"levelName\": \"Elestio-services\",\n \"projectID\": \"REPLACE\"\n }\n },\n \"gitData\": {},\n \"imageData\": {\n \"isPrivate\": false,\n \"compose\": \"services:\\n nginx:\\n image: nginx:alpine\\n ports:\\n - \\\"172.17.0.1:3000:80\\\"\\n volumes:\\n - ./html:/usr/share/nginx/html:ro\",\n \"dockerExample\": \"\",\n \"repoName\": \"CustomDocker\"\n },\n \"configData\": {\n \"buildDir\": \"/\",\n \"rootDir\": \"/\",\n \"runTime\": \"NodeJs\",\n \"buildCmd\": \"\",\n \"runCmd\": \"\",\n \"installCmd\": \"\",\n \"framework\": \"NoFramework\",\n \"version\": \"20\"\n },\n \"ports\": [\n {\n \"protocol\": \"HTTPS\",\n \"targetProtocol\": \"HTTP\",\n \"listeningPort\": \"443\",\n \"targetPort\": 3001,\n \"public\": true,\n \"targetIP\": \"172.17.0.1\",\n \"path\": \"/\",\n \"isAuth\": false,\n \"login\": \"\",\n \"password\": \"\",\n \"loginTitle\": \"\"\n }\n ],\n \"variables\": \"\",\n \"isPublicGitRepo\": false,\n \"exposedPorts\": [\n {\n \"protocol\": \"HTTP\",\n \"hostPort\": \"3000\",\n \"containerPort\": \"3000\",\n \"interface\": \"172.17.0.1\"\n }\n ],\n \"gitVolumeConfig\": [\n {}\n ],\n \"isNeedToCreateRepo\": false,\n \"gitUserFormData\": {\n \"selectedUser\": \"\",\n \"searchGitUser\": \"\",\n \"gitOrgsFilteredList\": {\n \"GITHUB\": [],\n \"GITLAB\": []\n },\n \"gitOrgsList\": [],\n \"selectedRepo\": {},\n \"thirdPartyRepoInput\": \"\",\n \"gitScopesUsers\": [],\n \"thirdPartyRepoScopeName\": \"\",\n \"getGitScopeUser\": {\n \"GITHUB\": [],\n \"GITLAB\": []\n },\n \"thirdPartyRepoName\": \"\",\n \"thirdPartyRepoPrivate\": false,\n \"loadSearch\": false\n },\n \"lifeCycleCommand\": {\n \"preInstallCommand\": \"\",\n \"postInstallCommand\": \"\",\n \"preBackupCommand\": \"\",\n \"postBackupCommand\": \"\",\n \"preRestoreCommand\": \"\",\n \"postRestoreCommand\": \"\",\n \"preUpdateCommand\": \"\",\n \"postUpdateCommand\": \"\",\n \"preDeployCommand\": \"\",\n \"postDeployCommand\": \"\"\n },\n \"monoRepoWorkSpaces\": [\n \"\"\n ],\n \"copyCommandConfig\": [],\n \"CICDMode\": \"DockerCompose\",\n \"projectID\": \"REPLACE\",\n \"pipelineName\": \"REPLACE\",\n \"isMovePipeline\": false,\n \"authID\": null\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"cluster.target","type":"text","marks":[{"type":"code_inline"}]},{"text":" values come from ","type":"text"},{"text":"elestio cicd targets","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"id","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the target's ","type":"text"},{"text":"serverID","type":"text","marks":[{"type":"strong"}]},{"text":" (the backend reads it), ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]},{"text":" its vmID.","type":"text"}]},{"type":"paragraph","content":[{"text":"Common payload mistakes to avoid:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Field","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WRONG","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CORRECT","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CICDMode","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"DOCKER\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"DockerCompose\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"configData.runTime","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"runtime","type":"text","marks":[{"type":"code_inline"}]},{"text":" (lowercase t)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"runTime","type":"text","marks":[{"type":"code_inline"}]},{"text":" (capital T)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"configData.framework","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"NoFramework\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"imageData","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{ imageName, imageTag, registryUrl }","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{ isPrivate, compose, dockerExample, repoName }","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gitData","type":"text","marks":[{"type":"code_inline"}]},{"text":" (docker mode)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{ projectName, branch, ... }","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{}","type":"text","marks":[{"type":"code_inline"}]},{"text":" (empty object)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"authID","type":"text","marks":[{"type":"code_inline"}]},{"text":" (docker mode)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"0\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"null","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"isPublicGitRepo","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"false\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" (string)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"false","type":"text","marks":[{"type":"code_inline"}]},{"text":" (boolean)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gitVolumeConfig","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[{}]","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ports[]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{ targetPort, publishedPort, isDefault }","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{ protocol, targetProtocol, listeningPort, targetPort, targetIP, public, path, isAuth, login, password, loginTitle }","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"exposedPorts","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"omitted","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[{ protocol, hostPort, containerPort, interface }]","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"cluster.target","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"only ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"id","type":"text","marks":[{"type":"code_inline"}]},{"text":" (serverID), ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"vmProvider","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"vmRegion","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"levelName","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"projectID","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"displayName","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"serverName","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"nonRepoWorkSpaces","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"present","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"remove -- use ","type":"text"},{"text":"monoRepoWorkSpaces","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"variables","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"omitted or ","type":"text"},{"text":"[]","type":"text","marks":[{"type":"code_inline"}]},{"text":" (array)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"\"KEY=value\\nKEY2=value2\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" (string; backend runs variables.trim())","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"lifeCycleCommand","type":"text","marks":[{"type":"code_inline"}]},{"text":" (compose, no repo)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"hook paths such as ","type":"text"},{"text":"./scripts/preInstall.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"all ","type":"text"},{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":": the agent chmods the paths before docker compose and fails the build","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Command Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Authentication & Configuration","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio login --email X --token Y # Set credentials\nelestio auth test # Verify authentication\nelestio whoami # Show current user\nelestio config # Show current config\nelestio config --set-default-project X # Set default project","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Catalog (No Auth Required)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio templates # List all 400+ templates\nelestio templates search \u003cquery> # Search by name\nelestio templates info \u003cname> # Template details\nelestio categories # List categories\nelestio sizes # All provider/region/size combos\nelestio sizes --provider netcup # Filter by provider\nelestio sizes --provider ovh # OVHcloud: prices already include the launch offer","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Projects","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio projects # List all projects\nelestio projects create \u003cname> # Create project\nelestio projects delete \u003cid> --force # Delete project\nelestio projects members \u003cid> # List members\nelestio projects add-member \u003cid> \u003cemail>\nelestio projects remove-member \u003cid> \u003cmemberId>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Services","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio services # List all services\nelestio services --project 123 # Filter by project\nelestio service \u003cvmID> # Service details\nelestio deploy \u003ctemplate> --project X --name Y\nelestio deploy \u003ctemplate> --cluster --nodes 3 # Cluster (see Clusters below)\nelestio deploy CI-CD-Target --project X # Deploy a CI/CD target VM\nelestio delete-service \u003cvmID> --force\nelestio move-service \u003cvmID> \u003ctargetProjectId>\nelestio wait \u003cvmID> # Wait for deployment","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Power Management","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio reboot \u003cvmID> # Graceful reboot\nelestio reset \u003cvmID> # Hard reset\nelestio shutdown \u003cvmID> # Graceful shutdown\nelestio poweroff \u003cvmID> # Force power off\nelestio poweron \u003cvmID> # Power on\nelestio restart-stack \u003cvmID> # Restart Docker only (fastest)\nelestio lock \u003cvmID> # Enable termination protection\nelestio unlock \u003cvmID> # Disable termination protection\nelestio resize \u003cvmID> --size LARGE-4C-8G # Upgrade/downgrade VM size (OVH: never to a smaller disk)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Firewall","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio firewall get \u003cvmID> # List rules\nelestio firewall enable \u003cvmID> --rules '[{\"type\":\"INPUT\",\"port\":\"22\",\"protocol\":\"tcp\",\"targets\":[\"0.0.0.0/0\"]}]'\nelestio firewall update \u003cvmID> --rules '[...]'\nelestio firewall disable \u003cvmID>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"SSL / Custom Domains","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio ssl list \u003cvmID> # List domains\nelestio ssl add \u003cvmID> \u003cdomain> # Add with auto-SSL\nelestio ssl remove \u003cvmID> \u003cdomain>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"SSH Keys","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio ssh-keys list \u003cvmID> # List keys\nelestio ssh-keys add \u003cvmID> --name \"name\" --key \"ssh-ed25519 AAAA...\"\nelestio ssh-keys remove \u003cvmID> --name \"name\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Note:","type":"text","marks":[{"type":"strong"}]},{"text":" When adding SSH keys, provide only the key type and key data (e.g., ","type":"text"},{"text":"ssh-ed25519 AAAA...","type":"text","marks":[{"type":"code_inline"}]},{"text":"). Do NOT include the comment/email at the end of the key.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Auto-Updates","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio updates system-enable \u003cvmID> --day 0 --hour 5 --security-only\nelestio updates system-disable \u003cvmID>\nelestio updates system-now \u003cvmID> # Run OS update now\nelestio updates app-enable \u003cvmID> --day 0 --hour 3\nelestio updates app-disable \u003cvmID>\nelestio updates app-now \u003cvmID> # Run app update now\nelestio change-version \u003cvmID> \u003cversion> # e.g., PostgreSQL 15","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Alerts","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio alerts get \u003cvmID> # Get current rules\nelestio alerts enable \u003cvmID> --rules '{...}' --cycle 60\nelestio alerts disable \u003cvmID>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Backups","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Local backups (application-level)\nelestio backups local-list \u003cvmID>\nelestio backups local-take \u003cvmID>\nelestio backups local-restore \u003cvmID> /opt/app-backups/backup.zst\nelestio backups local-delete \u003cvmID> /opt/app-backups/backup.zst\n\n# Remote backups (Elestio managed)\nelestio backups remote-list \u003cvmID>\nelestio backups remote-take \u003cvmID>\nelestio backups remote-restore \u003cvmID> \u003cbackup-name>\nelestio backups auto-enable \u003cvmID>\nelestio backups auto-disable \u003cvmID>\n\n# S3 external backups\nelestio s3-backup verify \u003cvmID> --key X --secret Y --bucket Z --endpoint S\nelestio s3-backup enable \u003cvmID> --key X --secret Y --bucket Z --endpoint S\nelestio s3-backup disable \u003cvmID>\nelestio s3-backup take \u003cvmID>\nelestio s3-backup list \u003cvmID>\nelestio s3-backup restore \u003cvmID> \u003cbackup-key>\nelestio s3-backup delete \u003cvmID> \u003cbackup-key>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Snapshots","type":"text"}]},{"type":"paragraph","content":[{"text":"Elestio no longer offers VM snapshots, on any provider (dropped on 2026-08-06): there is no snapshot command in the CLI or tool in the MCP. If a user asks for one, use backups instead (","type":"text"},{"text":"elestio backups remote-take","type":"text","marks":[{"type":"code_inline"}]},{"text":", scheduled with ","type":"text"},{"text":"backups auto-enable","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Access & Credentials","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio credentials \u003cvmID> # App URL + login\nelestio ssh \u003cvmID> # SSH terminal URL\nelestio ssh \u003cvmID> --direct # Direct SSH command\nelestio vscode \u003cvmID> # VSCode web URL\nelestio files \u003cvmID> # File explorer URL\nelestio logs \u003cvmID> # Live app logs (temporary URL); --mode install for the install log\nelestio audits \u003cvmID> [--days 7] # Who did what on the service","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Volumes","type":"text"}]},{"type":"paragraph","content":[{"text":"Note:","type":"text","marks":[{"type":"strong"}]},{"text":" Volume support depends on the cloud provider. Hetzner and OVHcloud support full volume operations. Some providers like netcup have limited or no volume support.","type":"text"}]},{"type":"paragraph","content":[{"text":"--type NVME","type":"text","marks":[{"type":"code_inline"}]},{"text":" (default, high speed) or ","type":"text"},{"text":"--type HDD","type":"text","marks":[{"type":"code_inline"}]},{"text":" (classic, cheaper). On OVH: NVME $0.125/GB/month and HDD $0.075/GB/month during the launch offer (until Jan 1, 2027), then $0.25 and $0.15. HDD exists only on Vultr and OVHcloud, and not in OVH ","type":"text"},{"text":"EU-WEST-PAR","type":"text","marks":[{"type":"code_inline"}]},{"text":" (Paris) or ","type":"text"},{"text":"EU-SOUTH-MIL","type":"text","marks":[{"type":"code_inline"}]},{"text":" (Milan): the CLI refuses it there.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio volumes # List all volumes in project\nelestio volumes create --name X --size 10 [--type NVME|HDD]\nelestio volumes service-list \u003cvmID> # List attached to service\nelestio volumes service-create \u003cvmID> --name X --size 10 [--type NVME|HDD]\nelestio volumes resize \u003cvmID> \u003cvolumeID> --size 20\nelestio volumes detach \u003cvmID> \u003cvolumeID>\nelestio volumes delete \u003cvmID> \u003cvolumeID>\nelestio volumes protect \u003cvmID> \u003cvolumeID>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Clusters","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio clusters templates # Software that supports clustering\nelestio clusters # List clusters in the project\nelestio clusters info \u003cclusterID> # Details + nodes\nelestio clusters nodes \u003cclusterID> # Active nodes only\n\n# Creation goes through deploy, not through clusters\nelestio deploy \u003ctemplate> --cluster --nodes \u003cn> [--cluster-mode multi-master]\n\n# Operations -- all destructive ones require --force\nelestio clusters promote \u003cclusterID> \u003cvmID> --force # Promote a replica\nelestio clusters failover \u003cclusterID> on|off # AUTOMATIC failover switch, does not switch now\nelestio clusters resync \u003cclusterID> --force # ERASES replica data\nelestio clusters lock \u003cclusterID> # Termination protection\nelestio clusters unlock \u003cclusterID>\nelestio clusters delete \u003cclusterID> --force # Deletes ALL nodes (not delete-service)\n\n# Nodes -- dry-run add-node first: billed as one more VM\nelestio clusters add-node \u003cclusterID> --dry-run # Copies the primary: provider, region, size, version\nelestio clusters add-node \u003cclusterID> [--size X] [--region Y]\nelestio clusters remove-node \u003cclusterID> \u003cvmID> --force # Replicas only\n\n# Firewall -- applies to every node; the cluster's own nodes stay allowed\nelestio clusters firewall \u003cclusterID>\nelestio clusters firewall-restrict \u003cclusterID> --port 25432 --ips 203.0.113.7,198.51.100.0/24\nelestio clusters firewall-open \u003cclusterID> --port 25432","type":"text"}]},{"type":"paragraph","content":[{"text":"Constraints (the CLI enforces these before calling the API):","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rule","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Value","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--nodes","type":"text","marks":[{"type":"code_inline"}]},{"text":" counts","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Total nodes, primary included","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minimum, most software","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minimum: ClickHouse, Vault, OpenSearch, RabbitMQ, rke2, Nats","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3 (quorum)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Maximum","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--cluster-mode multi-master","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MySQL only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Billing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Per VM. ","type":"text"},{"text":"--nodes 5","type":"text","marks":[{"type":"code_inline"}]},{"text":" bills 5 VMs.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Switching primary by hand","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"promote","type":"text","marks":[{"type":"code_inline"}]},{"text":", NOT ","type":"text"},{"text":"failover","type":"text","marks":[{"type":"code_inline"}]},{"text":" (which only toggles automatic failover)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Replicas","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Read-only, and no SSL: ","type":"text"},{"text":"sslmode=require","type":"text","marks":[{"type":"code_inline"}]},{"text":" fails on a replica","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"add-node","type":"text","marks":[{"type":"code_inline"}]},{"text":" prerequisites","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Remote backups on the primary (","type":"text"},{"text":"elestio backups auto-enable \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]},{"text":"), primary-replica mode","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"After ","type":"text"},{"text":"add-node","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The VM deploys, then Elestio spends a few minutes making it a replica. The cluster reads ","type":"text"},{"text":"running","type":"text","marks":[{"type":"code_inline"}]},{"text":" meanwhile; wait before other node or firewall changes (the CLI refuses them)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Removing the primary","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not possible: ","type":"text"},{"text":"promote","type":"text","marks":[{"type":"code_inline"}]},{"text":" a replica first, or delete the cluster","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Restricting access","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"clusters firewall-restrict","type":"text","marks":[{"type":"code_inline"}]},{"text":", never ","type":"text"},{"text":"elestio firewall","type":"text","marks":[{"type":"code_inline"}]},{"text":" on one node: it would drift from the others","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"NEVER deploy a cluster without running ","type":"text"},{"text":"--dry-run","type":"text","marks":[{"type":"code_inline"}]},{"text":" first and telling the user the VM count and cost.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CI/CD Pipelines","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# CATALOG SOFTWARE -> always use deploy-template (reads the template elestio.yml)\nelestio cicd templates [query] # Catalog software deployable as a pipeline\nelestio cicd deploy-template \u003csoftware> --target \u003cvmID>\nelestio cicd deploy-template \u003csoftware> --target \u003cvmID> --dry-run\nelestio cicd deploy-template \u003csoftware> --target \u003cvmID> --inline-compose # your own compose only\nelestio cicd deploy-template \u003csoftware> --target \u003cvmID> --owner \u003cgit-user> # git route (currently 404)\n# Options: --name, --branch, --private, --non-org, --auth-id, --git-type,\n# --repo-name, --build-cmd, --run-cmd, --install-cmd, --build-dir\n\nelestio cicd targets # List CI/CD targets\nelestio cicd pipelines \u003cvmID> # List pipelines\nelestio cicd pipeline-info \u003cvmID> \u003cpipelineID>\n\n# USER'S OWN REPO -> create --auto. Never use this for catalog software.\nelestio cicd create --auto --target \u003cvmID> --name my-app --repo owner/repo --mode github\nelestio cicd create --auto --target \u003cvmID> --name my-app --repo owner/repo --mode github --auth-id \u003cid>\n# Modes: github, github-fullstack, gitlab, gitlab-fullstack, docker\n# Optional: --branch, --build-cmd, --run-cmd, --install-cmd, --build-dir, --framework, --node-version\n\n# Manual pipeline creation (from JSON template)\nelestio cicd template docker # Docker Compose (custom, no Git)\nelestio cicd template github # GitHub Static SPA (Vite/React)\nelestio cicd template github-fullstack # GitHub Full Stack (Node.js)\nelestio cicd template gitlab # GitLab Static SPA (Vite/React)\nelestio cicd template gitlab-fullstack # GitLab Full Stack (Node.js)\nelestio cicd create \u003cconfig.json>\n\n# Pipeline actions\nelestio cicd pipeline-restart \u003cvmID> \u003cpipelineID>\nelestio cicd pipeline-stop \u003cvmID> \u003cpipelineID>\nelestio cicd pipeline-logs \u003cvmID> \u003cpipelineID> # Running app logs\nelestio cicd pipeline-log \u003cvmID> --pipeline \u003cid> # Latest build log (URL)\nelestio cicd pipeline-log \u003cvmID> --pipeline \u003cid> --file \u003clogID> # One build, logID from pipeline-history\nelestio cicd pipeline-history \u003cvmID> \u003cpipelineID>\nelestio cicd pipeline-delete \u003cvmID> \u003cpipelineID> --force\n\n# Pipeline domains\nelestio cicd domains \u003cvmID> \u003cpipelineID>\nelestio cicd domain-add \u003cvmID> --pipeline \u003cid> --domain myapp.example.com\nelestio cicd domain-remove \u003cvmID> --pipeline \u003cid> --domain myapp.example.com\n\n# Docker registries\nelestio cicd registries\nelestio cicd registry-add --name X --username U --password P --url URL","type":"text"}]},{"type":"paragraph","content":[{"text":"Auto-create pipeline flow:","type":"text","marks":[{"type":"strong"}]},{"text":" the CLI finds the connected Git account (or uses ","type":"text"},{"text":"--auth-id","type":"text","marks":[{"type":"code_inline"}]},{"text":"), resolves the repo and the CI/CD target, and creates the pipeline through the API. Elestio then clones, builds and starts it; follow the build with ","type":"text"},{"text":"elestio cicd pipelines \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"elestio cicd pipeline-history \u003cvmID> \u003cpipelineID>","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Billing","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio billing # Total costs\nelestio billing project \u003cid> # Per-service breakdown","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"MANDATORY: Interactive Deployment Procedure","type":"text"}]},{"type":"paragraph","content":[{"text":"CRITICAL:","type":"text","marks":[{"type":"strong"}]},{"text":" When deploying ANY service, you MUST ask the user for each required parameter one by one using ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":". NEVER deploy with default values without explicit user confirmation.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Required Parameters (ask in this order):","type":"text"}]},{"type":"paragraph","content":[{"text":"1. Provider","type":"text","marks":[{"type":"strong"}]},{"text":" -- Ask using ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Netcup (Recommended) -- Best price/performance ratio, EU-based, reliable","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hetzner -- Best features: full volume & power management support","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OVHcloud -- European provider, 35 regions worldwide, unlimited bandwidth, 50% off every resource until Jan 1, 2027","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AWS -- Amazon Web Services, global reach","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Azure -- Microsoft cloud","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"2. Region","type":"text","marks":[{"type":"strong"}]},{"text":" -- Ask using ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":", based on selected provider:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Netcup: nbg (Europe - Germany, Nuremberg) | mns (North America - United States, Manassas)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hetzner: fsn1 (Falkenstein, DE), nbg1 (Nuremberg, DE), hel1 (Helsinki, FI), ash (Ashburn, US)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OVHcloud: DE1 (Frankfurt, DE), GRA11 (Gravelines, FR), UK1 (London, UK), BHS5 (Beauharnois, CA), SGP1 (Singapore). Region codes are uppercase; Local Zones (","type":"text"},{"text":"*-LZ-*","type":"text","marks":[{"type":"code_inline"}]},{"text":") offer fewer sizes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AWS: us-east-1, eu-west-1, ap-southeast-1, etc.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Azure: germanywestcentral, eastus, westeurope, etc.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"elestio sizes --provider \u003cprovider>","type":"text","marks":[{"type":"code_inline"}]},{"text":" to get exact available regions if needed.","type":"text"}]},{"type":"paragraph","content":[{"text":"3. Service Plan (Size)","type":"text","marks":[{"type":"strong"}]},{"text":" -- Ask using ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":", propose available sizes with pricing:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SMALL-1C-1G -- 1 core, 1GB RAM (~$11/mo, Linode)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MEDIUM-2C-4G -- 2 cores, 4GB RAM (~$16/mo, Netcup DE)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"LARGE-4C-8G -- 4 cores, 8GB RAM (~$30/mo, Netcup DE)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"XL-8C-16G -- 8 cores, 16GB RAM (~$55/mo, Netcup DE)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"elestio sizes --provider \u003cprovider>","type":"text","marks":[{"type":"code_inline"}]},{"text":" to get exact sizes/pricing for the chosen provider.","type":"text"}]},{"type":"paragraph","content":[{"text":"OVHcloud pricing:","type":"text","marks":[{"type":"strong"}]},{"text":" every OVH resource is 50% off until Jan 1, 2027 (launch offer): services, CI/CD targets, load balancers and volumes. Support plans are not discounted. Volumes: NVME (high speed) $0.25/GB/month, $0.125 during the offer; HDD (classic) $0.15/GB/month, $0.075 during the offer. ","type":"text"},{"text":"elestio sizes","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deploy --dry-run","type":"text","marks":[{"type":"code_inline"}]},{"text":" and the MCP's ","type":"text"},{"text":"list_providers_and_sizes","type":"text","marks":[{"type":"code_inline"}]},{"text":" already show the discounted price (","type":"text"},{"text":"listPricePerHour","type":"text","marks":[{"type":"code_inline"}]},{"text":" keeps the list price), so quote that one, and say it is a launch offer. Cheapest OVH plan: SMALL-1C-2G-D2, about $10/mo during the offer ($21/mo list).","type":"text"}]},{"type":"paragraph","content":[{"text":"4. Name of Service","type":"text","marks":[{"type":"strong"}]},{"text":" -- Do NOT use ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":". Simply ask the user in plain text to provide a name, suggesting a default based on the service type (e.g., \"prod-postgres\", \"staging-redis\"). Wait for user text input.","type":"text"}]},{"type":"paragraph","content":[{"text":"5. Admin Email","type":"text","marks":[{"type":"strong"}]},{"text":" -- Ask using ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":", propose the employer's email as default. Let the user confirm or change.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example Flow:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"User: \"Deploy PostgreSQL\"\nAgent: [AskUserQuestion] Which cloud provider? (Netcup recommended, Hetzner, OVHcloud, AWS, Azure)\nUser: \"Netcup\"\nAgent: [AskUserQuestion] Which region? (nbg Europe-Germany, mns North America-US)\nUser: \"nbg\"\nAgent: [AskUserQuestion] Which service plan? (SMALL ~$11/mo, MEDIUM ~$16/mo, LARGE ~$30/mo, XL ~$55/mo)\nUser: \"MEDIUM\"\nAgent: \"What name do you want for this service? Suggestion: prod-postgresql\"\nUser: \"demo-postgres\"\nAgent: [AskUserQuestion] Admin email? (Suggested: [email protected])\nUser: confirms\nAgent: Deploys with all confirmed parameters","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Golden Rules","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Always authenticate first","type":"text","marks":[{"type":"strong"}]},{"text":" -- Every session starts with valid JWT","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"vmID != serverID","type":"text","marks":[{"type":"strong"}]},{"text":" -- Most endpoints use ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]},{"text":", backup/notes use ","type":"text"},{"text":"serverID","type":"text","marks":[{"type":"code_inline"}]},{"text":" (both from ","type":"text"},{"text":"elestio services","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check deployment status","type":"text","marks":[{"type":"strong"}]},{"text":" -- After deploy, wait for ","type":"text"},{"text":"deploymentStatus = \"Deployed\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" before accessing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never delete without confirmation","type":"text","marks":[{"type":"strong"}]},{"text":" -- Always require ","type":"text"},{"text":"--force","type":"text","marks":[{"type":"code_inline"}]},{"text":" flag","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use catalog when possible","type":"text","marks":[{"type":"strong"}]},{"text":" -- Phase 3 (catalog) is simpler than Phase 4 (CI/CD) 5b. ","type":"text"},{"text":"Catalog software in a pipeline -> ","type":"text","marks":[{"type":"strong"}]},{"text":"cicd deploy-template","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (MCP: ","type":"text","marks":[{"type":"strong"}]},{"text":"deploy_catalog_pipeline","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"), NEVER ","type":"text","marks":[{"type":"strong"}]},{"text":"cicd create","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (MCP: ","type":"text","marks":[{"type":"strong"}]},{"text":"create_pipeline_docker","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" / ","type":"text","marks":[{"type":"strong"}]},{"text":"create_pipeline_auto","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":")","type":"text","marks":[{"type":"strong"}]},{"text":" -- those cannot know the software's ports, env vars or install scripts, so they produce a pipeline that deploys and runs nothing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate combos","type":"text","marks":[{"type":"strong"}]},{"text":" -- Provider + datacenter + serverType must match ","type":"text"},{"text":"elestio sizes","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Account must be approved","type":"text","marks":[{"type":"strong"}]},{"text":" -- New accounts need credit card + approval before deploying","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ALWAYS follow the Interactive Deployment Procedure above","type":"text","marks":[{"type":"strong"}]},{"text":" -- Never skip parameter questions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set default project","type":"text","marks":[{"type":"strong"}]},{"text":" -- Use ","type":"text"},{"text":"elestio config --set-default-project \u003cid>","type":"text","marks":[{"type":"code_inline"}]},{"text":" to avoid passing ","type":"text"},{"text":"--project","type":"text","marks":[{"type":"code_inline"}]},{"text":" every time","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Service belongs to project","type":"text","marks":[{"type":"strong"}]},{"text":" -- When using ","type":"text"},{"text":"elestio service \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ensure the vmID belongs to the current default project or specify ","type":"text"},{"text":"--project","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dry-run anything that multiplies VMs","type":"text","marks":[{"type":"strong"}]},{"text":" -- Always run ","type":"text"},{"text":"--dry-run","type":"text","marks":[{"type":"code_inline"}]},{"text":" before a cluster deploy and tell the user the VM count and monthly cost; clusters bill per VM","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--nodes","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" is the total","type":"text","marks":[{"type":"strong"}]},{"text":" -- ","type":"text"},{"text":"--nodes 3","type":"text","marks":[{"type":"code_inline"}]},{"text":" is 1 primary + 2 replicas and bills 3 VMs, not 4","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Defaults","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Setting","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Override","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Provider","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"netcup","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--provider hetzner","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"--provider ovh","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Datacenter","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"nbg (Germany) for netcup, DE1 (Frankfurt) for OVH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--region fsn1","type":"text","marks":[{"type":"code_inline"}]},{"text":" -- required for any other provider","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Server Size","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM-2C-4G","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--size LARGE-4C-8G","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Support","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"level1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--support level2","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Why netcup?","type":"text","marks":[{"type":"strong"}]},{"text":" Best price/performance ratio. EU-based. Reliable.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Provider Limitations","type":"text"}]},{"type":"paragraph","content":[{"text":"Not all cloud providers support all features. Use ","type":"text"},{"text":"--provider","type":"text","marks":[{"type":"code_inline"}]},{"text":" to switch.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"netcup","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Hetzner","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OVHcloud","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AWS","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Azure","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Scaleway","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Catalog deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CI/CD deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Volumes","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"no","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes (NVME, HDD; no HDD in Paris/Milan)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Power actions","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"limited","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Firewall","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SSL/Domains","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Size downgrade","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"no","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes, equal or larger disk only","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bandwidth","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"unlimited","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]}]},{"type":"paragraph","content":[{"text":"There is no GCP provider on Elestio.","type":"text"}]},{"type":"paragraph","content":[{"text":"OVHcloud IPs are static:","type":"text","marks":[{"type":"strong"}]},{"text":" a service keeps the same public IPv4 and IPv6 for its whole life, resizes included, so DNS records and firewall allowlists pointing at it never need updating.","type":"text"}]},{"type":"paragraph","content":[{"text":"Size downgrade support:","type":"text","marks":[{"type":"strong"}]},{"text":" Only ","type":"text"},{"text":"Netcup, AWS, Azure, Scaleway and OVHcloud","type":"text","marks":[{"type":"strong"}]},{"text":" support downgrading instance sizes. Other providers (Hetzner, etc.) only support upgrades. Attempting a downgrade on an unsupported provider can block the service and require Elestio support intervention. The CLI will automatically block downgrade attempts on unsupported providers.","type":"text"}]},{"type":"paragraph","content":[{"text":"OVHcloud never shrinks the disk","type":"text","marks":[{"type":"strong"}]},{"text":", in either direction: a plan with a smaller disk is refused even when CPU and RAM stay the same (","type":"text"},{"text":"LARGE-4C-8G","type":"text","marks":[{"type":"code_inline"}]},{"text":" 100 GB -> ","type":"text"},{"text":"LARGE-4C-8G-D2","type":"text","marks":[{"type":"code_inline"}]},{"text":" 50 GB). Pick a target whose ","type":"text"},{"text":"storageGB","type":"text","marks":[{"type":"code_inline"}]},{"text":" (in ","type":"text"},{"text":"elestio sizes --provider ovh --json","type":"text","marks":[{"type":"code_inline"}]},{"text":") is at least the current one.","type":"text"}]},{"type":"paragraph","content":[{"text":"Recommendation:","type":"text","marks":[{"type":"strong"}]},{"text":" Use ","type":"text"},{"text":"Hetzner","type":"text","marks":[{"type":"strong"}]},{"text":" if you need volumes or full power management. Use ","type":"text"},{"text":"netcup","type":"text","marks":[{"type":"strong"}]},{"text":" for best value when basic features suffice. Use ","type":"text"},{"text":"OVHcloud","type":"text","marks":[{"type":"strong"}]},{"text":" for a European provider with many regions, unlimited bandwidth and the launch offer. Use ","type":"text"},{"text":"netcup, AWS, Azure, Scaleway or OVHcloud","type":"text","marks":[{"type":"strong"}]},{"text":" if you need the flexibility to downgrade instance sizes.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Rate Limiting (read before any loop)","type":"text"}]},{"type":"paragraph","content":[{"text":"The API throttles bursts, then answers ","type":"text"},{"text":"Access temporarily restricted","type":"text","marks":[{"type":"code_inline"}]},{"text":" on every endpoint for several minutes -- authentication included, so it looks like a credentials problem and is not.","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never fan out.","type":"text","marks":[{"type":"strong"}]},{"text":" Looping over services, projects or the 420-template catalogue must be sequential, with roughly a second between calls. A parallel sweep got an account restricted for more than half an hour.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Stop on it, do not retry in a loop","type":"text","marks":[{"type":"strong"}]},{"text":": retrying adds requests to an account that is already being throttled.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never treat it as an empty result.","type":"text","marks":[{"type":"strong"}]},{"text":" A script that reads it as \"this template has no config\" reports success while having learned nothing.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tell the user to wait a few minutes, then resume where you stopped.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"The CLI (>= 1.2.3) and the MCP connector both report this explicitly.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Error Handling","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Error","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cause","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Solution","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Not configured\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Missing credentials","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio login --email X --token Y","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Authentication failed\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wrong credentials or expired token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Re-create API token in dashboard","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Account not approved\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"New account without approval","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wait for approval or contact [email protected]","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Template not found\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wrong name/ID","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"elestio templates search \u003cname>","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Invalid serverType\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Provider/region/size combo doesn't exist","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check ","type":"text"},{"text":"elestio sizes --provider X","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--region is required for \u003cprovider>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No default region outside netcup and OVH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pass ","type":"text"},{"text":"--region","type":"text","marks":[{"type":"code_inline"}]},{"text":", from ","type":"text"},{"text":"elestio sizes --provider X","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OVH cannot shrink the disk (X GB -> Y GB)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OVH resize to a plan with a smaller disk","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Choose a plan with an equal or larger disk","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HDD (classic) volumes are not available in ...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HDD volume in OVH Paris or Milan","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"--type NVME","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Service not found\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wrong vmID or project","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check ","type":"text"},{"text":"elestio services --project X","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Deployment timeout\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Taking too long","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check dashboard, contact support if > 10 min","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Project not found\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wrong projectId","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check ","type":"text"},{"text":"elestio projects","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Composability: What to Do After...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"After Deploying a Service","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Get credentials:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio credentials \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify running:","type":"text","marks":[{"type":"strong"}]},{"text":" Open the URL, confirm service works","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enable backups:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio backups auto-enable \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add custom domain:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio ssl add \u003cvmID> myapp.example.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure firewall:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio firewall enable \u003cvmID> --rules [...]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enable auto-updates:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio updates system-enable \u003cvmID> --security-only","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"After Creating CI/CD Target","type":"text"}]},{"type":"paragraph","content":[{"text":"Catalog software (Vaultwarden, Redis, Metabase...) -- use this:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check it is available:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd templates \u003csoftware>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preview:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd deploy-template \u003csoftware> --target \u003cvmID> --no-git --dry-run","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Deploy:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd deploy-template \u003csoftware> --target \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report the printed URL, login and password to the user","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add a domain:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd domain-add \u003cvmID> --pipeline \u003cpipelineID> --domain myapp.example.com","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"User's own repo:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Auto-create pipeline:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd create --auto --target \u003cvmID> --name my-app --repo owner/repo --mode github --auth-id \u003cid>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Follow the build: ","type":"text"},{"text":"elestio cicd pipelines \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]},{"text":" (Build column must say \"success\")","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Manual docker-compose:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add SSH key:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio ssh-keys add \u003cvmID> --name \"name\" --key \"key\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create pipeline:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd create pipeline.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SSH and configure:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"ssh root@\u003cipv4>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add domain:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio cicd domain-add \u003cvmID> --pipeline \u003cpipelineID> --domain myapp.example.com","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"After an Error","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-authenticate:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio auth test","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check status:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio service \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"View logs:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio logs \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]},{"text":" (service) or ","type":"text"},{"text":"elestio cicd pipeline-logs \u003cvmID> \u003cpipelineID>","type":"text","marks":[{"type":"code_inline"}]},{"text":" (pipeline) 3b. ","type":"text"},{"text":"See what changed:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio audits \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Restart stack:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"elestio restart-stack \u003cvmID>","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Troubleshooting","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"\"Authentication failed\" repeatedly","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. Verify current config\nelestio config\n\n# 2. Re-configure with fresh token from dashboard\nelestio login --email \"...\" --token \"...\"\n\n# 3. Test\nelestio auth test","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Service stuck in \"Deploying\"","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Normal deployment takes 2-5 minutes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If > 10 minutes, check Elestio dashboard for errors","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contact [email protected] if still stuck","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"\"Service not found\" but it exists","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Make sure you're using ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]},{"text":", not ","type":"text"},{"text":"serverID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check the correct project: ","type":"text"},{"text":"elestio services --project X","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"vmID looks like: ","type":"text"},{"text":"12345678","type":"text","marks":[{"type":"code_inline"}]},{"text":" (numeric)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pipeline deployed but the software is not running (MOST COMMON)","type":"text"}]},{"type":"paragraph","content":[{"text":"Almost always: the pipeline was created with ","type":"text"},{"text":"cicd create","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead of ","type":"text"},{"text":"cicd deploy-template","type":"text","marks":[{"type":"code_inline"}]},{"text":", so it has no ports, no environment variables and no install scripts.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Confirm: a pipeline built correctly has env vars\nelestio cicd pipeline-info \u003cvmID> \u003cpipelineID>\n\n# Fix: delete it and redeploy through deploy-template\nelestio cicd pipeline-delete \u003cvmID> \u003cpipelineID> --force\nelestio cicd deploy-template \u003csoftware> --target \u003cvmID>","type":"text"}]},{"type":"paragraph","content":[{"text":"With the MCP connector the cause is the same: the pipeline was made with ","type":"text"},{"text":"create_pipeline_docker","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"create_pipeline_auto","type":"text","marks":[{"type":"code_inline"}]},{"text":". Redeploy it with ","type":"text"},{"text":"deploy_catalog_pipeline","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Software starts then exits immediately","type":"text"}]},{"type":"paragraph","content":[{"text":"With CLI 1.3.0 the default route clones the template repo on the VM, so the install scripts run and the files the compose mounts are present. If the software still fails:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"elestio cicd pipeline-history \u003cvmID> \u003cpipelineID> # did the build fail?\nelestio cicd pipeline-log \u003cvmID> --pipeline \u003cid> # the build log","type":"text"}]},{"type":"paragraph","content":[{"text":"Two causes worth checking first:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"the pipeline was created with ","type":"text"},{"text":"cicd create","type":"text","marks":[{"type":"code_inline"}]},{"text":" (empty pipeline) instead of ","type":"text"},{"text":"cicd deploy-template","type":"text","marks":[{"type":"code_inline"}]},{"text":";","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"the pipeline was created with ","type":"text"},{"text":"--inline-compose","type":"text","marks":[{"type":"code_inline"}]},{"text":", which skips the install scripts and the repo's files. Delete it and redeploy on the default route.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"\"No elestio.yml found at ...\"","type":"text"}]},{"type":"paragraph","content":[{"text":"That software has no pipeline template and cannot be deployed as a pipeline. Deploy it as a managed service instead: ","type":"text"},{"text":"elestio deploy \u003ctemplate>","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pipeline not working (general)","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SSH into CI/CD target: ","type":"text"},{"text":"ssh root@\u003cipv4>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check logs: ","type":"text"},{"text":"cd /opt/app/\u003cpipeline-name> && docker-compose logs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify docker-compose.yml syntax","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check port mapping: ","type":"text"},{"text":"172.17.0.1:3000","type":"text","marks":[{"type":"code_inline"}]},{"text":" (internal network)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Cluster errors","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Message","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cause","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"does not support clustering","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not one of the clusterable templates -- run ","type":"text"},{"text":"elestio clusters templates","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"needs at least 3 nodes","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quorum software (ClickHouse, Vault, OpenSearch, RabbitMQ, rke2, Nats)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"does not support multi-master","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--cluster-mode multi-master","type":"text","marks":[{"type":"code_inline"}]},{"text":" works for MySQL only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"cannot exceed 15 nodes","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Hard platform cap","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"remote backups are off","type":"text","marks":[{"type":"code_inline"}]},{"text":" (add-node)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"New nodes are seeded from the primary's remote backup: ","type":"text"},{"text":"elestio backups auto-enable \u003cprimary vmID>","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"is busy (add-node)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A node is still being configured; wait a few minutes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"is the primary","type":"text","marks":[{"type":"code_inline"}]},{"text":" (remove-node)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Promote a replica first, or delete the whole cluster","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"\"variables.trim is not a function\" (500 Pipeline.CreateFailed)","type":"text"}]},{"type":"paragraph","content":[{"text":"The ","type":"text"},{"text":"variables","type":"text","marks":[{"type":"code_inline"}]},{"text":" field in the pipeline payload must be a ","type":"text"},{"text":"string","type":"text","marks":[{"type":"strong"}]},{"text":", never an array or omitted. The backend runs ","type":"text"},{"text":"variables.trim()","type":"text","marks":[{"type":"code_inline"}]},{"text":" on it, so any other type throws before your build/run/framework settings are even read (it fails even with minimal parameters).","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Correct: ","type":"text"},{"text":"\"variables\": \"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" (no env vars) or ","type":"text"},{"text":"\"variables\": \"KEY=value\\nKEY2=value2\"","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wrong: ","type":"text"},{"text":"\"variables\": []","type":"text","marks":[{"type":"code_inline"}]},{"text":" or leaving the field out entirely.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"The CLI enforces this from 1.1.0 and the MCP connector sends it correctly. If you hit it with the CLI, upgrade: ","type":"text"},{"text":"npm install -g elestio@latest","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"ID Reference (Critical)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Term","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Find it in","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use in","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio services","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".vmID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Most endpoints (actions, firewall, ssl, etc.)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"serverID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio services","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Backup endpoints, notes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"projectID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio projects","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".projectID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Almost everything","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"templateID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio templates","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio deploy","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"pipelineID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio cicd pipelines","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".pipelineID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CI/CD actions","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"volumeID","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"elestio volumes","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> ","type":"text"},{"text":".id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Volume actions","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Common mistake:","type":"text","marks":[{"type":"strong"}]},{"text":" Using ","type":"text"},{"text":"serverID","type":"text","marks":[{"type":"code_inline"}]},{"text":" where ","type":"text"},{"text":"vmID","type":"text","marks":[{"type":"code_inline"}]},{"text":" is expected (or vice versa). They are different numbers for the same service.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"VM Architecture","type":"text"}]},{"type":"paragraph","content":[{"text":"Every Elestio service runs on a dedicated VM:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/opt/elestio/nginx/ \u003c- Reverse proxy (auto-configured, don't modify)\n/opt/app/ \u003c- Your application\n +-- docker-compose.yml \u003c- For catalog services\n +-- \u003cpipeline_name>/ \u003c- For CI/CD pipelines","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reverse proxy handles HTTPS termination automatically","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SSL certificates are auto-generated via Let's Encrypt","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Port ","type":"text"},{"text":"172.17.0.1:XXXX","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the internal Docker network interface","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Support Tiers","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Plan","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Price","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Response Time","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"level1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Included","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"48h (email)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"level2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"+$50/svc/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"24h (priority)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"level3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"+$200/svc/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4h (dedicated engineer)","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Links","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dashboard:","type":"text","marks":[{"type":"strong"}]},{"text":" https://dash.elest.io","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"API Docs:","type":"text","marks":[{"type":"strong"}]},{"text":" https://api-doc.elest.io","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Support:","type":"text","marks":[{"type":"strong"}]},{"text":" [email protected]","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Templates:","type":"text","marks":[{"type":"strong"}]},{"text":" 400+ at https://elest.io/open-source","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CLI:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"npm install -g elestio","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},"metadata":{"date":"2026-11-02","name":"elestio","author":"@skillopedia","source":{"stars":1,"repo_name":"elestio-skill","origin_url":"https://github.com/elestio/elestio-skill/blob/HEAD/SKILL.md","repo_owner":"elestio","body_sha256":"e30ba4f4a4da90f0dc5c8fbdfb46ce54306d6810cd573364a9c3ded58c19b669","cluster_key":"ba7a4b9a2ffd27b9350920e3331d0e05b268b74383c049f7ee157098e6abf1f5","clean_bundle":{"format":"clean-skill-bundle-v1","source":"elestio/elestio-skill/SKILL.md","text_bytes":3383,"source_commit":"c7bcb387b457a4b5c7bebfd745b6cff5d3b29379","skills_sh_rank":3109,"attachment_count":1,"text_attachments":1,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"devops-infrastructure","category_label":"DevOps"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"devops-infrastructure","metadata":{"author":"getateam","version":"2.4"},"import_tag":"skills-sh-top20k-2026-11","description":"Deploy and manage services on the Elestio DevOps platform. Use when the user wants to deploy apps, databases, or infrastructure on Elestio, manage projects, services, clusters, CI/CD pipelines, backups, domains, firewall, volumes, or billing. Covers 400+ open-source templates across 10 cloud providers, database clustering, and deploying catalog software as CI/CD pipelines.","compatibility":"Requires an Elestio account with an API token, and either the official Elestio CLI >= 1.4.0 (Node.js >= 18, npm install -g elestio) or the Elestio MCP connector"}},"renderedAt":1793661622426}

Elestio Skill Version: 2.4 Purpose: Deploy and manage services on Elestio DevOps platform Status: Ready to use Last Updated: 2026-09-22 Elestio is a fully managed DevOps platform. Dedicated VMs (not shared Kubernetes). 400+ open-source templates, 10 cloud providers, 100+ regions. Handles deployment, security, updates, backups, monitoring, support. This skill uses the official Elestio CLI ( command, installed via ). When the Elestio MCP connector is available instead (tools such as , , ), use its tools: the rules below apply the same way. See "Using the Elestio MCP connector" for the tool that…