summaryrefslogtreecommitdiffstats
path: root/docker/prod
diff options
context:
space:
mode:
Diffstat (limited to 'docker/prod')
-rw-r--r--docker/prod/Dockerfile58
-rw-r--r--docker/prod/Dockerfile.aarch6480
-rw-r--r--docker/prod/Dockerfile.armv7hf81
-rw-r--r--docker/prod/Dockerfile.libc90
-rwxr-xr-xdocker/prod/deploy.sh80
5 files changed, 389 insertions, 0 deletions
diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile
new file mode 100644
index 00000000..b9eec456
--- /dev/null
+++ b/docker/prod/Dockerfile
@@ -0,0 +1,58 @@
+FROM node:10-jessie as node
+
+WORKDIR /app/ui
+
+# Cache deps
+COPY ui/package.json ui/yarn.lock ./
+RUN yarn install --pure-lockfile
+
+# Build
+COPY ui /app/ui
+RUN yarn 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 server/Cargo.toml server/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/lemmy_server*
+COPY server/src ./src/
+COPY server/migrations ./migrations/
+
+# Build for release
+RUN cargo build --frozen --release
+
+# reduce binary size
+RUN strip /app/server/target/x86_64-unknown-linux-musl/release/lemmy_server
+
+FROM ekidd/rust-musl-builder:1.42.0-openssl11 as docs
+WORKDIR /app
+COPY docs ./docs
+RUN sudo chown -R rust:rust .
+RUN mdbook build docs/
+
+
+FROM alpine:3.10
+
+# Install libpq for postgres
+RUN apk add libpq
+
+# Copy resources
+COPY server/config/defaults.hjson /config/defaults.hjson
+COPY --from=rust /app/server/target/x86_64-unknown-linux-musl/release/lemmy_server /app/lemmy
+COPY --from=docs /app/docs/book/ /app/dist/documentation/
+COPY --from=node /app/ui/dist /app/dist
+
+RUN addgroup -g 1000 lemmy
+RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
+RUN chown lemmy:lemmy /app/lemmy
+USER lemmy
+EXPOSE 8536
+CMD ["/app/lemmy"]
diff --git a/docker/prod/Dockerfile.aarch64 b/docker/prod/Dockerfile.aarch64
new file mode 100644
index 00000000..7a1c833f
--- /dev/null
+++ b/docker/prod/Dockerfile.aarch64
@@ -0,0 +1,80 @@
+FROM node:10-jessie as node
+
+WORKDIR /app/ui
+
+# Cache deps
+COPY ui/package.json ui/yarn.lock ./
+RUN yarn install --pure-lockfile
+
+# Build
+COPY ui /app/ui
+RUN yarn build
+
+
+# contains qemu-*-static for cross-compilation
+FROM multiarch/qemu-user-static as qemu
+
+
+FROM arm64v8/rust:1.40-buster as rust
+
+COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
+#COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin
+
+
+# Install musl
+#RUN apt-get update && apt-get install -y mc
+#RUN apt-get install -y musl-tools mc
+#libpq-dev mc
+#RUN rustup target add ${TARGET}
+
+# Cache deps
+WORKDIR /app
+RUN USER=root cargo new server
+WORKDIR /app/server
+COPY server/Cargo.toml server/Cargo.lock ./
+RUN mkdir -p ./src/bin \
+ && echo 'fn main() { println!("Dummy") }' > ./src/bin/main.rs
+RUN cargo build --release
+# RUN cargo build
+COPY server/src ./src/
+COPY server/migrations ./migrations/
+RUN rm -f ./target/release/deps/lemmy_server* ; rm -f ./target/debug/deps/lemmy_server*
+
+# build for release
+RUN cargo build --frozen --release
+
+# reduce binary size
+RUN strip /app/server/target/release/lemmy_server
+
+# Get diesel-cli on there just in case
+# RUN cargo install diesel_cli --no-default-features --features postgres
+
+# RUN cp /app/server/target/debug/lemmy_server /app/server/ready
+RUN cp /app/server/target/release/lemmy_server /app/server/ready
+
+#FROM alpine:3.10
+# debian because build with dynamic linking with debian:buster
+FROM arm64v8/debian:buster-slim as lemmy
+
+#COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin
+COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
+
+# Install libpq for postgres
+#RUN apk add libpq
+RUN apt-get update && apt-get install -y libpq5
+
+RUN addgroup --gid 1000 lemmy
+# for alpine
+#RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
+# for debian
+RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
+
+# Copy resources
+COPY server/config/defaults.hjson /config/defaults.hjson
+COPY --from=rust /app/server/ready /app/lemmy
+COPY --from=node /app/ui/dist /app/dist
+
+RUN chown lemmy:lemmy /app/lemmy
+USER lemmy
+EXPOSE 8536
+CMD ["/app/lemmy"]
diff --git a/docker/prod/Dockerfile.armv7hf b/docker/prod/Dockerfile.armv7hf
new file mode 100644
index 00000000..efd937a3
--- /dev/null
+++ b/docker/prod/Dockerfile.armv7hf
@@ -0,0 +1,81 @@
+FROM node:10-jessie as node
+
+WORKDIR /app/ui
+
+# Cache deps
+COPY ui/package.json ui/yarn.lock ./
+RUN yarn install --pure-lockfile
+
+# Build
+COPY ui /app/ui
+RUN yarn build
+
+
+# contains qemu-*-static for cross-compilation
+FROM multiarch/qemu-user-static as qemu
+
+
+FROM arm32v7/rust:1.37-buster as rust
+
+#COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
+COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin
+
+
+# Install musl
+#RUN apt-get update && apt-get install -y mc
+#RUN apt-get install -y musl-tools mc
+#libpq-dev mc
+#RUN rustup target add ${TARGET}
+
+# Cache deps
+WORKDIR /app
+RUN USER=root cargo new server
+WORKDIR /app/server
+COPY server/Cargo.toml server/Cargo.lock ./
+RUN mkdir -p ./src/bin \
+ && echo 'fn main() { println!("Dummy") }' > ./src/bin/main.rs
+#RUN cargo build --release
+# RUN cargo build
+ RUN RUSTFLAGS='-Ccodegen-units=1' cargo build
+COPY server/src ./src/
+COPY server/migrations ./migrations/
+RUN rm -f ./target/release/deps/lemmy_server* ; rm -f ./target/debug/deps/lemmy_server*
+
+
+# build for release
+RUN cargo build --frozen --release
+
+# reduce binary size
+RUN strip /app/server/target/debug/lemmy_server
+
+# Get diesel-cli on there just in case
+# RUN cargo install diesel_cli --no-default-features --features postgres
+
+RUN cp /app/server/target/debug/lemmy_server /app/server/ready
+#RUN cp /app/server/target/release/lemmy_server /app/server/ready
+
+#FROM alpine:3.10
+# debian because build with dynamic linking with debian:buster
+FROM arm32v7/debian:buster-slim as lemmy
+
+COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin
+
+# Install libpq for postgres
+#RUN apk add libpq
+RUN apt-get update && apt-get install -y libpq5
+
+RUN addgroup --gid 1000 lemmy
+# for alpine
+#RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
+# for debian
+RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
+
+# Copy resources
+COPY server/config/defaults.hjson /config/defaults.hjson
+COPY --from=rust /app/server/ready /app/lemmy
+COPY --from=node /app/ui/dist /app/dist
+
+RUN chown lemmy:lemmy /app/lemmy
+USER lemmy
+EXPOSE 8536
+CMD ["/app/lemmy"]
diff --git a/docker/prod/Dockerfile.libc b/docker/prod/Dockerfile.libc
new file mode 100644
index 00000000..9c750282
--- /dev/null
+++ b/docker/prod/Dockerfile.libc
@@ -0,0 +1,90 @@
+# can be build on x64, arm32, arm64 platforms
+# to build on target platform run
+# docker build -f Dockerfile.libc -t dessalines/lemmy:version ../..
+#
+# to use docker buildx run
+# docker buildx build --platform linux/amd64,linux/arm64 -f Dockerfile.libc -t YOURNAME/lemmy --push ../..
+
+FROM node:12-buster as node
+# use this if use docker buildx
+#FROM --platform=$BUILDPLATFORM node:12-buster as node
+
+WORKDIR /app/ui
+
+# Cache deps
+COPY ui/package.json ui/yarn.lock ./
+RUN yarn install --pure-lockfile --network-timeout 100000
+
+# Build
+COPY ui /app/ui
+RUN yarn build
+
+
+FROM rust:1.42 as rust
+
+# Cache deps
+WORKDIR /app
+
+RUN USER=root cargo new server
+WORKDIR /app/server
+COPY server/Cargo.toml server/Cargo.lock ./
+RUN mkdir -p ./src/bin \
+ && echo 'fn main() { println!("Dummy") }' > ./src/bin/main.rs
+
+
+RUN cargo build --release
+#RUN cargo build && \
+# rm -f ./target/release/deps/lemmy_server* ; rm -f ./target/debug/deps/lemmy_server*
+COPY server/src ./src/
+COPY server/migrations ./migrations/
+
+
+# build for release
+# workaround for https://github.com/rust-lang/rust/issues/62896
+#RUN RUSTFLAGS='-Ccodegen-units=1' cargo build --release
+RUN cargo build --release --frozen
+
+# reduce binary size
+RUN strip /app/server/target/release/lemmy_server
+
+# Get diesel-cli on there just in case
+# RUN cargo install diesel_cli --no-default-features --features postgres
+
+# make result place always the same for lemmy container
+RUN cp /app/server/target/release/lemmy_server /app/server/ready
+#RUN cp /app/server/target/debug/lemmy_server /app/server/ready
+
+
+FROM rust:1.42 as docs
+
+WORKDIR /app
+
+# Build docs
+COPY docs ./docs
+RUN cargo install mdbook
+RUN mdbook build docs/
+
+
+#FROM alpine:3.10
+# debian because build with dynamic linking with debian:buster
+FROM debian:buster as lemmy
+
+# Install libpq for postgres
+#RUN apk add libpq
+RUN apt-get update && apt-get install -y libpq5
+RUN addgroup --gid 1000 lemmy
+# for alpine
+#RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
+# for debian
+RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
+
+# Copy resources
+COPY server/config/defaults.hjson /config/defaults.hjson
+COPY --from=node /app/ui/dist /app/dist
+COPY --from=docs /app/docs/book/ /app/dist/documentation/
+COPY --from=rust /app/server/ready /app/lemmy
+
+RUN chown lemmy:lemmy /app/lemmy
+USER lemmy
+EXPOSE 8536
+CMD ["/app/lemmy"]
diff --git a/docker/prod/deploy.sh b/docker/prod/deploy.sh
new file mode 100755
index 00000000..0ad47bcd
--- /dev/null
+++ b/docker/prod/deploy.sh
@@ -0,0 +1,80 @@
+#!/bin/sh
+set -e
+git checkout master
+
+# Import translations
+git fetch weblate
+git merge weblate/master
+
+# Creating the new tag
+new_tag="$1"
+third_semver=$(echo $new_tag | cut -d "." -f 3)
+
+# Setting the version on the front end
+cd ../../
+echo "export const version: string = '$new_tag';" > "ui/src/version.ts"
+git add "ui/src/version.ts"
+# Setting the version on the backend
+echo "pub const VERSION: &str = \"$new_tag\";" > "server/src/version.rs"
+git add "server/src/version.rs"
+# Setting the version for Ansible
+echo $new_tag > "ansible/VERSION"
+git add "ansible/VERSION"
+
+cd docker/prod || exit
+
+# Changing the docker-compose prod
+sed -i "s/dessalines\/lemmy:.*/dessalines\/lemmy:$new_tag/" ../prod/docker-compose.yml
+sed -i "s/dessalines\/lemmy:.*/dessalines\/lemmy:$new_tag/" ../../ansible/templates/docker-compose.yml
+git add ../prod/docker-compose.yml
+git add ../../ansible/templates/docker-compose.yml
+
+# The commit
+git commit -m"Version $new_tag"
+git tag $new_tag
+
+export COMPOSE_DOCKER_CLI_BUILD=1
+export DOCKER_BUILDKIT=1
+
+# Rebuilding docker
+docker-compose build
+docker tag dev_lemmy:latest dessalines/lemmy:x64-$new_tag
+docker push dessalines/lemmy:x64-$new_tag
+
+# Build for Raspberry Pi / other archs
+
+# Arm currently not working
+# docker build -t lemmy:armv7hf -f Dockerfile.armv7hf ../../
+# docker tag lemmy:armv7hf dessalines/lemmy:armv7hf-$new_tag
+# docker push dessalines/lemmy:armv7hf-$new_tag
+
+# aarch64
+# Only do this on major releases (IE the third semver is 0)
+if [ $third_semver -eq 0 ]; then
+ # Registering qemu binaries
+ docker run --rm --privileged multiarch/qemu-user-static:register --reset
+
+ docker build -t lemmy:aarch64 -f Dockerfile.aarch64 ../../
+ docker tag lemmy:aarch64 dessalines/lemmy:arm64-$new_tag
+ docker push dessalines/lemmy:arm64-$new_tag
+fi
+
+# Creating the manifest for the multi-arch build
+if [ $third_semver -eq 0 ]; then
+ docker manifest create dessalines/lemmy:$new_tag \
+ dessalines/lemmy:x64-$new_tag \
+ dessalines/lemmy:arm64-$new_tag
+else
+ docker manifest create dessalines/lemmy:$new_tag \
+ dessalines/lemmy:x64-$new_tag
+fi
+
+docker manifest push dessalines/lemmy:$new_tag
+
+# Push
+git push origin $new_tag
+git push
+
+# Pushing to any ansible deploys
+cd ../../../lemmy-ansible || exit
+ansible-playbook -i prod playbooks/site.yml --vault-password-file vault_pass