diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..2739723 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +target +.git +docker/dev/volumes diff --git a/.gitignore b/.gitignore index a727c0a..b95ca4c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target /data +/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/dev/Dockerfile b/docker/dev/Dockerfile new file mode 100644 index 0000000..abe394b --- /dev/null +++ b/docker/dev/Dockerfile @@ -0,0 +1,30 @@ +# Build +FROM ekidd/rust-musl-builder:1.44.0 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.11 + +# 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/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/dev/docker-compose.yml b/docker/dev/docker-compose.yml new file mode 100644 index 0000000..a19c019 --- /dev/null +++ b/docker/dev/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.3' + +services: + pictrs: + build: + context: ../../ + dockerfile: docker/dev/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/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 diff --git a/src/config.rs b/src/config.rs index 9b82211..40a56f9 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,23 +5,31 @@ 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, - help = "An image format to convert all uploaded files into, supports 'jpg' and 'png'" + env = "PICTRS_FORMAT", + 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>,