Skip to main content

Deploying your application

Deploying a Cartesi dApp involves two steps: deploying a smart contract that defines your dApp on-chain and then instantiating a node that runs the application’s intended backend logic.

note

Currently, the Espresso integration support is limited to Ethereum Sepolia testnet and Ethereum Mainnet.

In the following steps, we'll focus on self-hosted deployment where we'll be deploying the node(with the application) to fly.io. Remember that developers are free to deploy the node on their local machine or on any other cloud host.

Deploying the node to fly.io

Go to the directory containing your project. You should create a .env.<testnet> file with:

CARTESI_LOG_LEVEL=info
CARTESI_AUTH_KIND=private_key
CARTESI_CONTRACTS_INPUT_BOX_ADDRESS=0x593E5BCf894D6829Dd26D0810DA7F064406aebB6
CARTESI_CONTRACTS_INPUT_BOX_DEPLOYMENT_BLOCK_NUMBER=6994348
MAIN_SEQUENCER=espresso
ESPRESSO_BASE_URL=https://query.decaf.testnet.espresso.network/
ESPRESSO_NAMESPACE=51025
ESPRESSO_STARTING_BLOCK=
CARTESI_BLOCKCHAIN_HTTP_ENDPOINT=
CARTESI_BLOCKCHAIN_WS_ENDPOINT=
CARTESI_BLOCKCHAIN_ID=
CARTESI_AUTH_PRIVATE_KEY=
CARTESI_POSTGRES_ENDPOINT=

Note that the value of CARTESI_POSTGRES_ENDPOINT will be provided on the Step 3.

Then follow these steps to deploy on fly

Step 1: Create a directory for the fly app

mkdir -p .fly/node && cd .fly/node

Step 2: Create fly configuration for the node

This is important to control the auto-stop behavior and minimum machines running. Create a .fly/node/fly.toml in this directory with the following content:

[build]
image = "ghcr.io/prototyp3-dev/test-node-cloud:test"

[http_service]
internal_port = 80
force_https = true
auto_stop_machines = 'off'
auto_start_machines = false
min_machines_running = 1
processes = ['app']

[metrics]
port = 9000
path = "/metrics"

[[vm]]
size = 'shared-cpu-1x'
memory = '1gb'
cpu_kind = 'shared'
cpus = 1

We suggest creating a persistent volume to store the snapshots, so you wouldn't need to transfer the snapshots when restarting the virtual machine. Create the <node-volume> volume and add this section to the .fly/node/fly.toml file:

[[mounts]]
source = '<nodevolume>'
destination = '/mnt'
initial_size = '5gb'

Step 3: Create the Postgres database

fly ext supabase create

Make sure to add the value of CARTESI_POSTGRES_ENDPOINT variable to your environment file.

You can also use the fly postgres to create the database:

fly postgres create

Similarly, make sure to set the value of CARTESI_POSTGRES_ENDPOINT variable to your environment file. You should use the provided Connection string to set these variables, and don't forget to add the database postgres and option sslmode=disable to the string (postgres?sslmode=disable):

postgres://{username}:{password}@{hostname}:{port}/postgres?sslmode=disable

Step 4: Create the Fly app without deploying yet

fly launch --name <app-name> --copy-config --no-deploy -c .fly/node/fly.toml

Step 5: Import the secrets from the .env file

fly secrets import -c .fly/node/fly.toml < .env.<testnet>

Step 6: Deploy the backend node

fly deploy --ha=false -c .fly/node/fly.toml

Now you have a rollups node with the node running on the provided url.

Step 7: Deploy the app to the node

You'll have to copy the snapshot using sftp shell (we are considering the application snapshot is at .cartesi/image).

app_name=<app-name>
image_path=.cartesi/image

fly ssh console -c .fly/node/fly.toml -C "mkdir -p /mnt/apps/$app_name"

Then run this command to print all transfers:

for f in $(ls -d $image_path/*); do echo "put $f /mnt/apps/$app_name"/$(basename $f); done

Then run the sftp shell and paste the listed transfers:

fly sftp shell -c .fly/node/fly.toml

Finally, run the deployment on the node:

fly ssh console -c .fly/node/fly.toml -C "bash -c 'OWNER={OWNER} /deploy.sh /mnt/apps/$app_name'"

You should set OWNER to the same owner of the CARTESI_AUTH_PRIVATE_KEY. Set CONSENSUS_ADDRESS to deploy a new application with same consensus already deployed. You can also set EPOCH_LENGTH, and SALT.

If you have already deployed the application, you can register it to add to the node (after transfering the image).

fly ssh console -c .fly/node/fly.toml -C "bash -c 'APPLICATION_ADDRESS=${APPLICATION_ADDRESS} CONSENSUS_ADDRESS=${CONSENSUS_ADDRESS} /register.sh /mnt/apps/$app_name'"

Your application is now deployed on the node. Also, note that you can deploy multiple applications on the same node.