diff --git a/contrib/build.sh b/contrib/build.sh new file mode 100644 index 0000000..ae39a0a --- /dev/null +++ b/contrib/build.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e +mkdir -p /app/bin +crate="$1" +if [ "$TARGETARCH" = "arm64" ]; then + cargo build --release -p "$crate" --target aarch64-unknown-linux-gnu + cp "/app/target/aarch64-unknown-linux-gnu/release/$crate" "/app/bin/$crate" +else + cargo build --release -p "$crate" + cp "/app/target/release/$crate" "/app/bin/$crate" +fi diff --git a/contrib/release.fish b/contrib/release.fish deleted file mode 100755 index bba1119..0000000 --- a/contrib/release.fish +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env fish - -set -g platforms linux/amd64,linux/arm64 -set -g kubeconfig /home/cuducos/.kube/pumbaa -set -g root (git rev-parse --show-toplevel) - -function build_and_push - set -l image $argv[1] - set -l dir $argv[2] - docker buildx build \ - --platform $platforms \ - -t atcr.io/cuducos.me/$image:latest \ - --push \ - $dir; or return 1 -end - -function rollout - set -l deploy $argv[1] - env KUBECONFIG=$kubeconfig kubectl rollout restart deployment/$deploy -n wed; or return 1 -end - -if not ls /proc/sys/fs/binfmt_misc/qemu-aarch64 >/dev/null 2>&1 - docker run --privileged --rm tonistiigi/binfmt --install all; or exit 1 -end - -build_and_push wed-releases $root/contrib/releases; or exit 1 -rollout releases; or exit 1 - -build_and_push wed $root; or exit 1 -rollout api; or exit 1 - -build_and_push wed-frontend $root/contrib/frontend; or exit 1 -rollout spa; or exit 1 diff --git a/contrib/release.sh b/contrib/release.sh new file mode 100755 index 0000000..9d01761 --- /dev/null +++ b/contrib/release.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh +set -e + +KUBECONFIG="${KUBECONFIG:-/home/cuducos/.kube/pumbaa}" +ROOT="$(git rev-parse --show-toplevel)" + +if [ ! -f /proc/sys/fs/binfmt_misc/qemu-aarch64 ]; then + docker run --privileged --rm tonistiigi/binfmt --install all +fi + +build_and_push() { + image="$1" + dockerdir="$2" + docker build \ + --platform linux/amd64,linux/arm64 \ + -f "${dockerdir}/Dockerfile" \ + -t "atcr.io/cuducos.me/${image}:latest" \ + --push \ + "$ROOT" +} + +rollout() { + deploy="$1" + env KUBECONFIG="$KUBECONFIG" kubectl rollout restart "deployment/${deploy}" -n wed +} + +build_and_push wed-releases "${ROOT}/releases" +rollout releases + +build_and_push wed "${ROOT}/server" +rollout api + +build_and_push wed-frontend "${ROOT}/spa" +rollout spa diff --git a/releases/Dockerfile b/releases/Dockerfile index 9e014c9..17a7787 100644 --- a/releases/Dockerfile +++ b/releases/Dockerfile @@ -1,15 +1,18 @@ -FROM rust:1-slim-trixie AS builder +FROM --platform=$BUILDPLATFORM rust:1-slim-trixie AS builder RUN apt-get update && \ - apt-get install -y --no-install-recommends pkg-config libssl-dev && \ + apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu libc6-dev-arm64-cross && \ rm -rf /var/lib/apt/lists/* +RUN rustup target add aarch64-unknown-linux-gnu +ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc WORKDIR /app COPY . . -RUN cargo build --release +ARG TARGETARCH +RUN sh contrib/build.sh releases FROM debian:trixie-slim RUN apt-get update && \ - apt-get install -y --no-install-recommends ca-certificates libssl3 && \ + apt-get install -y --no-install-recommends ca-certificates && \ rm -rf /var/lib/apt/lists/* WORKDIR /app -COPY --from=builder /app/target/release/releases /usr/local/bin/releases +COPY --from=builder /app/bin/releases /usr/local/bin/releases CMD ["releases"] diff --git a/server/Dockerfile b/server/Dockerfile index 62efb88..9ffd9f2 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,12 +1,18 @@ -FROM rust:1-slim-trixie AS builder +FROM --platform=$BUILDPLATFORM rust:1-slim-trixie AS builder +RUN apt-get update && \ + apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu libc6-dev-arm64-cross && \ + rm -rf /var/lib/apt/lists/* +RUN rustup target add aarch64-unknown-linux-gnu +ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc WORKDIR /app COPY . . -RUN cargo build --release -p server +ARG TARGETARCH +RUN sh contrib/build.sh server FROM debian:trixie-slim RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates && \ rm -rf /var/lib/apt/lists/* WORKDIR /app -COPY --from=builder /app/target/release/server /usr/local/bin/server +COPY --from=builder /app/bin/server /usr/local/bin/server CMD ["server"] diff --git a/server/src/main.rs b/server/src/main.rs index 9129ac6..fe360cd 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -9,11 +9,16 @@ use db::Database; use futures_util::StreamExt; use handlers::{AppState, RateLimiter}; use shared::WedClient; -use std::{env, sync::Arc, time::Duration}; +use std::{ + env, + sync::Arc, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; const JETSTREAM_URL: &str = "wss://jetstream2.us-east.bsky.network/subscribe"; const JETSTREAM_RECONNECT_SECS: u64 = 30; const JETSTREAM_READ_TIMEOUT_SECS: u64 = 90; +const JETSTREAM_REWIND_SECS: i64 = 1200; const GEO_TTL_DAYS: i64 = 30; const READER_COUNT: usize = 3; @@ -78,7 +83,18 @@ async fn run_jetstream( ) { let mut cursor: Option = env::var("JETSTREAM_CURSOR") .ok() - .and_then(|value| value.trim().parse().ok()); + .and_then(|value| value.trim().parse().ok()) + .or_else(|| { + let rewind = env::var("JETSTREAM_REWIND_SECS") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(JETSTREAM_REWIND_SECS); + let now_us = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|d| d.as_micros() as i64) + .unwrap_or(0); + Some(now_us - rewind * 1_000_000) + }); if let Some(c) = cursor { tracing::info!("jetstream replaying from cursor={c}"); } diff --git a/spa/Dockerfile b/spa/Dockerfile index e7ef05c..e13f281 100644 --- a/spa/Dockerfile +++ b/spa/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1-slim AS build +FROM --platform=$BUILDPLATFORM rust:1-slim-trixie AS build WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates curl && \ @@ -9,6 +9,7 @@ RUN rustup target add wasm32-unknown-unknown WORKDIR /app COPY . . WORKDIR /app/spa +RUN chmod +x gen-config.sh ARG APP_URL=https://wed.fyi ENV APP_URL=$APP_URL ARG BACKEND_URL=https://api.wed.fyi @@ -17,7 +18,10 @@ ARG ACCOUNT_DID=did:plc:jw2rjf3xwlxrrcg4i7rfozgc ENV ACCOUNT_DID=$ACCOUNT_DID RUN trunk build --release -FROM nginx:alpine +FROM debian:trixie-slim +RUN apt-get update && \ + apt-get install -y --no-install-recommends nginx-light && \ + rm -rf /var/lib/apt/lists/* COPY --from=build /app/spa/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]