Serveur réécrit en Rust

Le serveur Dart (bin/) est remplacé par un serveur Rust (server/) :
tokio + axum, reqwest/rustls, SQLite embarqué via rusqlite. Même API,
mêmes routes et mêmes réponses : le front Flutter ne change pas.

La base de production est reprise telle quelle : schéma, migrations et
formats de dates (DateTime.toIso8601String de Dart) sont reproduits à
l'identique, les sessions et hachages existants restent valides.

Comportement conservé : cascade de routage, anti-SSRF, logs masqués,
rate limits, transcodage HLS/turbo.ts avec repli GPU, quotas fournisseur,
enregistrements (reprise, relances, fusion), season passes, EPG, logos de
repli, arrêt gracieux sur SIGTERM. Tests Dart portés (132 tests Rust) ;
la CI exécute fmt, test et clippy -D warnings, l'image Docker compile le
serveur dans un étage rust:1.98.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-13 00:29:57 +02:00
1 parent f82c70ae05
commit 3ea6fa0ae3
109 files changed
+14008 -11047

No files matched your search

+22 -8
View File
@@ -31,11 +31,10 @@ ENV FLUTTER_NO_ANALYTICS=1
RUN flutter config --enable-web && flutter precache --web
# 2. Dependency Resolution (ONLY UPDATES IF PUBSPEC CHANGES)
# Les lockfiles sont versionnés : le build résout exactement les versions
# Le lockfile est versionné : le build résout exactement les versions
# committées au lieu d'en chercher de nouvelles à chaque build.
COPY pubspec.yaml pubspec.lock ./
COPY bin/pubspec.yaml bin/pubspec.lock ./bin/
RUN flutter pub get && cd bin && dart pub get
RUN flutter pub get
# 3. Source Code Copy (CHANGES OFTEN)
# Everything except what's in .dockerignore (built-in protection)
@@ -48,18 +47,33 @@ RUN dart run build_runner build --delete-conflicting-outputs
# This step MUST run if you modified any Dart file.
RUN flutter build web --release --base-href="/" --no-tree-shake-icons --no-pub
# 6. Native Server Compilation
RUN cd bin && dart compile exe server.dart -o server
# ============================================
# Stage 2: Serveur Rust
# ============================================
# Bookworm (glibc 2.36) : le binaire tourne tel quel sur le runtime
# debian:stable-slim, plus récent. Version épinglée comme le SDK Flutter.
FROM rust:1.98.1-slim-bookworm AS server-builder
WORKDIR /server
# Dépendances compilées dans une couche à part : elles ne sont recompilées
# que si Cargo.toml/Cargo.lock changent, pas à chaque modification du code.
COPY server/Cargo.toml server/Cargo.lock ./
RUN mkdir src && echo 'fn main() {}' > src/main.rs \
&& cargo build --release --locked \
&& rm -rf src target/release/xtremflow-server* target/release/deps/xtremflow_server*
COPY server/src ./src
RUN cargo build --release --locked
# ============================================
# Stage 2: Production Runtime
# Stage 3: Production Runtime
# ============================================
FROM debian:stable-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
sqlite3 \
libsqlite3-dev \
curl \
wget \
xz-utils \
@@ -81,7 +95,7 @@ RUN mkdir -p /app/data /app/web /app/recordings /tmp/xtremflow_streams \
&& chown -R xtremuser:xtremuser /app /tmp/xtremflow_streams
COPY --from=builder /app/build/web /app/web
COPY --from=builder /app/bin/server /app/server
COPY --from=server-builder /server/target/release/xtremflow-server /app/server
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/server /app/entrypoint.sh