summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorFelix Pojtinger <felix@pojtinger.com>2019-04-27 15:49:50 +0200
committerFelix Pojtinger <felix@pojtinger.com>2019-04-27 15:49:50 +0200
commitc83f98ed5ca1eb4d7971a78a1b44eac069a72764 (patch)
treee87b2e951b20878771a9dd4151b6ffcd1af4f49e /server
parent74db51c6cdb0f9ca1353c76318f4ef3668272e2d (diff)
build: Minimize build time with multi-stage build, add Ingress and production versions
Diffstat (limited to 'server')
-rw-r--r--server/Dockerfile.dev15
-rw-r--r--server/Dockerfile.prod28
-rw-r--r--server/stack.prod.yaml110
3 files changed, 149 insertions, 4 deletions
diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev
index c7951ce8..203dd742 100644
--- a/server/Dockerfile.dev
+++ b/server/Dockerfile.dev
@@ -1,9 +1,7 @@
# Setup env
-FROM rust:1.33
+FROM rust:1.33 AS build
RUN USER=root cargo new --bin /opt/lemmy/server--dev
WORKDIR /opt/lemmy/server--dev
-# Create empty directory where the frontend would normally be
-RUN mkdir -p /opt/lemmy/ui--dev/dist
# Enable deps caching
RUN mkdir -p src/bin
RUN echo 'fn main() { println!("Dummy") }' >src/bin/main.rs
@@ -17,5 +15,14 @@ COPY src/ src/
COPY migrations/ migrations/
RUN rm target/release/deps/lemmy*
RUN cargo build --release
+
+# Setup env (no Alpine because Rust requires glibc)
+FROM ubuntu:18.04
+RUN apt update
+RUN apt install postgresql-client -y
+# Create empty directory where the frontend would normally be
+RUN mkdir -p /opt/lemmy/ui--dev/dist
+# Add app
+COPY --from=build /opt/lemmy/server--dev/target/release/lemmy .
# Run app
-CMD ["/opt/lemmy/server--dev/target/release/lemmy"]
+CMD ["./lemmy"]
diff --git a/server/Dockerfile.prod b/server/Dockerfile.prod
new file mode 100644
index 00000000..b375e478
--- /dev/null
+++ b/server/Dockerfile.prod
@@ -0,0 +1,28 @@
+# Setup env
+FROM rust:1.33 AS build
+RUN USER=root cargo new --bin /opt/lemmy/server--prod
+WORKDIR /opt/lemmy/server--prod
+# Enable deps caching
+RUN mkdir -p src/bin
+RUN echo 'fn main() { println!("Dummy") }' >src/bin/main.rs
+# Install deps
+COPY Cargo.toml .
+COPY Cargo.lock .
+RUN cargo build --release
+RUN rm src/bin/main.rs
+# Add app
+COPY src/ src/
+COPY migrations/ migrations/
+RUN rm target/release/deps/lemmy*
+RUN cargo build --release
+
+# Setup env (no Alpine because Rust requires glibc)
+FROM ubuntu:18.04
+RUN apt update
+RUN apt install postgresql-client -y
+# Create empty directory where the frontend would normally be
+RUN mkdir -p /opt/lemmy/ui--prod/dist
+# Add app
+COPY --from=build /opt/lemmy/server--prod/target/release/lemmy .
+# Run app
+CMD ["./lemmy"]
diff --git a/server/stack.prod.yaml b/server/stack.prod.yaml
new file mode 100644
index 00000000..d221de16
--- /dev/null
+++ b/server/stack.prod.yaml
@@ -0,0 +1,110 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres
+data:
+ POSTGRES_PASSWORD: rrr
+ POSTGRES_USER: rrr
+ POSTGRES_DB: rrr
+ PGDATA: /var/lib/postgresql/data/pgdata
+ DATABASE_URL: postgres://rrr:rrr@postgres:5432/rrr
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: postgres
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres
+spec:
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:11.2-alpine
+ resources:
+ limits:
+ memory: 256Mi
+ cpu: 512m
+ ports:
+ - containerPort: 5432
+ envFrom:
+ - configMapRef:
+ name: postgres
+ volumeMounts:
+ - name: postgres
+ mountPath: /var/lib/postgresql/data
+ volumes:
+ - name: postgres
+ persistentVolumeClaim:
+ claimName: postgres
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres
+spec:
+ selector:
+ app: postgres
+ ports:
+ - port: 5432
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: lemmy-server--prod
+data:
+ LEMMY_FRONT_END_DIR: /opt/lemmy/ui--prod/dist # not actually used here, polyfill for monolith
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: lemmy-server--prod
+spec:
+ selector:
+ matchLabels:
+ app: lemmy-server--prod
+ template:
+ metadata:
+ labels:
+ app: lemmy-server--prod
+ spec:
+ containers:
+ - name: lemmy-server--prod
+ image: registry.gitlab.com/pojntfx/lemmy/server.prod
+ envFrom:
+ - configMapRef:
+ name: postgres
+ - configMapRef:
+ name: lemmy-server--prod
+ resources:
+ limits:
+ memory: 512Mi
+ cpu: 512m
+ ports:
+ - containerPort: 8536
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: lemmy-server--prod
+spec:
+ selector:
+ app: lemmy-server--prod
+ ports:
+ - port: 8536
+ targetPort: 8536