1+ FROM alpine AS cloner
2+
3+ ARG VERSION
4+
5+ WORKDIR /src
6+
7+ RUN apk add --update --no-cache git && \
8+ git clone -b v$VERSION https://github.com/euzu/tuliprox.git .
9+
10+ FROM rust:bookworm AS rust-build
11+
12+ ARG RUST_TARGET=x86_64-unknown-linux-musl
13+
14+ RUN apt-get update && apt-get install -y --no-install-recommends pkg-config musl-tools libssl-dev
15+ RUN rustup update && rustup target add $RUST_TARGET
16+ ENV RUSTFLAGS='--remap-path-prefix $HOME=~ -C target-feature=+crt-static'
17+
18+ COPY --from=cloner /src/Cargo.toml /src/Cargo.lock /src/
19+ COPY --from=cloner /src/backend/Cargo.toml /src/backend/
20+ COPY --from=cloner /src/frontend/Cargo.toml /src/frontend/
21+ COPY --from=cloner /src/shared/Cargo.toml /src/shared/
22+
23+ RUN mkdir -p /src/src /src/backend/src /src/frontend/src /src/shared/src && \
24+ echo "fn main() {}" > /src/src/main.rs && \
25+ echo "fn main() {}" > /src/backend/src/main.rs && \
26+ echo "fn main() {}" > /src/frontend/src/main.rs && \
27+ echo "pub fn dummy() {}" > /src/shared/src/lib.rs
28+
29+ WORKDIR /src
30+
31+ RUN cargo build -p tuliprox --target $RUST_TARGET --release || true
32+ RUN cargo build -p shared --target $RUST_TARGET --release || true
33+
34+ COPY --from=cloner /src/ .
35+
36+ RUN cargo build -p tuliprox --target $RUST_TARGET --release
37+
38+ FROM rust:bookworm AS trunk-build
39+
40+ ARG RUST_TARGET=x86_64-unknown-linux-musl
41+
42+ RUN apt-get update && apt-get install -y --no-install-recommends \
43+ pkg-config libssl-dev curl libclang-dev binaryen
44+
45+ RUN rustup target add wasm32-unknown-unknown
46+ RUN cargo install --locked trunk wasm-bindgen-cli
47+
48+ COPY --from=cloner /src/Cargo.toml /src/Cargo.lock /src/
49+ COPY --from=cloner /src/frontend/Cargo.toml /src/frontend/Trunk.toml /src/frontend/
50+ COPY --from=cloner /src/shared/Cargo.toml /src/shared/
51+
52+ RUN mkdir -p /src/frontend/src /src/shared/src && \
53+ echo "fn main() {}" > /src/frontend/src/main.rs && \
54+ echo "pub fn dummy() {}" > /src/shared/src/lib.rs
55+
56+ WORKDIR /src/frontend
57+
58+ RUN cargo build --target wasm32-unknown-unknown --release || true
59+
60+ COPY --from=cloner /src/ /src/
61+
62+ WORKDIR /src/frontend
63+
64+ RUN trunk build --release
65+
66+ # -----------------------------------------------------------------
67+ # Stage 3: Build video resources with ffmpeg
68+ # -----------------------------------------------------------------
69+ FROM linuxserver/ffmpeg:latest AS resource-build
70+
71+ COPY --from=cloner /src/resources /src/resources
72+
73+ RUN ffmpeg -loop 1 -i /src/resources/channel_unavailable.jpg -t 10 -r 1 -an \
74+ -vf "scale=1920:1080" \
75+ -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
76+ /src/resources/channel_unavailable.ts && \
77+ ffmpeg -loop 1 -i /src/resources/user_connections_exhausted.jpg -t 10 -r 1 -an \
78+ -vf "scale=1920:1080" \
79+ -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
80+ /src/resources/user_connections_exhausted.ts && \
81+ ffmpeg -loop 1 -i /src/resources/provider_connections_exhausted.jpg -t 10 -r 1 -an \
82+ -vf "scale=1920:1080" \
83+ -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
84+ /src/resources/provider_connections_exhausted.ts && \
85+ ffmpeg -loop 1 -i /src/resources/user_account_expired.jpg -t 10 -r 1 -an \
86+ -vf "scale=1920:1080" \
87+ -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
88+ /src/resources/user_account_expired.ts
89+
90+ FROM alpine:latest AS tz-prep
91+
92+ ARG TZ=UTC
93+ ENV TZ=${TZ}
94+
95+ RUN apk add --no-cache tzdata \
96+ && mkdir -p /output/etc \
97+ && mkdir -p /output/usr/share \
98+ && cp -r /usr/share/zoneinfo /output/usr/share/zoneinfo \
99+ && ln -sf /usr/share/zoneinfo/${TZ} /output/etc/localtime
100+
101+
102+ FROM ghcr.io/ipromknight/alpine:rolling
103+
104+ ARG RUST_TARGET=x86_64-unknown-linux-musl
105+ ARG TZ=UTC
106+ ENV TZ=${TZ}
107+
108+ RUN apk add --no-cache bash curl ca-certificates tini
109+
110+ COPY --from=tz-prep /output/usr/share/zoneinfo /usr/share/zoneinfo
111+ COPY --from=rust-build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
112+
113+ RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime
114+
115+ WORKDIR /app
116+ COPY --from=rust-build /src/target/${RUST_TARGET}/release/tuliprox /app/tuliprox
117+ COPY --from=trunk-build /src/frontend/dist /app/web
118+ COPY --from=resource-build /src/resources /app/resources
119+
120+ USER 568
121+
122+ EXPOSE 8901
123+
124+ COPY --chmod=0755 apps/tuliprox/promknight-entrypoint.sh /promknight-entrypoint.sh
0 commit comments