Skip to content

Commit

Permalink
feat: Docker stuff (#28)
Browse files Browse the repository at this point in the history
* fix(misc): Documentation

* fix(misc): docs

* feat(docker): Docker

* feat(docker):
  • Loading branch information
akhercha authored Aug 22, 2024
1 parent 36d020a commit 656e211
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 2 deletions.
135 changes: 135 additions & 0 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
---
name: Task - Build and Push Docker Image

on:
workflow_dispatch:
inputs:
release_tag_name:
description: "Release tag name"
type: string
required: true
docker_context:
description: "Docker context"
type: string
required: true
package_name:
description: "Package name"
type: string
required: true
workflow_call:
inputs:
release_tag_name:
description: "Release tag name"
type: string
required: true
docker_context:
description: "Docker context"
type: string
required: true
package_name:
description: "Package name"
type: string
required: true

jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ inputs.package_name }}
tags: |
type=raw,value=${{ inputs.release_tag_name }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push by digest
id: build
uses: docker/build-push-action@v4
with:
context: ${{ inputs.docker_context }}
file: Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ inputs.package_name
}},push-by-digest=true,name-canonical=true,push=true

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v3
with:
name: digests
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Download digests
uses: actions/download-artifact@v3
with:
name: digests
path: /tmp/digests

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ inputs.package_name }}
tags: |
type=raw,value=${{ inputs.release_tag_name }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Create manifest list and push
working-directory: /tmp/digests
run: |
tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")
if [[ -z "$tags" ]]; then
echo "No tags specified, skipping docker buildx imagetools create command"
else
docker buildx imagetools create $tags \
$(printf '${{ inputs.package_name }}@sha256:%s ' *)
fi
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ inputs.package_name }}:${{ steps.meta.outputs.version }}
16 changes: 16 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Workflow - Release

on:
workflow_dispatch:
release:
types: [published]

jobs:
docker_release_build:
name: Docker release build
uses: ./.github/workflows/docker-build.yml
with:
release_tag_name: ${{ github.event.release.tag_name }}
docker_context: .
package_name: ghcr.io/vesu-liquidator
24 changes: 24 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# ====== Build stage ======
FROM rust:1.80 AS builder

COPY . .

RUN apt-get update && \
apt-get install -y pkg-config protobuf-compiler libprotobuf-dev libssl-dev

RUN cargo build --release

# ====== Run stage ======
FROM ubuntu:24.04 AS runner

RUN apt-get update && \
apt-get install -y tini ca-certificates && \
apt-get autoremove -y && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

COPY --from=builder /target/release/vesu-liquidator /usr/local/bin/vesu-liquidator
COPY --from=builder /config.yaml .

ENTRYPOINT ["tini", "--", "vesu-liquidator"]
CMD ["--help"]
81 changes: 81 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,60 @@

## Getting Started

### Docker through published package

You can run the Vesu Liquidator using our pre-built Docker image. Here's how to use it:

1. Pull the latest image:

```sh
docker pull ghcr.io/astraly-labs/vesu-liquidator:latest
```

1. Run the container:

```sh
docker run --rm -it \
-v /path/to/your/.env:/app/.env \
ghcr.io/astraly-labs/vesu-liquidator:latest \
--account-address <LIQUIDATOR_ACCOUNT_ADDRESS> \
--network <NETWORK_NAME> \
--rpc-url <RPC_URL> \
--starting-block <BLOCK_NUMBER> \
--pragma-api-base-url <PRAGMA_API_BASE_URL>
```

For more options, run:

```bash
docker run --rm ghcr.io/astraly-labs/vesu-liquidator:latest --help
```

### Docker locally

If you want to build the Docker image locally:

1. Build the Docker image:

```sh
docker build -t vesu-liquidator .
```

2. Run the locally built image:

```sh
docker run --rm vesu-liquidator --help
# OR
docker run --rm -it \
-v /path/to/your/.env:/app/.env \
vesu-liquidator \
--account-address <LIQUIDATOR_ACCOUNT_ADDRESS> \
--network <NETWORK_NAME> \
--rpc-url <RPC_URL> \
--starting-block <BLOCK_NUMBER> \
--pragma-api-base-url <PRAGMA_API_BASE_URL>
```

### Prerequisites

#### Protobuf
Expand Down Expand Up @@ -125,3 +179,30 @@ Should run the bot:

# rest of the execution...
```

## Project assistance

If you want to say **thank you** or/and support:

- Add a [GitHub Star](https://github.com/astraly-labs/Vesu-liquidator) to the project.
- Tweet about it.
- Write interesting articles about the project on [Dev.to](https://dev.to/), [Medium](https://medium.com/) or your personal blog.

## Contributing

First off, thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**.

Please read [our contribution guidelines](docs/CONTRIBUTING.md), and thank you for being involved!

## Security

We follows good practices of security, but 100% security cannot be assured.
The bot is provided **"as is"** without any **warranty**. Use at your own risk.

_For more information and to report security issues, please refer to our [security documentation](docs/SECURITY.md)._

## License

This project is licensed under the **MIT license**.

See [LICENSE](LICENSE) for more information.
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ fn print_app_title(account_address: Felt, network: NetworkName, starting_block:

#[tokio::main]
async fn main() -> Result<()> {
dotenvy::dotenv()?;
let _ = dotenvy::dotenv();
setup_tracing();

let mut run_cmd: RunCmd = RunCmd::parse();
Expand Down
3 changes: 2 additions & 1 deletion src/services/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pub mod monitoring;
pub mod oracle;

use oracle::{LatestOraclePrices, OracleService};
use std::sync::Arc;
use std::{sync::Arc, time::Duration};
use url::Url;

use anyhow::{Context, Result};
Expand Down Expand Up @@ -42,6 +42,7 @@ pub async fn start_all_services(
);

tracing::info!("⏳ Waiting a few moment for the indexer to fetch positions...\n");
tokio::time::sleep(Duration::from_secs(10)).await;

let latest_oracle_prices = LatestOraclePrices::from_config(&config);
tracing::info!("🧩 Starting the oracle service...");
Expand Down

0 comments on commit 656e211

Please sign in to comment.