Docker integration (#23)

* Add Dockerfile

Signed-off-by: trivernis <trivernis@protonmail.com>

* Fix docker build

Signed-off-by: trivernis <trivernis@protonmail.com>

* Remove build-essential package from runtime container

Signed-off-by: trivernis <trivernis@protonmail.com>

* Swap postgresql-client for libpq5 in docker build

Signed-off-by: trivernis <trivernis@protonmail.com>

* Add docker action

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/24/head
Trivernis 3 years ago committed by GitHub
parent d81b815a12
commit a4d58d33f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
target
.env

@ -0,0 +1,47 @@
name: Build and Test
on:
workflow_dispatch:
push:
branches: [ main, actions ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: ${{github.event.inputs.platforms}}
push: true
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
tags: |
trivernis/tobi:latest

@ -0,0 +1,24 @@
# syntax=docker/dockerfile:1.0-experimental
FROM rust:latest AS builder
RUN apt-get update
RUN apt-get install -y build-essential libssl-dev libopus-dev libpq-dev
WORKDIR /usr/src
RUN USER=root cargo new tobi
WORKDIR /usr/src/tobi
COPY Cargo.toml Cargo.lock ./
COPY src ./src
COPY bot-coreutils ./bot-coreutils
COPY bot-database ./bot-database
COPY bot-serenityutils ./bot-serenityutils
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=target \
cargo build --release
RUN mkdir /tmp/tobi
RUN --mount=type=cache,target=target cp target/release/tobi-rs /tmp/tobi/
FROM bitnami/minideb:latest
RUN install_packages openssl libopus0 ffmpeg python3 python3-pip libpq5
RUN pip3 install youtube-dl
RUN rm -rf /var/lib/{apt,dpkg,cache,log}/
COPY --from=builder /tmp/tobi/tobi-rs .
ENTRYPOINT ["/tobi-rs"]

@ -4,9 +4,9 @@ extern crate diesel;
#[macro_use]
extern crate diesel_migrations;
use crate::error::DatabaseResult;
use crate::error::{DatabaseError, DatabaseResult};
use diesel::prelude::*;
use diesel::r2d2::{ConnectionManager, Pool};
use diesel::r2d2::{ConnectionManager, ManageConnection, Pool};
use std::env;
pub mod database;
@ -22,11 +22,16 @@ type PoolConnection = Pool<ConnectionManager<PgConnection>>;
embed_migrations!("../bot-database/migrations");
fn get_connection() -> DatabaseResult<PoolConnection> {
dotenv::dotenv()?;
let database_url = env::var("DATABASE_URL").expect("No DATABASE_URL in path");
log::debug!("Establishing database connection...");
let manager = ConnectionManager::<PgConnection>::new(database_url);
log::trace!("Connecting...");
manager
.connect()
.map_err(|e| DatabaseError::Msg(format!("{:?}", e)))?;
log::trace!("Creating pool...");
let pool = Pool::builder().max_size(16).build(manager)?;
log::trace!("Getting one connection to run migrations...");
let connection = pool.get()?;
log::debug!("Running migrations...");
embedded_migrations::run(&connection)?;

@ -15,8 +15,12 @@ pub static VERSION: &str = env!("CARGO_PKG_VERSION");
#[tokio::main]
async fn main() {
let _ = dotenv::dotenv();
init_logger();
let mut client = get_client().await.unwrap();
let mut client = get_client()
.await
.map_err(|e| log::error!("Failed to get client: {:?}", e))
.expect("Failed to get client");
// start listening for events by starting a single shard
if let Err(why) = client.start_autosharded().await {

Loading…
Cancel
Save