Sari la conținut

CLI-ul pluspanel

pluspanel este un singur binar static pentru Linux, macOS și Windows (amd64 și arm64). Fiecare operație a API-ului public este o comandă, cu aceleași permisiuni ca în panou. Nu trimite telemetrie, nici statistici, nici verificări de actualizări: vorbește doar cu adresa panoului pe care o configurezi.

Linux și macOS:

Terminal window
curl -fsSL https://get.pluspanel.net/cli.sh | sh

Windows (PowerShell):

Terminal window
irm https://get.pluspanel.net/cli.ps1 | iex

Scripturile de instalare descarcă ultima versiune de pe GitHub (112tech/pluspanel-cli), verifică întotdeauna suma de control SHA-256 și verifică și semnătura cosign a sumelor de control când cosign este instalat. Nu apelează niciodată sudo: cli.sh instalează în ~/.local/bin (ca root: /usr/local/bin), cli.ps1 în %LOCALAPPDATA%\Programs\pluspanel și îl adaugă în PATH-ul utilizatorului. Poți alege directorul sau versiunea:

Terminal window
curl -fsSL https://get.pluspanel.net/cli.sh | sh -s -- --prefix /opt/bin --version 0.1.0

Preferi să citești scriptul înainte să-l rulezi? Descarcă-l mai întâi:

Terminal window
curl -fsSLO https://get.pluspanel.net/cli.sh
less cli.sh
sh cli.sh

Fiecare versiune conține arhivele pluspanel_<versiune>_<os>_<arch>.tar.gz (Windows: .zip), un fișier SHA256SUMS și semnătura lui cosign SHA256SUMS.sig, făcută cu cheia de release PlusPanel: cosign.pub.

Terminal window
curl -fsSLO https://pluspanel.net/docs/cli/cosign.pub
cosign verify-blob --key cosign.pub --signature SHA256SUMS.sig --insecure-ignore-tlog=true SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS # macOS: shasum -a 256 --ignore-missing -c SHA256SUMS

Ambele comenzi trebuie să reușească înainte să folosești binarul. Semnătura este făcută offline cu cheia de release și nu este publicată într-un jurnal public de transparență, de aici --insecure-ignore-tlog=true: încrederea vine din cheie.

Terminal window
pluspanel login --api-url https://panel.example.com

CLI-ul afișează un cod scurt și deschide pagina /device a panoului în browser. Autentifică-te acolo ca de obicei (parolă și al doilea factor, sau o passkey), verifică faptul că codul și cererea (numele dispozitivului, adresa IP, ora) sunt ale tale și aprobă. La aprobare ți se cere să-ți confirmi din nou identitatea (parolă sau cod din aplicația de autentificare) dacă nu ai făcut-o în ultimele 5 minute. CLI-ul primește apoi o cheie API personală, valabilă 90 de zile și revocabilă din Setări → API, și o păstrează într-un fișier pe care doar tu îl poți citi (0600), în directorul lui de configurare. Pe pagina de aprobare poți face cheia doar pentru citire.

Dacă pe acest calculator nu există browser, adaugă --no-browser și deschide adresa afișată oriunde. --client-name schimbă numele afișat pe pagina de aprobare (implicit: pluspanel CLI on <hostname>).

pluspanel whoami arată utilizatorul, organizația și cheia folosite. pluspanel logout uită cheia salvată; pluspanel logout --revoke o și revocă în control plane.

Folosește o cheie API creată pentru acel job, cu scope-urile de care are nevoie, din seiful de secrete al CI-ului:

Terminal window
export PLUSPANEL_API_URL=https://panel.example.com
export PLUSPANEL_API_KEY="$PLUSPANEL_CI_KEY"
pluspanel servers list -o json

Sau salvează o cheie într-un profil: --api-key o citește de la intrarea standard, iar --api-key-file dintr-un fișier, ca să nu ajungă în istoricul shell-ului:

Terminal window
printf '%s' "$PLUSPANEL_CI_KEY" | pluspanel login --api-url https://panel.example.com --api-key
pluspanel login --api-url https://panel.example.com --api-key-file ~/.pluspanel-key

CLI-ul verifică faptul că ce citește arată ca o cheie PlusPanel (ppk_…) înainte s-o trimită undeva.

Profilurile țin separat mai multe control plane-uri, de exemplu staging și producție:

Terminal window
pluspanel login --profile staging --api-url https://staging.example.com
pluspanel login --profile prod --api-url https://panel.example.com
pluspanel profiles list
pluspanel profiles use prod
pluspanel profiles set prod --default-output json
pluspanel --profile staging servers list
PLUSPANEL_PROFILE=prod pluspanel accounts list
pluspanel profiles delete staging

Fără --profile se folosește profilul curent (primul în care te-ai autentificat sau cel ales cu profiles use). Fișierele stau în directorul de configurare al utilizatorului: ~/.config/pluspanel/ (sau $XDG_CONFIG_HOME/pluspanel) pe Linux, ~/Library/Application Support/pluspanel pe macOS, %AppData%\pluspanel pe Windows; PLUSPANEL_CONFIG_DIR îl înlocuiește. config.yaml conține profilurile (fără secrete), credentials.yaml cheile, cu modul 0600: CLI-ul refuză să-l citească dacă îl pot citi și alți utilizatori.

Variabilă Efect
PLUSPANEL_PROFILE profilul folosit
PLUSPANEL_API_URL adresa API (înlocuiește adresa profilului)
PLUSPANEL_API_KEY cheia API (înlocuiește cheia salvată)
PLUSPANEL_CONFIG_DIR directorul de configurare
NO_COLOR fără anteturi îngroșate în tabele (și --no-color)

-o table (implicit, pentru oameni), -o json și -o yaml (pentru programe). Ieșirea JSON este răspunsul API-ului, neschimbat, deci se poate trimite direct în jq:

Terminal window
# Every server's name and status
pluspanel servers list --all -o json | jq -r '.items[] | "\(.name)\t\(.status)"'
# Accounts as CSV
pluspanel accounts list --all -o json | jq -r '.items[] | [.id, .name] | @csv'

--all urmează next_cursor prin toate paginile; fără el, o listă afișează o pagină și cursorul următor (--cursor o aduce). --verbose afișează pe ieșirea de erori fiecare cerere, statusul, id-ul cererii și limita de rată rămasă (niciodată cheia). Erorile arată așa: Error: <detail> (code <code>, request <id>). Coduri de ieșire: 0 succes, 1 eroare de utilizare sau de API, 2 autentificare (401/403, neautentificat), 3 inexistent, 4 conflict, precondiție neîndeplinită sau limită de rată (409/412/429), 5 API-ul nu a putut fi contactat.

Terminal window
# Servers and accounts
pluspanel servers list
pluspanel servers get 6f1c2d3e-…
pluspanel accounts list
# Launch a WordPress site in an account (retries are safe with --idempotency-key)
pluspanel sites launch 5a5a5a5a-… \
--primary-domain shop.example.com --title Shop --admin-email owner@example.com \
--idempotency-key "$(uuidgen)"
# Full request bodies from a file or standard input
pluspanel sites launch 5a5a5a5a-… --data-file site.json
pluspanel dns create-record 7c7c7c7c-… --data '{"name":"www","type":"CNAME","content":"example.com."}'
# Optimistic concurrency: send back the ETag of the GET you read (412 if the object changed
# meanwhile; see Conventions → ETags for reading it with curl)
pluspanel security put-site 6b6b6b6b-… --data-file security.json --if-match "$etag"
# API keys and webhooks
pluspanel api-keys create --name ci --scopes 'servers:read,sites:write' -o json
pluspanel api-keys list
pluspanel webhooks create --url https://hooks.example.com/pluspanel --events 'site.*,backup.failed'
pluspanel webhooks list-deliveries 9d9d9d9d-… --state dead
# Any operation by path, like curl with your credentials
pluspanel api GET /php-versions
pluspanel api GET '/audit?limit=5'

Comenzile sunt grupate pe resurse (pluspanel --help listează grupurile, pluspanel <grup> --help comenzile lor). Parametrii din cale sunt argumente poziționale, în ordinea din rută; parametrii de query și membrii de nivel superior ai corpului sunt flaguri (listele separate prin virgulă); fiecare POST acceptă --idempotency-key, fiecare PUT (și fiecare PATCH a cărui cale are GET) --if-match. --help-ul fiecărei comenzi arată descrierea, flagurile și ruta HTTP, generate din referința API.

Terminal window
pluspanel completion bash > ~/.local/share/bash-completion/completions/pluspanel
pluspanel completion zsh > "${fpath[1]}/_pluspanel"
pluspanel completion fish > ~/.config/fish/completions/pluspanel.fish
pluspanel completion powershell | Out-String | Invoke-Expression