mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-24 15:45:18 +00:00
multi stage Dockerfile and Taskfile (#102)
* multi-stage Dockerfile * add build arguments for git * add taskfile * switch back to copying source into build stage and clean up labels * get image name from .env * remove top level ARGs * update DOCKER-README with Taskfile details * mention light and safe image * add a backup task * add healthcheck * add logs-folder task * add warnings to backup task * allow port overriding in docker compose
This commit is contained in:
parent
d9d8bbe93e
commit
dc065cc682
15
.env.example
Normal file
15
.env.example
Normal file
@ -0,0 +1,15 @@
|
||||
# Use a custom docker image name
|
||||
# Default: quilibrium
|
||||
QUILIBRIUM_IMAGE_NAME=
|
||||
|
||||
# Use a custom P2P port.
|
||||
# Default: 8336
|
||||
QUILIBRIUM_P2P_PORT=
|
||||
|
||||
# Use a custom gRPC port.
|
||||
# Default: 8337
|
||||
QUILIBRIUM_GRPC_PORT=
|
||||
|
||||
# Use a custom REST port.
|
||||
# Default: 8338
|
||||
QUILIBRIUM_REST_PORT=
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ ceremony-client
|
||||
.config*
|
||||
.DS_Store
|
||||
*.mprof
|
||||
.env
|
||||
|
@ -43,13 +43,51 @@ net.core.wmem_max = 600000000
|
||||
|
||||
## Build
|
||||
|
||||
The only requirements are `git` (to checkout the repository) and docker (to build the image and run the container).
|
||||
Golang does not have to be installed, the docker image build process uses a build stage that provides the
|
||||
correct Go environment and compiles the node down to one command.
|
||||
|
||||
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 .
|
||||
docker build --build-arg GIT_COMMIT=$(git log -1 --format=%h) -t quilibrium -t quilibrium:1.4.2 .
|
||||
```
|
||||
|
||||
Use latest version instead of `1.2.15`.
|
||||
Use latest version instead of `1.4.2`.
|
||||
|
||||
The image that is built is light and safe. It is based on Alpine Linux with the Quilibrium node binary, not the
|
||||
source code, nor the Go development environment. The image also has the `grpcurl` tool that can be used to
|
||||
query the gRPC interface.
|
||||
|
||||
### Task
|
||||
|
||||
You can also use the [Task](https://taskfile.dev/) tool, it a simple build tool that takes care of extracting
|
||||
parameters, building the image and running the container. The tasks are all defined in [Taskfile.yaml](Taskfile.yaml).
|
||||
|
||||
You can optionally create an `.env` file, in the same repository root folder to override specific parameters. Right now
|
||||
only one optional env var is supported and that is `QUILIBRIUM_IMAGE_NAME`, if you want to change the default
|
||||
image name from `quilibrium` to something else. If you are pushing your images to Github then you have to follow the
|
||||
Github naming convention and use a name like `ghcr.io/mscurtescu/ceremonyclient`.
|
||||
|
||||
Bellow there are example interaction with `Task`.
|
||||
|
||||
The node version is extracted from [node/main.go](node/main.go). This version string is used to tag the image. The git
|
||||
repo, branch and commit are read throught the `git` command and depend on the current state of your working
|
||||
directory (one what branch and at what commit you are). These last three values are used to label the image.
|
||||
|
||||
List tasks:
|
||||
```shell
|
||||
task -l
|
||||
```
|
||||
|
||||
Show what parameters, like image name, version etc, will be used:
|
||||
```shell
|
||||
task status
|
||||
```
|
||||
|
||||
Build the image (aka run the `build` task):
|
||||
```shell
|
||||
task build
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
@ -70,6 +108,38 @@ docker compose up -d
|
||||
A `.config/` subfolder will be created under the current folder, this is mapped inside the container.
|
||||
Make sure you backup `config.yml` and `keys.yml`.
|
||||
|
||||
### Task
|
||||
|
||||
Similarly to building the image you can also use `Task`.
|
||||
|
||||
Start the container through docker compose:
|
||||
```shell
|
||||
task up
|
||||
```
|
||||
|
||||
Show the logs through docker compose:
|
||||
```shell
|
||||
task logs
|
||||
```
|
||||
|
||||
Drop into a shell inside the running container:
|
||||
```shell
|
||||
task shell
|
||||
```
|
||||
|
||||
Stop the running container(s):
|
||||
```shell
|
||||
task down
|
||||
```
|
||||
|
||||
Backup the critical configuration:
|
||||
```shell
|
||||
task backup
|
||||
```
|
||||
|
||||
The above command will create a `backup.tar.gz` archive in the current folder, you still have to copy this
|
||||
file from the server into a safe location. The command adds the `config.yml` and `keys.yml` files from
|
||||
the `.config/` subfolder to the archive, with the ownership of the current user.
|
||||
|
||||
### Resource management
|
||||
To ensure that your client performs optimally within a specific resource configuration, you can specify
|
||||
|
39
Dockerfile
39
Dockerfile
@ -1,23 +1,38 @@
|
||||
FROM golang:1.20.14-alpine3.19
|
||||
FROM golang:1.20.14-alpine3.19 as build
|
||||
|
||||
ARG GIT_COMMIT=unspecified
|
||||
ENV GOEXPERIMENT=arenas
|
||||
|
||||
WORKDIR /opt/ceremonyclient
|
||||
|
||||
COPY . .
|
||||
|
||||
WORKDIR /opt/ceremonyclient/node
|
||||
|
||||
RUN go install ./...
|
||||
RUN go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
|
||||
|
||||
FROM alpine:3.19
|
||||
|
||||
ARG GIT_REPO
|
||||
ARG GIT_BRANCH
|
||||
ARG GIT_COMMIT
|
||||
|
||||
ENV GOEXPERIMENT=arenas
|
||||
|
||||
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.source=$GIT_REPO
|
||||
LABEL org.opencontainers.image.ref.name=$GIT_BRANCH
|
||||
LABEL org.opencontainers.image.revision=$GIT_COMMIT
|
||||
|
||||
ENV GOEXPERIMENT=arenas
|
||||
COPY --from=build /go/bin/node /usr/local/bin
|
||||
COPY --from=build /go/bin/grpcurl /usr/local/bin
|
||||
COPY --from=build /opt/ceremonyclient/node/ceremony.json /root
|
||||
COPY --from=build /opt/ceremonyclient/node/retroactive_peers.json /root
|
||||
|
||||
WORKDIR /opt/ceremonyclient
|
||||
WORKDIR /root
|
||||
|
||||
COPY . .
|
||||
|
||||
WORKDIR /opt/ceremonyclient/node
|
||||
|
||||
RUN go mod download && go mod verify
|
||||
RUN go build ./...
|
||||
|
||||
ENTRYPOINT ["go", "run", "./..."]
|
||||
ENTRYPOINT ["node"]
|
||||
|
105
Taskfile.yaml
Normal file
105
Taskfile.yaml
Normal file
@ -0,0 +1,105 @@
|
||||
# https://taskfile.dev
|
||||
|
||||
version: '3'
|
||||
|
||||
dotenv:
|
||||
- '.env'
|
||||
|
||||
vars:
|
||||
VERSION:
|
||||
sh: cat node/main.go | grep "Quilibrium Node - v" | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
|
||||
PROJECT_NAME: quilibrium
|
||||
SERVICE_NAME: node
|
||||
GIT_REPO:
|
||||
sh: git config --get remote.origin.url
|
||||
GIT_BRANCH:
|
||||
sh: git rev-parse --abbrev-ref HEAD
|
||||
GIT_COMMIT:
|
||||
sh: git log -1 --format=%h
|
||||
|
||||
tasks:
|
||||
status:
|
||||
desc: Display configuration info.
|
||||
cmds:
|
||||
- echo -n "Image name:" && echo " ${QUILIBRIUM_IMAGE_NAME:-quilibrium}"
|
||||
- echo -n "Version :" && echo " {{.VERSION}}"
|
||||
- echo -n "Repo :" && echo " {{.GIT_REPO}}"
|
||||
- echo -n "Branch :" && echo " {{.GIT_BRANCH}}"
|
||||
- echo -n "Commit :" && echo " {{.GIT_COMMIT}}"
|
||||
silent: true
|
||||
|
||||
build:
|
||||
desc: Build the Quilibrium docker image, unless it is already built.
|
||||
cmds:
|
||||
- |
|
||||
docker build \
|
||||
--build-arg GIT_REPO={{.GIT_REPO}} \
|
||||
--build-arg GIT_BRANCH={{.GIT_BRANCH}} \
|
||||
--build-arg GIT_COMMIT={{.GIT_COMMIT}} \
|
||||
-t ${QUILIBRIUM_IMAGE_NAME:-quilibrium}:{{.VERSION}} \
|
||||
-t ${QUILIBRIUM_IMAGE_NAME:-quilibrium}:latest \
|
||||
.
|
||||
status:
|
||||
- |
|
||||
docker image inspect \
|
||||
${QUILIBRIUM_IMAGE_NAME:-quilibrium}:{{.VERSION}} \
|
||||
>/dev/null 2>/dev/null
|
||||
|
||||
up:
|
||||
desc: Run a new Quilibrium container, through docker compose.
|
||||
cmds:
|
||||
- docker compose up -d
|
||||
|
||||
down:
|
||||
desc: Take down the Quilibrium container, through docker compose.
|
||||
cmds:
|
||||
- docker compose down
|
||||
|
||||
shell:
|
||||
desc: Drop into a shell inside the running container.
|
||||
cmds:
|
||||
- docker compose exec -it {{.SERVICE_NAME}} sh
|
||||
|
||||
logs:
|
||||
desc: Print the logs of the running Quilibrium container.
|
||||
cmds:
|
||||
- docker compose logs
|
||||
|
||||
logs-folder:
|
||||
desc: Show where Docker stores the logs for the Quilibrium node. You need root permissions to access the folder.
|
||||
cmds:
|
||||
- "docker container inspect {{.PROJECT_NAME}}-{{.SERVICE_NAME}}-1 | grep LogPath | cut -d : -f 2 | cut -d '\"' -f 2 | xargs dirname"
|
||||
|
||||
backup:
|
||||
desc: Create a backup file with the critical configuration files.
|
||||
prompt: You will be prompted for root access. Make sure you verify the generated backup file. Continue?
|
||||
sources:
|
||||
- '.config/config.yml'
|
||||
- '.config/keys.yml'
|
||||
outputs:
|
||||
- 'backup.tar.gz'
|
||||
cmds:
|
||||
- |
|
||||
export TMP_DIR=$(mktemp -d)
|
||||
export TASK_DIR=$(pwd)
|
||||
sudo cp .config/config.yml $TMP_DIR
|
||||
sudo cp .config/keys.yml $TMP_DIR
|
||||
sudo chown $(whoami):$(id -gn) $TMP_DIR/*
|
||||
cd $TMP_DIR
|
||||
tar -czf $TASK_DIR/backup.tar.gz *
|
||||
cd $TASK_DIR
|
||||
sudo rm -rf $TMP_DIR
|
||||
echo "Backup saved to: backup.tar.gz"
|
||||
echo "Do not assume you have a backup unless you verify it!!!"
|
||||
silent: true
|
||||
|
||||
github:login:
|
||||
desc: Login to GitHub container registry.
|
||||
cmds:
|
||||
- echo $GITHUB_TOKEN | docker login ghcr.io -u $GITHUB_USERNAME --password-stdin
|
||||
|
||||
push:
|
||||
desc: Push Quilibrium docker image to the container registry.
|
||||
cmds:
|
||||
- docker push ${QUILIBRIUM_IMAGE_NAME:-quilibrium}:{{.VERSION}}
|
||||
- docker push ${QUILIBRIUM_IMAGE_NAME:-quilibrium}:latest
|
@ -7,8 +7,7 @@ name: quilibrium
|
||||
|
||||
services:
|
||||
node:
|
||||
build: ./
|
||||
image: quilibrium
|
||||
image: ${QUILIBRIUM_IMAGE_NAME:-quilibrium}
|
||||
restart: unless-stopped
|
||||
deploy:
|
||||
resources:
|
||||
@ -22,9 +21,15 @@ services:
|
||||
- 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
|
||||
- '127.0.0.1:8338:8338/tcp' # REST
|
||||
- '${QUILIBRIUM_P2P_PORT:-8336}:8336/udp' # p2p
|
||||
- '127.0.0.1:${QUILIBRIUM_GRPC_PORT:-8337}:8337/tcp' # gRPC
|
||||
- '127.0.0.1:${QUILIBRIUM_REST_PORT:-8338}:8338/tcp' # REST
|
||||
healthcheck:
|
||||
test: ["CMD", "node", "--peer-id"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 1m
|
||||
volumes:
|
||||
- ./.config:/opt/ceremonyclient/node/.config
|
||||
logging:
|
||||
|
Loading…
Reference in New Issue
Block a user