Optimise docker (#34)

* Smaller dockerfile, better error handling

* Add config dir
This commit is contained in:
Ellie Huxtable 2021-04-14 18:40:50 +01:00 committed by GitHub
parent 983f9e6b7b
commit f6de558070
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 144 additions and 25 deletions

View File

@ -1 +1,2 @@
./target ./target
Dockerfile

82
Cargo.lock generated
View File

@ -2,6 +2,21 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "addr2line"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]] [[package]]
name = "aead" name = "aead"
version = "0.2.0" version = "0.2.0"
@ -120,6 +135,7 @@ dependencies = [
"eyre", "eyre",
"fern", "fern",
"fork", "fork",
"human-panic",
"indicatif", "indicatif",
"itertools", "itertools",
"log 0.4.14", "log 0.4.14",
@ -150,6 +166,20 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "backtrace"
version = "0.3.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc"
dependencies = [
"addr2line",
"cfg-if 1.0.0",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.9.3" version = "0.9.3"
@ -822,6 +852,12 @@ dependencies = [
"polyval", "polyval",
] ]
[[package]]
name = "gimli"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.0" version = "0.3.0"
@ -937,6 +973,21 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
[[package]]
name = "human-panic"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39f357a500abcbd7c5f967c1d45c8838585b36743823b9d43488f24850534e36"
dependencies = [
"backtrace",
"os_type",
"serde 1.0.125",
"serde_derive",
"termcolor",
"toml 0.5.8",
"uuid",
]
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.10.16" version = "0.10.16"
@ -1261,6 +1312,16 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
[[package]]
name = "miniz_oxide"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
dependencies = [
"adler",
"autocfg",
]
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.6.23" version = "0.6.23"
@ -1501,6 +1562,12 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
[[package]]
name = "object"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4"
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.5.2" version = "1.5.2"
@ -1546,6 +1613,15 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "os_type"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edc011af0ae98b7f88cf7e4a83b70a54a75d2b8cb013d6efd02e5956207e9eb"
dependencies = [
"regex",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.11.1" version = "0.11.1"
@ -2142,6 +2218,12 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2"
[[package]]
name = "rustc-demangle"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
[[package]] [[package]]
name = "rustc-serialize" name = "rustc-serialize"
version = "0.3.24" version = "0.3.24"

View File

@ -39,6 +39,7 @@ fork = "0.1.18"
parse_duration = "2.1.1" parse_duration = "2.1.1"
rand = "0.8.3" rand = "0.8.3"
rust-crypto = "^0.2" rust-crypto = "^0.2"
human-panic = "1.0.3"
[dependencies.rusqlite] [dependencies.rusqlite]
version = "0.25" version = "0.25"

View File

@ -1,12 +1,34 @@
# no point in tagging the rust version, currently using nightly FROM rust as builder
FROM rust:slim-buster
RUN apt update && apt -y install libssl-dev libpq-dev pkg-config make
RUN rustup default nightly RUN rustup default nightly
RUN cargo new --bin atuin
WORKDIR /atuin WORKDIR /atuin
COPY . /atuin COPY ./Cargo.toml ./Cargo.toml
COPY ./Cargo.lock ./Cargo.lock
RUN cargo build --release RUN cargo build --release
ENTRYPOINT ["/atuin/target/release/atuin"] RUN rm src/*.rs
ADD . ./
RUN rm ./target/release/deps/atuin*
RUN cargo build --release
FROM debian:buster-slim
RUN apt-get update \
&& apt-get install -y ca-certificates tzdata libpq-dev \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 8888
ENV TZ=Etc/UTC
ENV RUST_LOG=info
ENV ATUIN_CONFIG=/config/config.toml
COPY --from=builder /atuin/target/release/atuin ./atuin
ENTRYPOINT ["./atuin"]

View File

@ -1,5 +1,5 @@
<h1 align="center"> <h1 align="center">
A'tuin A'Tuin
</h1> </h1>
<blockquote align="center"> <blockquote align="center">
Through the fathomless deeps of space swims the star turtle Great ATuin, bearing on its back the four giant elephants who carry on their shoulders the mass of the Discworld. Through the fathomless deeps of space swims the star turtle Great ATuin, bearing on its back the four giant elephants who carry on their shoulders the mass of the Discworld.
@ -12,11 +12,11 @@
<a href="https://github.com/ellie/atuin/blob/main/LICENSE"><img src="https://img.shields.io/crates/l/atuin.svg?style=flat-square" /></a> <a href="https://github.com/ellie/atuin/blob/main/LICENSE"><img src="https://img.shields.io/crates/l/atuin.svg?style=flat-square" /></a>
</p> </p>
A'tuin manages and synchronizes your shell history! Instead of storing A'Tuin manages and synchronizes your shell history! Instead of storing
everything in a text file (such as ~/.history), A'tuin uses a sqlite database. everything in a text file (such as ~/.history), A'Tuin uses a sqlite database.
While being a little more complex, this allows for more functionality. While being a little more complex, this allows for more functionality.
As well as the expected command, A'tuin stores As well as the expected command, A'Tuin stores
- duration - duration
- exit code - exit code
@ -33,7 +33,7 @@ As well as the expected command, A'tuin stores
### AUR ### AUR
A'tuin is available on the [AUR](https://aur.archlinux.org/packages/atuin/) A'Tuin is available on the [AUR](https://aur.archlinux.org/packages/atuin/)
``` ```
yay -S atuin # or your AUR helper of choice yay -S atuin # or your AUR helper of choice
@ -73,7 +73,7 @@ to your `.zshrc`/`.bashrc`/whatever your shell uses.
### History search ### History search
By default A'tuin will rebind ctrl-r and the up arrow to search your history. By default A'Tuin will rebind ctrl-r and the up arrow to search your history.
You can prevent this by putting You can prevent this by putting
@ -119,7 +119,7 @@ atuin h l -s # similarly short
### Stats ### Stats
A'tuin can calculate statistics for a single day, and accepts "natural language" style date input, as well as absolute dates: A'Tuin can calculate statistics for a single day, and accepts "natural language" style date input, as well as absolute dates:
``` ```
$ atuin stats day last friday $ atuin stats day last friday
@ -155,7 +155,7 @@ $ atuin stats all
## Config ## Config
A'tuin is configurable via TOML. The file lives at ` ~/.config/atuin/config.toml`, A'Tuin is configurable via TOML. The file lives at ` ~/.config/atuin/config.toml`,
and looks like this: and looks like this:
``` ```
@ -169,5 +169,5 @@ path = "~/.local/share/atuin/history.db" # the local database for history
## ...what's with the name? ## ...what's with the name?
A'tuin is named after "The Great A'tuin", a giant turtle from Terry Pratchett's A'Tuin is named after "The Great A'Tuin", a giant turtle from Terry Pratchett's
Discworld series of books. Discworld series of books.

View File

@ -29,9 +29,8 @@ impl Cmd {
); );
let port = port.map_or(settings.server.port, |p| p); let port = port.map_or(settings.server.port, |p| p);
server::launch(settings, host, port); server::launch(settings, host, port)
} }
} }
Ok(())
} }
} }

View File

@ -6,6 +6,7 @@
use std::path::PathBuf; use std::path::PathBuf;
use eyre::{eyre, Result}; use eyre::{eyre, Result};
use human_panic::setup_panic;
use structopt::{clap::AppSettings, StructOpt}; use structopt::{clap::AppSettings, StructOpt};
#[macro_use] #[macro_use]
@ -73,6 +74,7 @@ impl Atuin {
} }
fn main() -> Result<()> { fn main() -> Result<()> {
setup_panic!();
let settings = Settings::new()?; let settings = Settings::new()?;
fern::Dispatch::new() fern::Dispatch::new()

View File

@ -1,5 +1,6 @@
use diesel::pg::PgConnection; use diesel::pg::PgConnection;
use diesel::prelude::*; use diesel::prelude::*;
use eyre::{eyre, Result};
use crate::settings::Settings; use crate::settings::Settings;
@ -7,8 +8,15 @@ use crate::settings::Settings;
pub struct AtuinDbConn(diesel::PgConnection); pub struct AtuinDbConn(diesel::PgConnection);
// TODO: connection pooling // TODO: connection pooling
pub fn establish_connection(settings: &Settings) -> PgConnection { pub fn establish_connection(settings: &Settings) -> Result<PgConnection> {
if settings.server.db_uri == "default_uri" {
Err(eyre!(
"Please configure your database! Set db_uri in config.toml"
))
} else {
let database_url = &settings.server.db_uri; let database_url = &settings.server.db_uri;
PgConnection::establish(database_url) let conn = PgConnection::establish(database_url)?;
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
Ok(conn)
}
} }

View File

@ -1,5 +1,3 @@
use rocket::config::{Config, Environment, LoggingLevel, Value};
use std::collections::HashMap; use std::collections::HashMap;
use crate::remote::database::establish_connection; use crate::remote::database::establish_connection;
@ -7,6 +5,9 @@ use crate::settings::Settings;
use super::database::AtuinDbConn; use super::database::AtuinDbConn;
use eyre::Result;
use rocket::config::{Config, Environment, LoggingLevel, Value};
// a bunch of these imports are generated by macros, it's easier to wildcard // a bunch of these imports are generated by macros, it's easier to wildcard
#[allow(clippy::clippy::wildcard_imports)] #[allow(clippy::clippy::wildcard_imports)]
use super::views::*; use super::views::*;
@ -16,7 +17,7 @@ use super::auth::*;
embed_migrations!("migrations"); embed_migrations!("migrations");
pub fn launch(settings: &Settings, host: String, port: u16) { pub fn launch(settings: &Settings, host: String, port: u16) -> Result<()> {
let settings: Settings = settings.clone(); // clone so rocket can manage it let settings: Settings = settings.clone(); // clone so rocket can manage it
let mut database_config = HashMap::new(); let mut database_config = HashMap::new();
@ -25,7 +26,8 @@ pub fn launch(settings: &Settings, host: String, port: u16) {
database_config.insert("url", Value::from(settings.server.db_uri.clone())); database_config.insert("url", Value::from(settings.server.db_uri.clone()));
databases.insert("atuin", Value::from(database_config)); databases.insert("atuin", Value::from(database_config));
let connection = establish_connection(&settings); let connection = establish_connection(&settings)?;
embedded_migrations::run(&connection).expect("failed to run migrations"); embedded_migrations::run(&connection).expect("failed to run migrations");
let config = Config::build(Environment::Production) let config = Config::build(Environment::Production)
@ -54,4 +56,6 @@ pub fn launch(settings: &Settings, host: String, port: u16) {
.attach(AtuinDbConn::fairing()) .attach(AtuinDbConn::fairing())
.register(catchers![internal_error, bad_request]) .register(catchers![internal_error, bad_request])
.launch(); .launch();
Ok(())
} }

View File

@ -133,7 +133,7 @@ impl Settings {
s.set_default("server.host", "127.0.0.1")?; s.set_default("server.host", "127.0.0.1")?;
s.set_default("server.port", 8888)?; s.set_default("server.port", 8888)?;
s.set_default("server.open_registration", false)?; s.set_default("server.open_registration", false)?;
s.set_default("server.db_uri", "DEFAULT POSTGRES URI, PLEASE CHANGE")?; s.set_default("server.db_uri", "default_uri")?;
if config_file.exists() { if config_file.exists() {
s.merge(ConfigFile::with_name(config_file.to_str().unwrap()))?; s.merge(ConfigFile::with_name(config_file.to_str().unwrap()))?;