Our Personal Data Server from scratch!
tranquil.farm
pds
rust
database
fun
oauth
atproto
3.9 kB
80 lines
1ARG DISTROLESS_IMAGE=gcr.io/distroless/cc-debian13:latest@sha256:1e3c6d9c255be500eb680cdea0ad07554f52ae92dfcbdf07043a2a435b4c1fe3
2
3FROM node:24-trixie-slim AS frontend
4RUN corepack enable && corepack prepare pnpm@latest --activate
5WORKDIR /app
6COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./
7RUN pnpm install --frozen-lockfile
8COPY frontend/ ./
9RUN pnpm build
10
11FROM rust:1.96-slim-trixie AS builder
12RUN apt-get update && apt-get install -y --no-install-recommends \
13 ca-certificates pkg-config libssl-dev mold clang protobuf-compiler curl xz-utils \
14 && rm -rf /var/lib/apt/lists/*
15ARG COMPRESS="true"
16RUN set -eux; \
17 if [ "$COMPRESS" = "true" ]; then \
18 arch="$(uname -m)"; \
19 case "$arch" in \
20 x86_64) upx_arch=amd64; upx_sha=ddc2654063fe4dc80d95b420788494e4db078ebb01a650692d623b5a9906e61e ;; \
21 aarch64) upx_arch=arm64; upx_sha=100310f74eb6f67694d1d0377f1c729b6a49238ce8c4de21ea2e7d3406186f8b ;; \
22 *) echo "upx: no prebuilt binary for $arch, skipping compression"; upx_arch="" ;; \
23 esac; \
24 if [ -n "$upx_arch" ]; then \
25 curl -fsSL -o /tmp/upx.tar.xz "https://github.com/upx/upx/releases/download/v5.0.2/upx-5.0.2-${upx_arch}_linux.tar.xz"; \
26 echo "${upx_sha} /tmp/upx.tar.xz" | sha256sum -c -; \
27 tar -xJf /tmp/upx.tar.xz -C /tmp; \
28 install -m0755 "/tmp/upx-5.0.2-${upx_arch}_linux/upx" /usr/local/bin/upx; \
29 rm -rf /tmp/upx.tar.xz "/tmp/upx-5.0.2-${upx_arch}_linux"; \
30 fi; \
31 fi
32RUN mkdir -p /stage/var/lib/tranquil-pds/blobs /stage/var/lib/tranquil-pds/store
33ENV RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=mold"
34WORKDIR /app
35ARG SLIM="false"
36COPY Cargo.toml Cargo.lock ./
37COPY .sqlx ./.sqlx
38COPY crates/tranquil-types ./crates/tranquil-types
39COPY crates/tranquil-crypto ./crates/tranquil-crypto
40COPY crates/tranquil-scopes ./crates/tranquil-scopes
41COPY crates/tranquil-config ./crates/tranquil-config
42COPY crates/tranquil-repo ./crates/tranquil-repo
43COPY crates/tranquil-lexicon ./crates/tranquil-lexicon
44COPY crates/tranquil-oauth ./crates/tranquil-oauth
45COPY crates/tranquil-db-traits ./crates/tranquil-db-traits
46COPY crates/tranquil-infra ./crates/tranquil-infra
47COPY crates/tranquil-auth ./crates/tranquil-auth
48COPY crates/tranquil-comms ./crates/tranquil-comms
49COPY crates/tranquil-db ./crates/tranquil-db
50COPY crates/tranquil-ripple ./crates/tranquil-ripple
51COPY crates/tranquil-storage ./crates/tranquil-storage
52COPY crates/tranquil-cache ./crates/tranquil-cache
53COPY crates/tranquil-pds ./crates/tranquil-pds
54COPY crates/tranquil-sync ./crates/tranquil-sync
55COPY crates/tranquil-api ./crates/tranquil-api
56COPY crates/tranquil-oauth-server ./crates/tranquil-oauth-server
57COPY crates/tranquil-store ./crates/tranquil-store
58COPY crates/tranquil-signal ./crates/tranquil-signal
59COPY crates/tranquil-server ./crates/tranquil-server
60COPY migrations ./migrations
61RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry \
62 --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \
63 --mount=type=cache,id=tranquil-target,target=/app/target,sharing=locked \
64 if [ "$SLIM" = "true" ]; then \
65 SQLX_OFFLINE=true cargo build --release -p tranquil-server --no-default-features; \
66 else \
67 SQLX_OFFLINE=true cargo build --release -p tranquil-server; \
68 fi && \
69 cp target/release/tranquil-server /tmp/tranquil-pds && \
70 if [ "$COMPRESS" = "true" ] && command -v upx >/dev/null 2>&1; then upx --best --lzma /tmp/tranquil-pds; fi
71
72FROM ${DISTROLESS_IMAGE}
73COPY --from=builder /tmp/tranquil-pds /usr/local/bin/tranquil-pds
74COPY --from=builder --chown=65532:65532 /stage/var/lib/tranquil-pds /var/lib/tranquil-pds
75COPY --from=frontend --chown=65532:65532 /app/dist /var/lib/tranquil-pds/frontend
76WORKDIR /var/lib/tranquil-pds
77ENV SERVER_HOST=[::]
78ENV SERVER_PORT=3000
79EXPOSE 3000
80ENTRYPOINT ["/usr/local/bin/tranquil-pds"]