Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Docker stuff #28

Merged
merged 5 commits into from
Aug 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading