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

fix: dockerfile and release pipeline #2

Merged
merged 1 commit into from
Nov 15, 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
7 changes: 7 additions & 0 deletions .cz.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[tool.commitizen]
name = "cz_conventional_commits"
tag_format = "v$version"
major_version_zero = true
update_changelog_on_bump = true
version = "0.0.0"
version_files = ["Cargo.toml:^version"]
78 changes: 78 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Release

on:
workflow_dispatch:

jobs:
bump-versions:
name: Bump Versions
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0

- id: cz
name: Bump Version, Create Tag and Changelog
uses: commitizen-tools/commitizen-action@master
with:
github_token: ${{ secrets.GH_ACCESS_TOKEN }}
changelog_increment_filename: body.md

- name: Create Release
uses: softprops/action-gh-release@v2
with:
body_path: "body.md"
tag_name: ${{ env.REVISION }}
env:
GITHUB_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}

- name: Print Version
run: echo "Bumped to version ${{ steps.cz.outputs.version }}"

release:
name: Release
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read

steps:
- name: Checkout
uses: actions/checkout@v4

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

- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Extract metadata for Docker
id: docker-metadata
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/traceloop/hub # GitHub
traceloop/hub # Docker Hub
tags: |
type=ref,event=branch
type=ref,event=pr
type=sha
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ steps.docker-metadata.outputs.tags }}
labels: ${{ steps.docker-metadata.outputs.labels }}
platforms: |
linux/amd64
${{ startsWith(github.ref, 'refs/tags/') && 'linux/arm64' || '' }}
40 changes: 20 additions & 20 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "gateway"
version = "0.1.0"
name = "hub"
version = "0.0.1"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand All @@ -17,6 +17,6 @@ tracing-subscriber = "0.3"
serde_yaml = "0.9"
tower = { version = "0.5.1", features = ["full"]}
anyhow = "1.0.92"
tower-http = { version = "0.6.1", features = ["full"]}
tower-http = { version = "0.6.1", features = ["full"] }
uuid = "1.11.0"
chrono = "0.4.38"
47 changes: 19 additions & 28 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,35 +1,26 @@
ARG RUST_VERSION=1.82.0
ARG APP_NAME=gateway
FROM rust:${RUST_VERSION}-slim-bookworm AS build
ARG APP_NAME
FROM lukemathwalker/cargo-chef:0.1.68-rust-1.82-bookworm AS chef
WORKDIR /app

RUN --mount=type=bind,source=src,target=src \
--mount=type=bind,source=Cargo.toml,target=Cargo.toml \
--mount=type=bind,source=Cargo.lock,target=Cargo.lock \
--mount=type=cache,target=/app/target/ \
--mount=type=cache,target=/usr/local/cargo/registry/ \
<<EOF
set -e
cargo build --locked --release
cp ./target/release/$APP_NAME /bin/server
EOF
FROM chef AS planner
COPY . .
RUN cargo chef prepare --recipe-path recipe.json

FROM debian:bookworm-slim AS final
FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
# Build dependencies - this is the caching Docker layer!
RUN cargo chef cook --release --recipe-path recipe.json
# Build application
COPY . .
RUN cargo build --release --bin hub

ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
USER appuser

COPY --from=build /bin/server /bin/
# We do not need the Rust toolchain to run the binary!
FROM debian:bookworm-slim AS runtime
RUN apt-get update && apt-get install -y openssl ca-certificates
WORKDIR /app
COPY --from=builder /app/target/release/hub /usr/local/bin
WORKDIR /etc

ENV PORT 3000
EXPOSE 3000

CMD ["/bin/server"]
ENTRYPOINT ["/usr/local/bin/hub", "/etc/config.yaml"]
68 changes: 67 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,67 @@
# gateway
<h1 align="center">
Traceloop Hub
</h1>
<p align="center">
<p align="center">Open-source, high-performance LLM gateway written in Rust. Connect to any LLM provider with a single API. Observability Included.</p>
</p>
<h4 align="center">
<a href="https://traceloop.com/docs/hub/getting-started"><strong>Get started »</strong></a>
<br />
<br />
<a href="https://traceloop.com/slack">Slack</a> |
<a href="https://traceloop.com/docs/hub">Docs</a>
</h4>

<h4 align="center">
<a href="https://github.com/traceloop/hub/releases">
<img src="https://img.shields.io/github/release/traceloop/hub">
</a>
<a href="https://github.com/traceloop/hub/blob/main/LICENSE">
<img src="https://img.shields.io/badge/license-Apache 2.0-blue.svg" alt="Traceloop Hub is released under the Apache-2.0 License">
</a>
<a href="https://github.com/traceloop/hub/actions/workflows/ci.yml">
<img src="https://github.com/traceloop/hub/actions/workflows/ci.yml/badge.svg">
</a>
<a href="https://github.com/traceloop/hub/issues">
<img src="https://img.shields.io/github/commit-activity/m/traceloop/hub" alt="git commit activity" />
</a>
<a href="https://www.ycombinator.com/companies/traceloop"><img src="https://img.shields.io/website?color=%23f26522&down_message=Y%20Combinator&label=Backed&logo=ycombinator&style=flat-square&up_message=Y%20Combinator&url=https%3A%2F%2Fwww.ycombinator.com"></a>
<a href="https://github.com/traceloop/hub/blob/main/CONTRIBUTING.md">
<img src="https://img.shields.io/badge/PRs-Welcome-brightgreen" alt="PRs welcome!" />
</a>
<a href="https://traceloop.com/slack">
<img src="https://img.shields.io/badge/chat-on%20Slack-blueviolet" alt="Slack community channel" />
</a>
<a href="https://twitter.com/traceloopdev">
<img src="https://img.shields.io/badge/follow-%40traceloopdev-1DA1F2?logo=twitter&style=social" alt="Traceloop Twitter" />
</a>
</h4>

Hub is a next generation smart proxy for LLM applications. It centralizes control and tracing of all LLM calls and traces.
It's built in Rust so it's fast and efficient. It's completely open-source and free to use.

Built and maintained by Traceloop under the Apache 2.0 license.

## 🚀 Getting Started

You can run the hub locally by running `cargo run` in the root directory, or using the docker image:

```
docker run --rm -v $(pwd)/config.yaml:/etc/config.yaml:ro -t hub
```

## 🌱 Contributing

Whether big or small, we love contributions ❤️ Check out our guide to see how to [get started](https://traceloop.com/docs/hub/contributing/overview).

Not sure where to get started? You can:

- [Book a free pairing session with one of our teammates](mailto:[email protected]?subject=Pairing%20session&body=I'd%20like%20to%20do%20a%20pairing%20session!)!
- Join our <a href="https://traceloop.com/slack">Slack</a>, and ask us any questions there.

## 💚 Community & Support

- [Slack](https://traceloop.com/slack) (For live discussion with the community and the Traceloop team)
- [GitHub Discussions](https://github.com/traceloop/hub/discussions) (For help with building and deeper conversations about features)
- [GitHub Issues](https://github.com/traceloop/hub/issues) (For any bugs and errors you encounter using OpenLLMetry)
- [Twitter](https://twitter.com/traceloopdev) (Get news fast)
8 changes: 5 additions & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
use gateway::{config::lib::load_config, routes, state::AppState};
use hub::{config::lib::load_config, routes, state::AppState};
use std::sync::Arc;
use tracing::info;

#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
tracing_subscriber::fmt::init();

info!("Starting the application...");
info!("Starting Traceloop Hub...");

let config = load_config("config.yaml")
let config_path = std::env::args().nth(1).unwrap_or("config.yaml".to_string());
info!("Loading configuration from {}", config_path);
let config = load_config(&config_path)
.map_err(|e| anyhow::anyhow!("Failed to load configuration: {}", e))?;
let state = Arc::new(
AppState::new(config).map_err(|e| anyhow::anyhow!("Failed to create app state: {}", e))?,
Expand Down