From a7bc7c0121cdce4a859de3540164755b12e90d3b Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 7 Jun 2020 16:21:25 -0400 Subject: [PATCH 1/3] Adding docker and docker-compose. --- .dockerignore | 3 +++ .gitignore | 1 + docker/Dockerfile | 30 ++++++++++++++++++++++++++++++ docker/docker-compose.yml | 15 +++++++++++++++ src/config.rs | 11 +++++++++-- 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..da63f55 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +target +.git +docker/volumes diff --git a/.gitignore b/.gitignore index a727c0a..e967360 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target /data +/docker/volumes diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..48bf41b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,30 @@ +# Build +FROM ekidd/rust-musl-builder:1.42.0-openssl11 as rust + +# Cache deps +WORKDIR /app +RUN sudo chown -R rust:rust . +RUN USER=root cargo new server +WORKDIR /app/server +COPY Cargo.toml Cargo.lock ./ +RUN sudo chown -R rust:rust . +RUN mkdir -p ./src/bin \ + && echo 'fn main() { println!("Dummy") }' > ./src/bin/main.rs +RUN cargo build --release +RUN rm -f ./target/x86_64-unknown-linux-musl/release/deps/pict_rs* +COPY src ./src/ + +# Build for release +RUN cargo build --frozen --release + +FROM alpine:3.10 + +# Copy resources +COPY --from=rust /app/server/target/x86_64-unknown-linux-musl/release/pict-rs /app/pict-rs + +RUN addgroup -g 1000 pictrs +RUN adduser -D -s /bin/sh -u 1000 -G pictrs pictrs +RUN chown pictrs:pictrs /app/pict-rs +USER pictrs +EXPOSE 8080 +CMD ["/app/pict-rs"] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..329fa34 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.3' + +services: + pictrs: + build: + context: ../ + dockerfile: docker/Dockerfile + user: root + ports: + - "127.0.0.1:8080:8080" + restart: always + environment: + - PICTRS_PATH=/app/data + volumes: + - ./volumes/pictrs:/app/data diff --git a/src/config.rs b/src/config.rs index 1a60f49..dd8c78a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,16 +5,23 @@ pub(crate) struct Config { #[structopt( short, long, - help = "The address and port the server binds to, e.g. 127.0.0.1:80" + env = "PICTRS_ADDR", + default_value = "0.0.0.0:8080", + help = "The address and port the server binds to. Default: 0.0.0.0:8080" )] addr: SocketAddr, - #[structopt(short, long, help = "The path to the data directory, e.g. data/")] + #[structopt( + short, + long, + env = "PICTRS_PATH", + help = "The path to the data directory, e.g. data/")] path: PathBuf, #[structopt( short, long, + env = "PICTRS_FORMAT", help = "An image format to convert all uploaded files into, supports 'jpg' and 'png'" )] format: Option, From 9ff134e6162f24a9a22ce725d174059fc526e11f Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 7 Jun 2020 16:43:04 -0400 Subject: [PATCH 2/3] Adding a prod docker and docker-compose. --- .dockerignore | 2 +- .gitignore | 2 +- README.md | 18 ++++++++++++++++++ docker/{ => dev}/Dockerfile | 0 docker/dev/deploy.sh | 28 ++++++++++++++++++++++++++++ docker/{ => dev}/docker-compose.yml | 4 ++-- docker/prod/docker-compose.yml | 13 +++++++++++++ 7 files changed, 63 insertions(+), 4 deletions(-) rename docker/{ => dev}/Dockerfile (100%) create mode 100644 docker/dev/deploy.sh rename docker/{ => dev}/docker-compose.yml (77%) create mode 100644 docker/prod/docker-compose.yml diff --git a/.dockerignore b/.dockerignore index da63f55..2739723 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,3 @@ target .git -docker/volumes +docker/dev/volumes diff --git a/.gitignore b/.gitignore index e967360..b95ca4c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /target /data -/docker/volumes +/docker/dev/volumes diff --git a/README.md b/README.md index 05f32c0..a6e80d7 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,24 @@ Running locally, port 8080, storing data in data/, and only allowing the `thumbn $ ./pict-rs -a 127.0.0.1:8080 -p data/ -w thumbnail identity ``` +#### Docker +Run the following commands: +``` +# Create a folder for the files (anywhere works) +mkdir /pict-rs +cd /pict-rs +wget https://git.asonix.dog/asonix/pict-rs/raw/branch/master/docker/prod/docker-compose.yml +sudo docker-compose up -d +``` + +#### Docker Development +Run the following to develop in docker: +``` +git clone https://git.asonix.dog/asonix/pict-rs +cd pict-rs/docker/dev +docker-compose up --build +``` + ### API pict-rs offers four endpoints: - `POST /image` for uploading an image. Uploaded content must be valid multipart/form-data with an diff --git a/docker/Dockerfile b/docker/dev/Dockerfile similarity index 100% rename from docker/Dockerfile rename to docker/dev/Dockerfile diff --git a/docker/dev/deploy.sh b/docker/dev/deploy.sh new file mode 100644 index 0000000..716f944 --- /dev/null +++ b/docker/dev/deploy.sh @@ -0,0 +1,28 @@ +# To deploy, run ./deploy [tag] +#!/bin/sh +git checkout master + +# Creating the new tag +new_tag="$1" + +# Changing the docker-compose prod +sed -i "s/asonix\/pictrs:.*/asonix\/pictrs:$new_tag/" ../prod/docker-compose.yml +git add ../prod/docker-compose.yml + +# The commit +git commit -m"Version $new_tag" +git tag $new_tag + +# Rebuilding docker +docker-compose build +docker tag dev_pictrs:latest asonix/pictrs:x64-$new_tag +docker push asonix/pictrs:x64-$new_tag + +# Build for Raspberry Pi / other archs +# TODO + +docker manifest push asonix/pictrs:$new_tag + +# Push +git push origin $new_tag +git push diff --git a/docker/docker-compose.yml b/docker/dev/docker-compose.yml similarity index 77% rename from docker/docker-compose.yml rename to docker/dev/docker-compose.yml index 329fa34..a19c019 100644 --- a/docker/docker-compose.yml +++ b/docker/dev/docker-compose.yml @@ -3,8 +3,8 @@ version: '3.3' services: pictrs: build: - context: ../ - dockerfile: docker/Dockerfile + context: ../../ + dockerfile: docker/dev/Dockerfile user: root ports: - "127.0.0.1:8080:8080" diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml new file mode 100644 index 0000000..d73cbf5 --- /dev/null +++ b/docker/prod/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.3' + +services: + pictrs: + image: asonix/pictrs:v0.0.1 + user: root + ports: + - "127.0.0.1:8080:8080" + restart: always + environment: + - PICTRS_PATH=/app/data + volumes: + - ./volumes/pictrs:/app/data From 0e7d4fc34f44012193de35d240846e892a54d941 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 7 Jun 2020 18:29:22 -0400 Subject: [PATCH 3/3] Upgrading rust-musl and alpine, adding filter env var. --- docker/dev/Dockerfile | 4 ++-- src/config.rs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index 48bf41b..abe394b 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -1,5 +1,5 @@ # Build -FROM ekidd/rust-musl-builder:1.42.0-openssl11 as rust +FROM ekidd/rust-musl-builder:1.44.0 as rust # Cache deps WORKDIR /app @@ -17,7 +17,7 @@ COPY src ./src/ # Build for release RUN cargo build --frozen --release -FROM alpine:3.10 +FROM alpine:3.11 # Copy resources COPY --from=rust /app/server/target/x86_64-unknown-linux-musl/release/pict-rs /app/pict-rs diff --git a/src/config.rs b/src/config.rs index 8ea873a..40a56f9 100644 --- a/src/config.rs +++ b/src/config.rs @@ -22,13 +22,14 @@ pub(crate) struct Config { short, long, env = "PICTRS_FORMAT", - help = "An image format to convert all uploaded files into, supports 'jpg' and 'png'" + help = "An optional image format to convert all uploaded files into, supports 'jpg' and 'png'" )] format: Option, #[structopt( short, long, + env = "PICTRS_FILTER_WHITELIST", help = "An optional list of filters to whitelist, supports 'identity', 'thumbnail', and 'blur'" )] whitelist: Option>,