ProxmoxVED/docs/misc/api.func/API_FLOWCHART.md
CanbiZ (MickLesk) 820d4551a1 Replace Go API with PocketBase; update docs
Remove the old Go/Mongo API (api/main.go, go.mod, go.sum, .env.example) and switch telemetry backend to PocketBase (http://db.community-scripts.org). Update documentation and flowcharts to reflect the PocketBase collection (_dev_telemetry_data), new REST endpoints (POST/PATCH/GET), field schema, and revised api.func integration (LXC/VM reporting and status updates). Misc scripts and helpers were adjusted (misc/api.func, misc/build.func, misc/error_handler.func) and a new misc/ingest.go was added. This consolidates telemetry to a hosted PocketBase instance and updates docs and integration points accordingly.
2026-02-09 15:34:17 +01:00

35 KiB
Raw Blame History

api.func Execution Flowchart

Overview

This document illustrates the execution flow of api.func functions. The backend is PocketBase at http://db.community-scripts.org, collection _dev_telemetry_data.

Main API Communication Flow

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        API Communication Initialization                        │
│  Entry point when api.func functions are called by installation scripts        │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Prerequisites Check                                     │
│                                                                                │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                    Prerequisites Validation                            │    │
│  │                                                                       │    │
│  │  ┌─────────────────┐    ┌─────────────────┐    ┌──────────────────┐   │    │
│  │  │   Check curl    │    │   Check         │    │   Check          │   │    │
│  │  │   Availability  │    │   DIAGNOSTICS   │    │   RANDOM_UUID    │   │    │
│  │  │                 │    │                 │    │                  │   │    │
│  │  │ • command -v    │    │ • Must be "yes" │    │ • Must not be    │   │    │
│  │  │   curl          │    │ • Return if     │    │   empty          │   │    │
│  │  │ • Return if     │    │   "no" or unset │    │ • Return if      │   │    │
│  │  │   not found     │    │                 │    │   not set        │   │    │
│  │  └─────────────────┘    └─────────────────┘    └──────────────────┘   │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Data Collection                                         │
│                                                                                │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                    System Information Gathering                        │    │
│  │                                                                       │    │
│  │  ┌─────────────────┐    ┌─────────────────┐    ┌──────────────────┐   │    │
│  │  │   Get PVE       │    │   Collect Env   │    │   Build JSON     │   │    │
│  │  │   Version       │    │   Variables     │    │   Payload        │   │    │
│  │  │                 │    │                 │    │                  │   │    │
│  │  │ • pveversion    │    │ • CT_TYPE       │    │ • Heredoc JSON   │   │    │
│  │  │   command       │    │ • DISK_SIZE     │    │ • Include all    │   │    │
│  │  │ • Parse version │    │ • CORE_COUNT    │    │   fields         │   │    │
│  │  │ • Fallback:     │    │ • RAM_SIZE      │    │ • status =       │   │    │
│  │  │   "not found"   │    │ • var_os        │    │   "installing"   │   │    │
│  │  │                 │    │ • NSAPP, METHOD │    │                  │   │    │
│  │  └─────────────────┘    └─────────────────┘    └──────────────────┘   │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        PocketBase API Request                                  │
│                                                                                │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                    HTTP Request Processing                             │    │
│  │                                                                       │    │
│  │  ┌─────────────────┐    ┌─────────────────┐    ┌──────────────────┐   │    │
│  │  │   Prepare       │    │   Execute       │    │   Handle         │   │    │
│  │  │   Request       │    │   HTTP POST     │    │   Response       │   │    │
│  │  │                 │    │                 │    │                  │   │    │
│  │  │ • URL:          │    │ • curl -s -w    │    │ • Check HTTP     │   │    │
│  │  │   PB_API_URL    │    │   "%{http_code}"│    │   200/201        │   │    │
│  │  │ • Method: POST  │    │ • -X POST       │    │ • Extract "id"   │   │    │
│  │  │ • Content-Type: │    │ • -L (follow    │    │   from response  │   │    │
│  │  │   application/  │    │   redirects)    │    │ • Store in       │   │    │
│  │  │   json          │    │ • JSON body     │    │   PB_RECORD_ID   │   │    │
│  │  └─────────────────┘    └─────────────────┘    └──────────────────┘   │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────────┘

LXC API Reporting Flow — post_to_api()

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        post_to_api() Flow                                      │
│  POST → Create LXC telemetry record in PocketBase                             │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  Prerequisites: curl? ──► DIAGNOSTICS="yes"? ──► RANDOM_UUID set?             │
│  (return silently on any failure)                                              │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        LXC Data Preparation                                    │
│                                                                                │
│  ┌─────────────────┐    ┌─────────────────────┐    ┌───────────────────┐       │
│  │  Set LXC type   │    │  Collect variables  │    │  Set initial      │       │
│  │                 │    │                     │    │  status           │       │
│  │ • ct_type: 1    │    │ • DISK_SIZE         │    │                   │       │
│  │ • type: "lxc"   │    │ • CORE_COUNT        │    │ • status:         │       │
│  │                 │    │ • RAM_SIZE           │    │   "installing"    │       │
│  │                 │    │ • var_os, var_version│    │ • random_id:      │       │
│  │                 │    │ • NSAPP, METHOD      │    │   RANDOM_UUID     │       │
│  │                 │    │ • pve_version        │    │                   │       │
│  └─────────────────┘    └─────────────────────┘    └───────────────────┘       │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  POST → PB_API_URL                                                             │
│  http://db.community-scripts.org/api/collections/_dev_telemetry_data/records   │
│                                                                                │
│  Response (HTTP 200/201):                                                      │
│    { "id": "abc123def456789", ... }                                            │
│              │                                                                 │
│              └──► PB_RECORD_ID = "abc123def456789"                             │
└─────────────────────────────────────────────────────────────────────────────────┘

VM API Reporting Flow — post_to_api_vm()

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        post_to_api_vm() Flow                                   │
│  POST → Create VM telemetry record in PocketBase                              │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  Read /usr/local/community-scripts/diagnostics                                 │
│  Extract DIAGNOSTICS=yes/no from file                                          │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  Prerequisites: curl? ──► DIAGNOSTICS="yes"? ──► RANDOM_UUID set?             │
│  (return silently on any failure)                                              │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        VM Data Preparation                                     │
│                                                                                │
│  ┌─────────────────┐    ┌─────────────────────┐    ┌───────────────────┐       │
│  │  Set VM type    │    │  Process disk size  │    │  Set initial      │       │
│  │                 │    │                     │    │  status           │       │
│  │ • ct_type: 2    │    │ • Strip 'G' suffix  │    │                   │       │
│  │ • type: "vm"    │    │   "20G" → 20        │    │ • status:         │       │
│  │                 │    │ • Store in           │    │   "installing"    │       │
│  │                 │    │   DISK_SIZE_API      │    │ • random_id:      │       │
│  │                 │    │                     │    │   RANDOM_UUID     │       │
│  └─────────────────┘    └─────────────────────┘    └───────────────────┘       │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  POST → PB_API_URL                                                             │
│  http://db.community-scripts.org/api/collections/_dev_telemetry_data/records   │
│                                                                                │
│  Response (HTTP 200/201):                                                      │
│    { "id": "xyz789abc012345", ... }                                            │
│              │                                                                 │
│              └──► PB_RECORD_ID = "xyz789abc012345"                             │
└─────────────────────────────────────────────────────────────────────────────────┘

Status Update Flow — post_update_to_api()

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        post_update_to_api(status, exit_code) Flow              │
│  PATCH → Update existing PocketBase record with final status                  │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Duplicate Prevention Check                              │
│                                                                                │
│  ┌─────────────────┐    ┌──────────────────────────────────────────────┐        │
│  │  Check           │    │  POST_UPDATE_DONE == "true"?               │        │
│  │  POST_UPDATE_    │───►│                                            │        │
│  │  DONE flag       │    │  YES → return 0 (skip PATCH)               │        │
│  │                 │    │  NO  → continue                             │        │
│  └─────────────────┘    └──────────────────────────────────────────────┘        │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │ (first call only)
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  Prerequisites: curl? ──► DIAGNOSTICS="yes"? ──► RANDOM_UUID set?             │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Status Mapping                                          │
│                                                                                │
│  Input $1         │  PocketBase status  │  exit_code   │  error                │
│  ─────────────────┼─────────────────────┼──────────────┼────────────────────── │
│  "done"/"success" │  "sucess"           │  0           │  ""                   │
│  "failed"         │  "failed"           │  from $2     │  explain_exit_code()  │
│  anything else    │  "unknown"          │  from $2     │  explain_exit_code()  │
│                                                                                │
│  Note: PocketBase schema spells it "sucess" intentionally                      │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Record ID Resolution                                    │
│                                                                                │
│  ┌──────────────────────────┐    ┌──────────────────────────────────────┐       │
│  │  PB_RECORD_ID set?       │    │  Fallback: GET lookup               │       │
│  │                          │    │                                      │       │
│  │  YES → use PB_RECORD_ID  │    │  GET PB_API_URL                     │       │
│  │                          │    │    ?filter=(random_id='UUID')        │       │
│  │  NO  → try GET lookup ───┼───►│    &fields=id                       │       │
│  │                          │    │    &perPage=1                        │       │
│  │                          │    │                                      │       │
│  │                          │    │  Extract "id" from response          │       │
│  │                          │    │  If not found → set flag, return     │       │
│  └──────────────────────────┘    └──────────────────────────────────────┘       │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        PATCH Request                                           │
│                                                                                │
│  PATCH → PB_API_URL/{record_id}                                                │
│  http://db.community-scripts.org/api/collections/_dev_telemetry_data/          │
│           records/{record_id}                                                  │
│                                                                                │
│  Payload:                                                                      │
│  {                                                                             │
│      "status": "sucess" | "failed" | "unknown",                               │
│      "error": "..." | "",                                                      │
│      "exit_code": 0 | <numeric>                                               │
│  }                                                                             │
│                                                                                │
│  ──► POST_UPDATE_DONE = true (prevents future calls)                           │
└─────────────────────────────────────────────────────────────────────────────────┘

Error Description Flow — explain_exit_code()

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        explain_exit_code(code) Flow                            │
│  Convert numeric exit codes to human-readable descriptions                    │
│  Canonical function — used by api.func AND error_handler.func                 │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│                        Exit Code Classification (non-overlapping ranges)       │
│                                                                                │
│  ┌─────────────────┐  ┌──────────────────┐  ┌──────────────────────────┐       │
│  │  Generic/Shell  │  │  curl/wget       │  │  APT/DPKG               │       │
│  │  12            │  │  6, 7, 22, 28, 35│  │  100102, 255           │       │
│  └─────────────────┘  └──────────────────┘  └──────────────────────────┘       │
│                                                                                │
│  ┌─────────────────┐  ┌──────────────────┐  ┌──────────────────────────┐       │
│  │  System/Signals │  │  Systemd/Service │  │  Python/pip/uv          │       │
│  │  124143        │  │  150154         │  │  160162                │       │
│  └─────────────────┘  └──────────────────┘  └──────────────────────────┘       │
│                                                                                │
│  ┌─────────────────┐  ┌──────────────────┐  ┌──────────────────────────┐       │
│  │  PostgreSQL     │  │  MySQL/MariaDB   │  │  MongoDB                │       │
│  │  170173        │  │  180183         │  │  190193                │       │
│  └─────────────────┘  └──────────────────┘  └──────────────────────────┘       │
│                                                                                │
│  ┌─────────────────┐  ┌──────────────────┐                                     │
│  │  Proxmox        │  │  Node.js/npm     │                                     │
│  │  200231        │  │  243249         │                                     │
│  └─────────────────┘  └──────────────────┘                                     │
└─────────────────────┬───────────────────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│  case "$code" in                                                               │
│      <matched>)  echo "<description>" ;;                                       │
│      *)          echo "Unknown error" ;;                                       │
│  esac                                                                          │
└─────────────────────────────────────────────────────────────────────────────────┘

Complete Installation Lifecycle

┌──────────────────────────────────────────────────────────────┐
│  Installation Script (e.g. build.func / vm-core.func)       │
└────────┬─────────────────────────────────────────────────────┘
         │
         │  1. source api.func
         │  2. Set DIAGNOSTICS, RANDOM_UUID, NSAPP, etc.
         │
         ▼
┌──────────────────────────────────────────────────────────────┐
│  post_to_api() / post_to_api_vm()                           │
│                                                              │
│  POST → PB_API_URL                                           │
│  Body: { ..., "status": "installing", "random_id": "..." }  │
│                                                              │
│  Response → PB_RECORD_ID = "abc123def456789"                 │
└────────┬─────────────────────────────────────────────────────┘
         │
         │  3. Installation proceeds...
         │     (container/VM creation, package install, etc.)
         │
         ▼
┌──────────────────────────────────────────────────────────────┐
│  post_update_to_api("done", 0)                              │
│          or                                                  │
│  post_update_to_api("failed", $exit_code)                   │
│                                                              │
│  PATCH → PB_API_URL/{PB_RECORD_ID}                           │
│  Body: { "status": "sucess", "error": "", "exit_code": 0 }  │
│    or  { "status": "failed", "error": "...", "exit_code": N }│
│                                                              │
│  POST_UPDATE_DONE = true                                     │
└──────────────────────────────────────────────────────────────┘

Integration Points

With Installation Scripts

  • build.func: Calls post_to_api() for LXC creation, then post_update_to_api() on completion
  • vm-core.func: Calls post_to_api_vm() for VM creation, then post_update_to_api() on completion
  • install.func / alpine-install.func: Reports installation status via post_update_to_api()

With Error Handling

  • error_handler.func: Uses explain_exit_code() for human-readable error messages
  • Diagnostic reporting: PocketBase records track error patterns anonymously

External Dependencies

  • curl: HTTP client for PocketBase API communication
  • PocketBase: Backend at http://db.community-scripts.org
  • Network connectivity: Required for API communication (failures are silently ignored)