๐Ÿ“๐Ÿ–ผ๏ธ๐Ÿน A small thing where I can upload a file and get a link back. https://media.strawmelonjuice.com/
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

I'm settling in!

+115 -50
+21 -13
Dockerfile
··· 1 - # Building the dashboard is not included in this Dockerfile, but is done by the mise task instead. 2 - # This may change later. 1 + FROM rust:1-slim-bookworm AS builder 2 + 3 + RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/* 3 4 4 - FROM oven/bun:alpine 5 5 WORKDIR /app 6 - COPY ./dist/server.js ./ 7 - COPY scripts/ ./scripts/ 8 - RUN mkdir -p /app/data/files 9 - RUN chown -R bun:bun /app/data 10 - # A link from /app/ to where it used to be, /usr/src/app/ 11 - RUN mkdir -p /usr/src/ && ln -s /app /usr/src/app 12 6 13 - # Run the app 14 - USER bun 15 - EXPOSE 3000/tcp 16 - ENTRYPOINT ["bun", "run", "server.js"] 7 + COPY ./server-rs ./server-rs 8 + 9 + COPY ./dist ./dist 10 + 11 + RUN cd server-rs && cargo build --release 12 + 13 + FROM debian:bookworm-slim 14 + WORKDIR /app 15 + 16 + RUN apt-get update && apt-get install -y libssl3 ca-certificates && rm -rf /var/lib/apt/lists/* 17 + 18 + COPY --from=builder /app/server-rs/target/release/strawmediajuice-server ./server 19 + 20 + 21 + ENV ROCKET_ADDRESS=0.0.0.0 22 + EXPOSE 3000 23 + 24 + CMD ["./server"]
+32 -8
Justfile
··· 1 1 # Variables 2 + 2 3 docker_image := "strawmelonjuice/strawmediajuice" 3 4 version := "1.2.1" 4 5 ··· 13 14 cd server-rs && cargo fmt 14 15 15 16 # Tailwind 16 - generate-tailwind-styles: 17 + _generate-tailwind-styles: 17 18 bun install 18 19 cd dashboard && bunx tailwindcss -i ./app.css -o ../dist/dashboard/dashboard.css 19 20 cd dashboard && bunx minify ../dist/dashboard/dashboard.css > ../dist/dashboard/dashboard.min.css 20 21 21 22 # Dashboard Build 22 - build-dashboard: generate-tailwind-styles 23 + build-dashboard: _generate-tailwind-styles 23 24 cd dashboard && gleam export typescript-prelude > ./src/prelude.d.ts 24 25 cd dashboard && gleam export javascript-prelude > ./src/prelude.mjs 25 26 cd dashboard && gleam build --target javascript ··· 44 45 cd server-rs && cargo build 45 46 46 47 # Dev with Rs backend 47 - dev-rs: build-server 48 - export EXPAND_TERMSIZE=$(tput cols); clear; ./server-rs/target/debug/server-rs 48 + dev: build-server-rs 49 + export EXPAND_TERMSIZE=$(tput cols); clear; ./server-rs/target/debug/strawmediajuice-server 50 + 51 + # Watchexec Dev with Rust backend 52 + watch: 53 + watchexec -w server-rs -w dashboard -w server \ 54 + -e rs,gleam,ts,css,html \ 55 + --ignore "dist/*" \ 56 + --ignore "dashboard/build/*" \ 57 + -- "just dev" 49 58 50 59 # Dev with TS backend 51 - dev: build-server 60 + dev-ts: build-server 52 61 export EXPAND_TERMSIZE=$(tput cols); clear; bun ./dist/server.js 53 62 54 - # Docker 55 - build-docker: build-server 56 - docker build --pull -t {{docker_image}}:{{version}} . 63 + # Docker with TypeScript backend, deprecated in favor of the upcoming Rust rewritten release. 64 + _build-docker: build-server 65 + @echo "\033[1;33mWARNING: '_build-docker-ts' is deprecated.\033[0m" 66 + @echo "New Docker images should be built from the upcoming Rust backend." 67 + podman build --pull -t {{ docker_image }}:{{ version }} -f ts.Dockerfile . 68 + 69 + # Build Docker image 70 + build-podman: 71 + podman build --pull -t {{ docker_image }}:{{ version }} -f Dockerfile . 72 + 73 + # Build and run the podman container locally, typically for devving on the dockerimage. 74 + dev-docker: build-podman 75 + podman run -it --rm \ 76 + -p 3000:3000 \ 77 + -e ROCKET_PORT=3000 \ 78 + -e INIT_USERNAME=dev \ 79 + -e INIT_PASSWORD=dev \ 80 + {{ docker_image }}:{{ version }}
+13 -3
flake.nix
··· 35 35 { 36 36 devShells.default = pkgs.mkShell { 37 37 buildInputs = with pkgs; [ 38 + # Language tool chains: Rust, Gleam 38 39 rustToolchain 39 - 40 - bun 41 40 gleam 41 + # Dashboard prepper (and typescript runtime) 42 + bun 43 + 44 + # For tidying and typing 42 45 nodePackages.typescript 43 46 nodePackages.prettier 44 - tailwindcss 47 + 48 + # Helpers on OS level 45 49 pkg-config 46 50 dbus 51 + 52 + # Podman 53 + podman 54 + 55 + # Runners 56 + watchexec 47 57 just 48 58 ]; 49 59
+18 -18
server-rs/Cargo.lock
··· 1349 1349 ] 1350 1350 1351 1351 [[package]] 1352 - name = "server-rs" 1353 - version = "0.1.0" 1354 - dependencies = [ 1355 - "anyhow", 1356 - "base64", 1357 - "bcrypt", 1358 - "question", 1359 - "r2d2", 1360 - "r2d2_sqlite", 1361 - "rocket", 1362 - "rocket_ws", 1363 - "serde", 1364 - "serde_json", 1365 - "tokio", 1366 - "uuid", 1367 - ] 1368 - 1369 - [[package]] 1370 1352 name = "sha1" 1371 1353 version = "0.10.6" 1372 1354 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1475 1457 checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" 1476 1458 dependencies = [ 1477 1459 "loom", 1460 + ] 1461 + 1462 + [[package]] 1463 + name = "strawmediajuice-server" 1464 + version = "0.1.0" 1465 + dependencies = [ 1466 + "anyhow", 1467 + "base64", 1468 + "bcrypt", 1469 + "question", 1470 + "r2d2", 1471 + "r2d2_sqlite", 1472 + "rocket", 1473 + "rocket_ws", 1474 + "serde", 1475 + "serde_json", 1476 + "tokio", 1477 + "uuid", 1478 1478 ] 1479 1479 1480 1480 [[package]]
+1 -1
server-rs/Cargo.toml
··· 1 1 [package] 2 - name = "server-rs" 2 + name = "strawmediajuice-server" 3 3 version = "0.1.0" 4 4 edition = "2024" 5 5
+14 -7
server-rs/src/main.rs
··· 4 4 mod routes; 5 5 #[macro_use] 6 6 extern crate rocket; 7 + use std::net::{IpAddr, Ipv4Addr}; 8 + 7 9 pub(crate) use r2d2_sqlite::rusqlite; 8 10 type Database = r2d2::Pool<r2d2_sqlite::SqliteConnectionManager>; 9 11 use anyhow::{Result, bail}; ··· 22 24 }; 23 25 let port = std::env::var("PORT").map_or(3000, |port| port.parse().unwrap_or(3000)); 24 26 rocket::build() 25 - .mount("/", routes![ 26 - // / -> dashboard 27 - routes::index, 28 - // /file/<id..> -> file fetch 29 - routes::file_fetch, 30 - // /favicon.ico -> redirect to file 31 - routes::favicon_redirect]) 27 + .mount( 28 + "/", 29 + routes![ 30 + // / -> dashboard 31 + routes::index, 32 + // /file/<id..> -> file fetch 33 + routes::file_fetch, 34 + // /favicon.ico -> redirect to file 35 + routes::favicon_redirect 36 + ], 37 + ) 32 38 .mount( 33 39 "/api/", 34 40 routes![ ··· 43 49 .manage(app) 44 50 .configure(rocket::Config { 45 51 port, 52 + address: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 46 53 ..rocket::Config::default() 47 54 }) 48 55 }
+16
ts.Dockerfile
··· 1 + # Building the dashboard is not included in this Dockerfile, but is done by the mise task instead. 2 + # This may change later. 3 + 4 + FROM oven/bun:alpine 5 + WORKDIR /app 6 + COPY ./dist/server.js ./ 7 + COPY scripts/ ./scripts/ 8 + RUN mkdir -p /app/data/files 9 + RUN chown -R bun:bun /app/data 10 + # A link from /app/ to where it used to be, /usr/src/app/ 11 + RUN mkdir -p /usr/src/ && ln -s /app /usr/src/app 12 + 13 + # Run the app 14 + USER bun 15 + EXPOSE 3000/tcp 16 + ENTRYPOINT ["bun", "run", "server.js"]