# webapp-deployment-status-api This API provides status information about webapp deployment requests and a mechanism for upload encrypted configuration files used by those requests. It supports payments in both Laconic testnet (alnt) and Cosmos mainnet (ATOM). ## Build and Run ```bash yarn yarn build yarn start ``` ## API Endpoints ### Status Endpoints - `GET /` - Get status of all deployment requests - `GET /:id` - Get status of a specific deployment request - `GET /:id/log` - Get logs for a specific deployment request - `GET /log/:id` - Get logs for a specific deployment request (deprecated) ### Configuration Upload - `POST /upload/config` - Upload encrypted configuration file ### ATOM Payment Verification - `POST /verify/atom-payment` - Verify a Cosmos ATOM payment transaction - Request body: `{ "txHash": "string", "minAmount": number (optional), "markAsUsed": boolean (optional) }` - Response: `{ "valid": boolean, "reason": string (if invalid), "amount": number (if valid), "sender": string (if valid), "alreadyUsed": boolean (if transaction was already used) }` ## Configuration ### Keys Configuration files are encrypted prior to being uploaded using an RSA `publicKey` specified in the `WebappDeployer` record. On upload, the configuration is temporarily decrypted for validation, but stored in its encrypted format. To create and export a key in the necessary format use: ```bash # Create a key gpg --batch --passphrase "SECRET" --quick-generate-key webapp-deployer-api.my.domain.com default default never # Export the public key gpg --export webapp-deployer-api.my.domain.com > webapp-deployer-api.my.domain.com.pgp.pub # Export the private key gpg --export-secret-keys webapp-deployer-api.my.domain.com > webapp-deployer-api.my.domain.com.pgp.key ``` ### Create the Deployer Record Every webapp deployer should have `WebappDeployer` record in the registry which looks something like: ```yml record: type: WebappDeployer version: 1.0.0 name: webapp-deployer-api.my.domain.com apiUrl: https://webapp-deployer-api.my.domain.com minimumPayment: 100alnt paymentAddress: laconic1clpc8smrhx5k25zmk3vwna8kddxrsem7a1jlry publicKey: mQGNBGbJUk0BDAC3j3CiaVtoEf1jrgtsjJnTA5u1a3BExP72mv0eE8y84TgY5rVcf ... atomPaymentAddress: cosmos1clpc8smrhx5k25zmk3vwna8kddxrsem7a1jlry minimumAtomPayment: 1 ``` This record can most easily be created using `laconic-so publish-deployer-to-registry`. ```bash laconic-so publish-deployer-to-registry \ --laconic-config ~/.laconic/registry.yml \ --api-url https://webapp-deployer-api.my.domain.com --public-key-file webapp-deployer-api.my.domain.com.pgp.pub \ --lrn lrn://laconic/deployers/webapp-deployer-api.my.domain.com \ --min-required-payment 100 \ --atom-payment-address cosmos1clpc8smrhx5k25zmk3vwna8kddxrsem7a1jlry \ --min-atom-payment 1 ``` This will create the record in the proper format and assign its LRN. ### Publish Deployment Auction Users can optionally create an auction for app deployment with desired number of providers and max price they are willing to pay for a deployment: ```bash laconic-so publish-deployment-auction \ --laconic-config ./config.yml \ --app lrn://cerc-io/applications/webapp-hello-world@0.1.3 \ --commits-duration 3600 \ --reveals-duration 3600 \ --commit-fee 10000 \ --reveal-fee 10000 \ --max-price 5000000 \ --num-providers 3 ``` This will create a `provider` auction with given params and publish a deployment auction record. ### Request Deployment Users can now request deployment using the LRN of the deployer. This will allow them to: 1. Discover the API URL for config uploads. 1. Obtain the public key for encrypting config. 1. See the minimum required payment (both alnt and ATOM if configured). The request can be made using `laconic-so request-webapp-deployment`. This will handle encrypting and uploading the config automatically, as well as making a payment (if necessary). Payment can be made using either Laconic testnet (alnt) or Cosmos mainnet (ATOM). For Cosmos ATOM payments, you'll need to make the payment separately and provide the transaction hash. ```bash laconic-so request-webapp-deployment \ --laconic-config ~/.laconic/registry.yml \ --deployer lrn://laconic/deployers/webapp-deployer-api.my.domain.com \ --app lrn://cerc-io/applications/webapp-hello-world@0.1.3 \ --env-file hello.env \ --make-payment auto # OR for Cosmos ATOM payment laconic-so request-webapp-deployment \ --laconic-config ~/.laconic/registry.yml \ --deployer lrn://laconic/deployers/webapp-deployer-api.my.domain.com \ --app lrn://cerc-io/applications/webapp-hello-world@0.1.3 \ --env-file hello.env \ --use-payment ``` Alternatively, users can also use a deployment auction they created instead of making the payment to any specific deployer directly: ```bash laconic-so request-webapp-deployment \ --laconic-config ~/.laconic/registry.yml \ --app lrn://cerc-io/applications/webapp-hello-world@0.1.3 \ --env-file hello.env \ --auction-id 4c9701c22651e143202e991056b6e7649853acc5bc0e97e3a98e09c9f3355909 ``` This creates deployment requests targeted towards all the deployers who have won the auction. Similar to requests with payments, the config is automatically encrypted and uploaded to all the deployers. ### Request Undeployment Users can also request removal of an existing deployment using the deployment record id: ```bash laconic-so request-webapp-undeployment \ --laconic-config ~/.laconic/registry.yml \ --deployer lrn://laconic/deployers/webapp-deployer-api.my.domain.com \ --deployment bafyreigeopr72dmp6rhvnomgdz3cljbqzhh75epcrigit7ue6i6vjullme \ --make-payment auto ``` ### Example Config ```bash UPLOAD_DIRECTORY="/srv/uploads/config" UPLOAD_MAX_SIZE="1MB" DEPLOYER_STATE="/srv/deployments/autodeploy.state" UNDEPLOYER_STATE="/srv/deployments/autoundeploy.state" BUILD_LOGS="/srv/logs" OPENPGP_PASSPHRASE="SECRET" OPENPGP_PRIVATE_KEY_FILE="/etc/config/webapp-deployer-api.my.domain.com.pgp.key" LACONIC_CONFIG="/etc/config/registry.yml" LRN=lrn://laconic/deployers/webapp-deployer-api.my.domain.com CHECK_INTERVAL=15 # Cosmos ATOM payment configuration ATOM_PAYMENT_ADDRESS="cosmos1clpc8smrhx5k25zmk3vwna8kddxrsem7a1jlry" MIN_ATOM_PAYMENT=1 COSMOS_RPC_ENDPOINT="https://cosmos-rpc.example.com" AUCTION_CHECK_INTERVAL=10 HANDLE_AUCTION_REQUESTS=true AUCTION_BID_AMOUNT=50000 ```