mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-11-10 10:15:18 +00:00
better buffer instructions and other minor changes (#75)
* add git commit to Dockerfile label * add deploy resource requirements * add default stats collection * fix file permissions * relax buffer warning * fix typos * add various deploy instructions
This commit is contained in:
parent
a3c7343cd2
commit
ae7c14fc2a
@ -3,39 +3,65 @@
|
||||
## WARNING
|
||||
|
||||
> [!WARNING]
|
||||
> Currently Docker cannot be used to run Quilibrium.
|
||||
> The Quilibrium docker container requires host configuration changes.
|
||||
|
||||
There are extreme buffering requirements, especially during sync, and these in turn require `sysctl`
|
||||
configuration changes that unfortunately are not supported by Docker.
|
||||
configuration changes that unfortunately are not supported by Docker. But if these changes are made on
|
||||
the host machine, then luckily containers seem to automatically have the larger buffers.
|
||||
|
||||
The buffer related `sysctl` settings are `net.core.rmem_max` and `net.core.wmem_max` and they both
|
||||
should be set to `600,000,000` bytes. This value allows pre-buffering of the entire maximum payload
|
||||
for sync.
|
||||
|
||||
You can tell that the buffer size is not large enough by noticing this log entry at beginning when
|
||||
Quilibrium starts, a few lines below the large logo:
|
||||
> failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB).
|
||||
> See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.
|
||||
|
||||
To read the currently set values:
|
||||
```shell
|
||||
sysctl -n net.core.rmem_max
|
||||
sysctl -n net.core.wmem_max
|
||||
```
|
||||
|
||||
To set new values:
|
||||
To set new values, this is not a persistent change:
|
||||
```shell
|
||||
sudo sysctl -w net.core.rmem_max=600000000
|
||||
sudo sysctl -w net.core.wmem_max=600000000
|
||||
```
|
||||
|
||||
## Build
|
||||
To persistently set the new values add a configuration file named `20-quilibrium.conf` to
|
||||
`/etc/sysctl.d/`. The file content should be:
|
||||
```
|
||||
# Quilibrium buffering requirements, especially during sync.
|
||||
# The value could be as low as 26214400, but everything would be slower.
|
||||
|
||||
Build the docker image:
|
||||
```shell
|
||||
docker build -t quilibrium -t quilibrium:1.2.9 .
|
||||
net.core.rmem_max = 600000000
|
||||
net.core.wmem_max = 600000000
|
||||
```
|
||||
|
||||
Use latest version instead of `1.2.9`.
|
||||
|
||||
## Build
|
||||
|
||||
In the repository root folder, where the [Dockerfile](Dockerfile) file is, build the docker image:
|
||||
```shell
|
||||
docker build --build-arg GIT_COMMIT=$(git log -1 --format=%h) -t quilibrium -t quilibrium:1.2.15 .
|
||||
```
|
||||
|
||||
Use latest version instead of `1.2.15`.
|
||||
|
||||
|
||||
## Run
|
||||
|
||||
You can run Quilibrium on the same machine where you built the image, from the same repository root
|
||||
folder where [docker-compose.yml](docker-compose.yml) is.
|
||||
|
||||
You can also copy `docker-compose.yml` to a new folder on a server and run it there. In this case you
|
||||
have to have a way to push your image to a Docker image repo and then pull that image on the server.
|
||||
Github offers such an image repo and a way to push and pull images using special authentication
|
||||
tokens. See
|
||||
[Working with the Container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry).
|
||||
|
||||
Run Quilibrium in a container:
|
||||
```shell
|
||||
docker compose up -d
|
||||
@ -45,7 +71,57 @@ A `.config/` subfolder will be created under the current folder, this is mapped
|
||||
Make sure you backup `config.yml` and `keys.yml`.
|
||||
|
||||
|
||||
## Intereact with a running cotainer
|
||||
### Resource management
|
||||
To ensure that your client performs optimally within a specific resource configuration, you can specify
|
||||
resource limits and reservations in the node configuration as illustrated below.
|
||||
|
||||
This configuration helps in deploying the client with controlled resource usage, such as CPU and memory,
|
||||
to avoid overconsumption of resources in your environment.
|
||||
|
||||
The [docker-compose.yml](docker-compose.yml) file already specifies resources following the currently
|
||||
recommended hardware requirements.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
node:
|
||||
# Some other configuration sections here
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '4' # Maximum CPU count that the container can use
|
||||
memory: 16G # Maximum memory that the container can use
|
||||
reservations:
|
||||
cpus: '2' # CPU count that the container initially requests
|
||||
memory: 8G # Memory that the container initially request
|
||||
```
|
||||
|
||||
|
||||
### Customizing docker-compose.yml
|
||||
|
||||
If you want to change certain parameters in [docker-compose.yml](docker-compose.yml) it is better not
|
||||
to edit the file directly as new versions pushed through git would overwrite your changes. A more
|
||||
flexible solution is to create another file called `docker-compose.override.yml` right next to it
|
||||
and specifying the necessary overriding changes there.
|
||||
|
||||
For example:
|
||||
```yaml
|
||||
services:
|
||||
node:
|
||||
image: ghcr.io/mscurtescu/ceremonyclient
|
||||
restart: on-failure:7
|
||||
```
|
||||
|
||||
The above will override the image name and also the restart policy.
|
||||
|
||||
To check if your overrides are being picked up run the following command:
|
||||
```shell
|
||||
docker compose config
|
||||
```
|
||||
|
||||
This will output the merged and canonical compose file that will be used to run the container(s).
|
||||
|
||||
|
||||
## Interact with a running container
|
||||
|
||||
Drop into a shell inside a running container:
|
||||
```shell
|
||||
@ -62,7 +138,7 @@ Get the Peer ID:
|
||||
docker compose exec node go run ./... -peer-id
|
||||
```
|
||||
|
||||
Get the token ballance:
|
||||
Get the token balance:
|
||||
```shell
|
||||
docker compose exec node go run ./... -balance
|
||||
```
|
||||
|
@ -1,10 +1,13 @@
|
||||
FROM golang:1.20.14-alpine3.19
|
||||
|
||||
ARG GIT_COMMIT=unspecified
|
||||
|
||||
LABEL org.opencontainers.image.title="Quilibrium Network Node"
|
||||
LABEL org.opencontainers.image.description="Quilibrium is a decentralized alternative to platform as a service providers."
|
||||
LABEL org.opencontainers.image.vendor=Quilibrium
|
||||
LABEL org.opencontainers.image.url=https://quilibrium.com/
|
||||
LABEL org.opencontainers.image.documentation=https://quilibrium.com/docs
|
||||
LABEL org.opencontainers.image.revision=$GIT_COMMIT
|
||||
|
||||
ENV GOEXPERIMENT=arenas
|
||||
|
||||
|
@ -3,16 +3,24 @@ version: "3.8"
|
||||
name: quilibrium
|
||||
|
||||
# See sysctl related warning in DOCKER-README.md.
|
||||
# Currently Docker cannot be used to run Quilibrium.
|
||||
# Host configuration changes are required.
|
||||
|
||||
services:
|
||||
node:
|
||||
build: ./
|
||||
image: quilibrium
|
||||
restart: unless-stopped
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 32G
|
||||
reservations:
|
||||
cpus: 12
|
||||
memory: 16G
|
||||
environment:
|
||||
- DEFAULT_LISTEN_GRPC_MULTIADDR=/ip4/0.0.0.0/tcp/8337
|
||||
- DEFAULT_LISTEN_REST_MULTIADDR=/ip4/0.0.0.0/tcp/8338
|
||||
- DEFAULT_STATS_MULTIADDR=/dns/stats.quilibrium.com/tcp/443
|
||||
ports:
|
||||
- '8336:8336/udp' # p2p
|
||||
- '127.0.0.1:8337:8337/tcp' # gRPC
|
||||
|
@ -142,6 +142,10 @@ func LoadConfig(configPath string, proverKey string) (*Config, error) {
|
||||
config.ListenRestMultiaddr = os.Getenv("DEFAULT_LISTEN_REST_MULTIADDR")
|
||||
}
|
||||
|
||||
if multiAddr := os.Getenv("DEFAULT_STATS_MULTIADDR"); multiAddr != "" {
|
||||
config.Engine.StatsMultiaddr = multiAddr
|
||||
}
|
||||
|
||||
fmt.Println("Saving config...")
|
||||
if err = SaveConfig(configPath, config); err != nil {
|
||||
panic(err)
|
||||
@ -150,7 +154,7 @@ func LoadConfig(configPath string, proverKey string) (*Config, error) {
|
||||
keyfile, err := os.OpenFile(
|
||||
filepath.Join(configPath, "keys.yml"),
|
||||
os.O_CREATE|os.O_RDWR,
|
||||
fs.FileMode(0700),
|
||||
fs.FileMode(0600),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
@ -202,7 +202,7 @@ func clearIfTestData(configDir string, nodeConfig *config.Config) {
|
||||
versionFile, err := os.OpenFile(
|
||||
filepath.Join(configDir, "RELEASE_VERSION"),
|
||||
os.O_CREATE|os.O_RDWR,
|
||||
fs.FileMode(0700),
|
||||
fs.FileMode(0600),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -232,7 +232,7 @@ func migrate(configDir string, nodeConfig *config.Config) {
|
||||
migrationFile, err := os.OpenFile(
|
||||
filepath.Join(configDir, "MIGRATIONS"),
|
||||
os.O_CREATE|os.O_RDWR,
|
||||
fs.FileMode(0700),
|
||||
fs.FileMode(0600),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
Loading…
Reference in New Issue
Block a user