Deployment with Containers: An Example with Docker Compose
Every release of prb
is publish on Docker Hub once it gets on the Github release page, you can get the latest release by running:
docker pull phalanetwork/prb
The prb
is designed to be simple, basic and easily integrated with RPC without modifying its code. With containers, managing prb
services and integrating them is much easier. Here is an example of how to deploy prb
with Docker Compose.
Note: This expample explains the relationship between services only, you should design your setup regrading your own requirements.
Requirements
- Ubuntu LTS 20.04
- Docker 20.10 or newer
- Docker Compose 1.29 or newer
The version of docker in Ubuntu’s default APT source is too old,follow https://docs.docker.com/engine/install/ and https://docs.docker.com/compose/install/ to get latest Docker and Docker Compose.
In production, use a prebuilt image instead of building from the master branch to prevent unexpected changes.
Prepare the environment
- Create a folder for the deployment environment, then create docker-compose.yml which is edited from here.
- Run
docker-compose pull
to pull the latest images. - Deploy
pruntime
on worker machines. - Create mining pool on the blockchain.
Base Services
Run docker-compose up -d redis io
to start the base services.
In this example, data in Redis is not persisted, unexpected exit will break the whole environment, please do build a HA setup for Redis in production. Expose the Redis port to make the RPC work.
RocksDB/LevelDB will save data in PHALA_DB_PREFIX
specified in environment variables. The 0
directory is used for the data of block data. The 1
directory is used for the data of saved pools and workers including credentials, do backup it!
The fetch
Service
Run docker-compose up -d fetch
to start the fetch
service.
It requires 3 CPU cores to:
- Fetch headers with justification from the parent chain.
- Fetch headers and storage changes from the parachain.
- Encode them in formats that
pruntime
consumes by block. - Organize and merge data mentioned above for fast synchronization.
All these work are done asynchronously, you can see the processes can take a heavy load of CPU time. The fetch
service can be stopped and started as many times as you want.
The trade
Service
Run docker-compose up -d trade
to start the trade
service.
It only needs 1 CPU core to sign and send extrinsics read from the message queue. It keeps keyring in memory, keep it safe.
Everytime you changed account information of pools, you need to restart the trade
service to take effect.
The lifecycle
Service
Run docker-compose up -d lifecycle
to start the lifecycle
service. It controls the lifecycle of TEE workers. Use the monitor to add, edit, remove, and check status for workers.
It should handle the corresponding worker lifecycles after making changes to workers(testing and debugging for now), roughly restarting it should also work.