Our Personal Data Server from scratch!
tranquil.farm
oauth
atproto
pds
rust
postgresql
objectstorage
fun
1FROM denoland/deno:alpine AS frontend
2WORKDIR /app
3COPY frontend/ ./
4RUN deno task build
5
6FROM rust:1.92-alpine AS builder
7RUN apk add --no-cache ca-certificates musl-dev pkgconfig openssl-dev openssl-libs-static
8WORKDIR /app
9ARG SLIM="false"
10COPY Cargo.toml Cargo.lock ./
11COPY crates ./crates
12COPY .sqlx ./.sqlx
13COPY migrations ./crates/tranquil-pds/migrations
14RUN --mount=type=cache,target=/usr/local/cargo/registry \
15 --mount=type=cache,target=/app/target \
16 if [ "$SLIM" = "true" ]; then \
17 SQLX_OFFLINE=true cargo build --release -p tranquil-pds --no-default-features; \
18 else \
19 SQLX_OFFLINE=true cargo build --release -p tranquil-pds; \
20 fi && \
21 cp target/release/tranquil-pds /tmp/tranquil-pds
22
23FROM alpine:3.23 AS signal-cli
24RUN apk add --no-cache curl tar
25ARG SIGNAL_CLI_VERSION=0.13.24
26RUN curl -fsSL "https://github.com/AsamK/signal-cli/releases/download/v${SIGNAL_CLI_VERSION}/signal-cli-${SIGNAL_CLI_VERSION}-Linux-native.tar.gz" \
27 | tar xz -C /usr/local/bin
28
29FROM debian:trixie-slim
30RUN apt-get update && apt-get install -y --no-install-recommends msmtp ca-certificates \
31 && rm -rf /var/lib/apt/lists/* \
32 && ln -sf /usr/bin/msmtp /usr/sbin/sendmail
33COPY --from=signal-cli /usr/local/bin/signal-cli /usr/local/bin/signal-cli
34VOLUME /var/lib/signal-cli
35COPY --from=builder /tmp/tranquil-pds /usr/local/bin/tranquil-pds
36COPY --from=frontend /app/dist /var/lib/tranquil-pds/frontend
37COPY migrations /app/migrations
38WORKDIR /app
39ENV SIGNAL_CLI_CONFIG=/var/lib/signal-cli
40ENV SERVER_HOST=0.0.0.0
41ENV SERVER_PORT=3000
42EXPOSE 3000
43CMD ["tranquil-pds"]