From 24b3cbe4ceae15f03cc9e5d071885b61896f39d1 Mon Sep 17 00:00:00 2001 From: zxq5 Date: Thu, 9 Oct 2025 14:34:24 +0100 Subject: [PATCH] added deployment via docker compose --- .gitignore | 4 +++ backend/.env | 1 + backend/.gitignore | 1 - backend/Dockerfile | 47 +++++++++++++++++++++++++++++ backend/Rocket.toml | 6 ++++ backend/src/auth.rs | 2 +- backend/src/main.rs | 25 +++++++++++---- backend/static/css/index.css | 2 +- backend/static/favicon.ico | Bin 0 -> 15290 bytes backend/templates/chat.html.tera | 9 +++--- backend/templates/login.html.tera | 2 +- backend/templates/signup.html.tera | 2 +- docker-compose.yml | 14 +++++++++ 13 files changed, 100 insertions(+), 15 deletions(-) delete mode 100644 backend/.gitignore create mode 100644 backend/Dockerfile create mode 100644 backend/static/favicon.ico create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore index e69de29..10cd624 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,4 @@ +*/target +*.env +*.log* +*.lock diff --git a/backend/.env b/backend/.env index 5b5a9be..0fd4590 100644 --- a/backend/.env +++ b/backend/.env @@ -1 +1,2 @@ DATABASE_URL="postgresql://chatapp:chatapp@100.118.108.58:5432/chatapp" +ROCKET_SECRET_KEY="fCHCI6x/uItqldCJTdbruqQvXQXAeH/+vGtXmu3Hv6A=" diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..a20c1d8 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,47 @@ +FROM docker.io/rust:1-slim-bookworm AS build + +## cargo package name: customize here or provide via --build-arg +ARG pkg=backend +ARG DATABASE_URL + +WORKDIR /build + +COPY .cargo .cargo +COPY cdn cdn +COPY src src +COPY Cargo.toml Cargo.toml +COPY Rocket.toml Rocket.toml +COPY static static +COPY templates templates + +RUN apt-get update && apt-get install -y libssl-dev pkg-config + +RUN --mount=type=cache,target=/build/target \ + --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + set -eux; \ + cargo build --release; \ + objcopy --compress-debug-sections target/release/$pkg ./main + +################################################################################ + +FROM docker.io/debian:bookworm-slim + +RUN apt-get update && apt-get install -y libssl-dev pkg-config + +WORKDIR /app + +## copy the main binary +COPY --from=build /build/main ./ + +## copy runtime assets which may or may not exist +COPY --from=build /build/Rocket.toml ./Rocket.toml +COPY --from=build /build/static ./static +COPY --from=build /build/cdn ./cdn +COPY --from=build /build/template[s] ./templates + +## ensure the container listens globally on port 8000 +ENV ROCKET_ADDRESS=0.0.0.0 +ENV ROCKET_PORT=8000 + +CMD ./main diff --git a/backend/Rocket.toml b/backend/Rocket.toml index 0d6fba7..b48347e 100644 --- a/backend/Rocket.toml +++ b/backend/Rocket.toml @@ -1,6 +1,12 @@ [debug] secret_key = "yYhvCGnRh/TrcHtB8sZqCFifrVmJxoKFLBYw/WWBZeU=" +address = "127.0.0.1" port = 8000 [default.databases.postgres_db] url = "postgresql://chatapp:chatapp@100.118.108.58:5432/chatapp" + +[default] # run inside a docker container or pod +secret_key = "fCHCI6x/uItqldCJTdbruqQvXQXAeH/+vGtXmu3Hv6A=" +address = "0.0.0.0" +port = 8082 diff --git a/backend/src/auth.rs b/backend/src/auth.rs index f699632..65219f0 100644 --- a/backend/src/auth.rs +++ b/backend/src/auth.rs @@ -99,7 +99,7 @@ pub async fn mfa_page(session: Session) -> Template { } #[get("/api/totp.jpg")] -pub async fn gen_totp(s: Session) -> Option { +pub async fn get_totp(s: Session) -> Option { let totp = TOTP::new( Algorithm::SHA1, 6, diff --git a/backend/src/main.rs b/backend/src/main.rs index 0643a54..19bc680 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -2,7 +2,7 @@ #[macro_use] extern crate rocket; -use rocket::fs::FileServer; +use rocket::fs::{FileServer, NamedFile}; use rocket::http::Method; use rocket::serde::json::Json; use rocket::{Build, Rocket}; @@ -66,16 +66,29 @@ fn rocket() -> Rocket { .mount( "/", routes![ - users, - username_for_id, + favicon, messages::chat_page, + auth::signup_page, + auth::login_page, + auth::mfa_page, + ], + ) + .mount( + "/api", + routes![ messages::get_messages, messages::post_message, messages::event_stream, + users, + username_for_id, auth::signup, - auth::signup_page, - auth::login_page, - auth::login + auth::login, + auth::get_totp, ], ) } + +#[get("/favicon.ico")] +async fn favicon() -> NamedFile { + NamedFile::open("static/favicon.ico").await.unwrap() +} diff --git a/backend/static/css/index.css b/backend/static/css/index.css index 5dc0fdd..8560511 100644 --- a/backend/static/css/index.css +++ b/backend/static/css/index.css @@ -34,7 +34,7 @@ body { display: flex; flex-direction: column; height: 100vh; - max-width: 100vw; + min-width: 100vw; margin: 0 0; background: #121212; position: relative; diff --git a/backend/static/favicon.ico b/backend/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..62a6d8c730154b33684ec114ffe170a3a0cd47be GIT binary patch literal 15290 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 literal 0 HcmV?d00001 diff --git a/backend/templates/chat.html.tera b/backend/templates/chat.html.tera index 4cd8dcd..fbe19d0 100644 --- a/backend/templates/chat.html.tera +++ b/backend/templates/chat.html.tera @@ -165,7 +165,7 @@ function sendMessage() { const message = input.value.trim(); if (message) { - fetch("http://localhost:8000/chat", { + fetch("/api/chat", { method: "POST", body: JSON.stringify({ user_id: user_id, @@ -189,11 +189,11 @@ async function loadData() { try { - const userIds = await fetch("http://localhost:8000/users/") + const userIds = await fetch("/api/users/") .then(r => r.json()); const userPromises = userIds.map(userId => - fetch(`http://localhost:8000/users/${userId}`) + fetch(`/api/users/${userId}`) .then(r => r.text()) .then(username => ({ userId, username })) ); @@ -206,7 +206,8 @@ console.log('Users loaded:', users); - const messageSource = new EventSource("http://localhost:8000/events"); + const messageSource = new EventSource("/api/events"); + messageSource.onopen = () => messagesContainer.innerHTML = ''; messageSource.onmessage = (event) => insertMessage(JSON.parse(event.data)); messageSource.onerror = (error) => { console.error('EventSource error:', error); diff --git a/backend/templates/login.html.tera b/backend/templates/login.html.tera index a4a1c0e..67b36c0 100644 --- a/backend/templates/login.html.tera +++ b/backend/templates/login.html.tera @@ -109,7 +109,7 @@ try { // Replace with your actual backend endpoint const response = await fetch( - "http://localhost:8000/login", + "/api/login", { method: "POST", headers: { diff --git a/backend/templates/signup.html.tera b/backend/templates/signup.html.tera index 936b7dc..fa49b7e 100644 --- a/backend/templates/signup.html.tera +++ b/backend/templates/signup.html.tera @@ -225,7 +225,7 @@ try { // Replace with your actual backend endpoint const response = await fetch( - "http://localhost:8000/signup", + "/api/signup", { method: "POST", headers: { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..094bebf --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +services: + backend: + image: git.zxq5.dev/zxq5/chatapp-backend:latest + ports: + - "8000:8000" + depends_on: + - redis + environment: + - ROCKET_SECRET_KEY=$ROCKET_SECRET_KEY + - DATABASE_URL="postgresql://chatapp:chatapp@100.118.108.58:5432/chatapp" + redis: + image: docker.io/library/redis:alpine + ports: + - "6379:6379"