Distribuisci la tua prima app su un server con erpc worker

Crea una piccola API HTTP in Rust con erpc worker, eseguila sulla tua macchina e distribuiscila su un server con quattro comandi.
Questa pagina descrive ERPC CLI v0.1.0-rc.4, una versione pre-release.
erpc worker (alias erpc w) compila la tua app in un binario Linux nativo e la esegue su un ERPC VPS, su un nuovo VPS orario o su un server tuo, sotto un'unità systemd con hardening, senza Docker e senza alcun runtime nel mezzo.
Una release che all'avvio non risulta integra subisce il rollback alla release precedente, e più app possono condividere un server, ciascuna su una porta propria. Tutto ciò che riguarda l'app si trova in erpc.toml nella sua radice, che non contiene alcun secret e può essere incluso in un commit.

Prerequisiti

  • Un account ERPC, con l'accesso effettuato su questa macchina tramite erpc login (Accesso e chiavi).
  • ERPC Credit, per un nuovo VPS orario. Un prodotto orario si paga con ERPC Credit, acquistato in anticipo, e un avvio che il credito non copre viene rifiutato. I prezzi sono su Prezzi e nella ERPC Web Dashboard.
  • Una chiave SSH su questa macchina: ssh-keygen -t ed25519, oppure erpc config set ssh_key <path>.pub per una chiave che hai già.
  • Un modo per compilare per Linux. Da un Mac o da Windows, il target Rust del server (rustup target add x86_64-unknown-linux-gnu), zig (brew install zig su macOS) e cargo-zigbuild (cargo install cargo-zigbuild --locked). Da una macchina Linux dello stesso tipo del server (x86-64 per ogni server ERPC), non serve altro che cargo. Senza gli strumenti di cross-build, l'app viene compilata con la toolchain di questa macchina, e il binario richiede poi la glibc con cui è stato collegato, che build e deploy indicano. Con questi strumenti, viene compilata per glibc 2.31 e versioni successive.

Distribuire HelloWorld

HelloWorld è una piccola API HTTP in Rust che non ha bisogno di nessuna chiave, nessun secret e nessuna linea dati. Risponde a GET /, GET /hello/{name} e GET /healthz.
bash
erpc worker init --template helloworld   # makes ./hello-world
erpc worker run hello-world              # here: curl http://127.0.0.1:3000/
erpc worker deploy hello-world           # your VPS, or a new hourly one (price asked first)
erpc worker api / --dir hello-world      # {"message":"Hello, World!",…} from the server
  1. init crea l'app in ./hello-world, con il suo erpc.toml.
  2. run compila l'app e la esegue sulla tua macchina, così puoi prima chiamarla con curl.
  3. deploy la compila per il server e la distribuisce. Tutto ciò che costa denaro viene mostrato prima, con il prezzo orario, il tuo saldo e quanto dura il credito, e in un terminale parte solo dopo un sì.
  4. api chiama l'API dell'app distribuita dalla tua macchina, mentre l'API resta sul loopback del server.
erpc worker check elenca ciò che manca all'app, e deploy si rifiuta di procedere prima di acquistare qualsiasi cosa quando manca qualcosa. erpc worker build esegue solo la compilazione: è il modo per vedere una compilazione fallire prima che venga acquistato un server.

Scegliere un template

erpc worker init chiede una sola cosa: che cosa creare, da scegliere con i tasti freccia.
  • HelloWorld è quello da cui partire.
  • HFT e pumpfun-bot sono entrambi creati, per ora, dal template pumpfun: un trading bot per pump.fun (PumpSwap) portato da ValidatorsDAO/solana-stream.
--template hft (oppure helloworld, pumpfun-bot o l'id di un template) salta la selezione, e --name dà il nome all'app. Senza un nome, l'app prende il nome della scelta (hello-world, hft-bot, pumpfun-bot). Quando esiste già una directory con quel nome, una persona che sceglie ottiene -2, -3 e così via, mentre uno script (--yes, --json, nessun terminale) riceve un errore. Senza nessuno a cui chiedere e senza --template, viene creato HelloWorld.
Un trading bot ha bisogno di una chiave e di alcune impostazioni prima di essere eseguito. Ecco l'ordine:
bash
erpc login                             # once per machine: the session in 1Password or the keychain
erpc worker init                       # pick with the arrow keys; makes ./<name> with erpc.toml
cd <name>
erpc worker key new                    # the trading key, in 1Password, the keychain or the keystore; prints the public key to fund
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
erpc worker check                      # what erpc.toml describes, and what is missing
erpc worker run --grpc --ip <IPV4>     # build and run here, with an hourly gRPC line letting this machine in
erpc worker run --check --grpc --ip <IPV4>   # the same, stopped once healthy
erpc worker deploy --new-vps --grpc    # a new hourly VPS and gRPC line, prices asked first
init stampa questo ordine per l'app che ha creato. Chiavi e secret spiega dove vengono conservati la chiave e i secret.

Scegliere il server

deploy usa la prima di queste opzioni:
  1. il server che [env.<name>] dell'app indica già;
  2. --vps <id>, un ERPC VPS del tuo account;
  3. --new-vps, il VPS orario più economico nella regione più vicina a questa macchina in base al suo fuso orario (--region e --plan scelgono diversamente);
  4. --host <address>, un server tuo: Ubuntu o Debian con systemd, nftables, sudo e Python 3 in /usr/bin/python3, raggiunto come root o come un utente con sudo senza password;
  5. altrimenti, in un terminale, un elenco dei VPS in esecuzione del tuo account, con "start a new one" in fondo.
Su un server tuo, il firewall del worker scarta ogni connessione in entrata tranne SSH e la porta dell'app, quindi un server che serve qualsiasi altra cosa non è quello da usare.

Distribuire senza una persona al terminale

Uno script, o un agente come erpc ai, non ha un terminale da cui rispondere. Due flag gli permettono di fare comunque il lavoro:
bash
erpc worker deploy hello-world --new-vps --yes                     # no key: all the way, unattended
erpc worker deploy pump-sniper --new-vps --grpc --yes --prepare    # a bot: everything but its key
erpc worker deploy pump-sniper                                     # then you, at a terminal: the key, and the start
  • --yes risponde al prezzo di ogni prodotto orario che il comando nomina (--new-vps, --grpc, --shreds, --unlimited). Risponde anche al primo login su un server che erpc non ha ancora reso accessibile solo con chiave, uno nuovo o uno indicato con --vps <ID>: erpc accede una volta con la password del server, inserisce la tua chiave e disattiva i login con password. Senza --yes e senza un terminale, un avvio viene rifiutato prima che venga acquistata qualsiasi cosa, con stato di uscita 3.
  • Scegliere tra i tuoi server richiede ancora una persona. Indica il server con --new-vps, --vps <ID> o --host.
  • --prepare fa tutto ciò che non richiede né la chiave di trading né un secret, e non avvia, arresta né riavvia nulla. Il successivo erpc worker deploy in un terminale consegna la chiave e i secret e avvia l'app. La chiave di trading viene letta solo per una persona al terminale.

Collegare la tua app a gRPC, Shreds e Unlimited RPC

Le linee orarie di ERPC ammettono il server in base al suo indirizzo e non accettano alcun token. Ciascuna linea viene avviata per il server da un flag proprio su deploy, e l'app riceve l'endpoint della linea come impostazione:
FlagLineaL'app riceve
--grpcGeyser gRPCGRPC_ENDPOINT
--shredsShreds (Shredstream gRPC)SHREDS_ENDPOINT
--unlimitedUnlimited RPC nella regione del serverSOLANA_SEND_RPC_ENDPOINT
  • Ogni linea è la più economica della sua famiglia, a meno che --grpc-plan, --shreds-plan o --unlimited-plan non ne indichi una.
  • L'Unlimited RPC gira su un server dedicato che richiede fino a 45 minuti per essere configurato. Serve sendTransaction e un breve elenco di letture, non getProgramAccounts né getTokenAccountsByOwner. Il suo endpoint è HTTP semplice (senza TLS) e ammette solo l'indirizzo in whitelist.

Linee per un'esecuzione sulla tua macchina

Anche erpc worker run accetta --grpc e --shreds, per provare l'app qui con dati reali prima che passi su un server.
  • L'indirizzo: le linee ammettono l'indirizzo IPv4 pubblico di questa macchina, che passi con --ip. erpc non lo ricava da solo.
  • L'acquisto: una nuova linea si acquista solo in un terminale, dopo che ne è stato mostrato il prezzo. run non ha --yes.
  • La chiusura: quando l'esecuzione termina, ogni linea oraria viene terminata dopo una richiesta di conferma. --keep-lines le mantiene, e l'addebito continua. Se l'esecuzione termina in un altro modo (il terminale chiuso, un secondo Ctrl-C), le linee restano e vengono addebitate.
  • I numeri: ciò che l'app misura qui include la distanza tra questa macchina e la linea, quindi risulta più lenta della stessa app su un server vicino alla linea.

Prossimi passi