refactor: yaml configs

This commit is contained in:
kieran 2024-12-11 09:46:00 +00:00
parent 48d2fa3c42
commit 1b84e22ea9
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
15 changed files with 77 additions and 172 deletions

106
Cargo.lock generated
View File

@ -27,17 +27,6 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "aes"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
dependencies = [
"cfg-if",
"cipher",
"cpufeatures",
]
[[package]] [[package]]
name = "ahash" name = "ahash"
version = "0.8.11" version = "0.8.11"
@ -289,7 +278,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"regex", "regex",
"rustc-hash 1.1.0", "rustc-hash",
"shlex", "shlex",
"syn", "syn",
] ]
@ -1699,7 +1688,6 @@ dependencies = [
"tokio", "tokio",
"tokio-rustls", "tokio-rustls",
"tower-service", "tower-service",
"webpki-roots",
] ]
[[package]] [[package]]
@ -2110,11 +2098,10 @@ dependencies = [
[[package]] [[package]]
name = "nostr" name = "nostr"
version = "0.36.0" version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14ad56c1d9a59f4edc46b17bc64a217b38b99baefddc0080f85ad98a0855336d" checksum = "8aad4b767bbed24ac5eb4465bfb83bc1210522eb99d67cf4e547ec2ec7e47786"
dependencies = [ dependencies = [
"aes",
"async-trait", "async-trait",
"base64 0.22.1", "base64 0.22.1",
"bech32", "bech32",
@ -2125,19 +2112,14 @@ dependencies = [
"chacha20poly1305", "chacha20poly1305",
"getrandom", "getrandom",
"instant", "instant",
"js-sys",
"negentropy 0.3.1", "negentropy 0.3.1",
"negentropy 0.4.3", "negentropy 0.4.3",
"once_cell", "once_cell",
"reqwest",
"scrypt", "scrypt",
"serde", "serde",
"serde_json", "serde_json",
"unicode-normalization", "unicode-normalization",
"url", "url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
] ]
[[package]] [[package]]
@ -2643,54 +2625,6 @@ dependencies = [
"reborrow", "reborrow",
] ]
[[package]]
name = "quinn"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156"
dependencies = [
"bytes",
"pin-project-lite",
"quinn-proto",
"quinn-udp",
"rustc-hash 2.0.0",
"rustls",
"socket2",
"thiserror",
"tokio",
"tracing",
]
[[package]]
name = "quinn-proto"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd"
dependencies = [
"bytes",
"rand",
"ring",
"rustc-hash 2.0.0",
"rustls",
"slab",
"thiserror",
"tinyvec",
"tracing",
]
[[package]]
name = "quinn-udp"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285"
dependencies = [
"libc",
"once_cell",
"socket2",
"tracing",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.37" version = "1.0.37"
@ -2884,10 +2818,7 @@ dependencies = [
"once_cell", "once_cell",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"quinn",
"rustls",
"rustls-pemfile", "rustls-pemfile",
"rustls-pki-types",
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
@ -2895,14 +2826,11 @@ dependencies = [
"system-configuration", "system-configuration",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
"tokio-rustls",
"tokio-socks",
"tower-service", "tower-service",
"url", "url",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"webpki-roots",
"windows-registry", "windows-registry",
] ]
@ -3088,12 +3016,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustc-hash"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.35" version = "0.38.35"
@ -3114,7 +3036,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"ring",
"rustls-pki-types", "rustls-pki-types",
"rustls-webpki", "rustls-webpki",
"subtle", "subtle",
@ -3954,18 +3875,6 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "tokio-socks"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f"
dependencies = [
"either",
"futures-util",
"thiserror",
"tokio",
]
[[package]] [[package]]
name = "tokio-stream" name = "tokio-stream"
version = "0.1.15" version = "0.1.15"
@ -4377,15 +4286,6 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "webpki-roots"
version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
dependencies = [
"rustls-pki-types",
]
[[package]] [[package]]
name = "whoami" name = "whoami"
version = "1.5.1" version = "1.5.1"

View File

@ -27,7 +27,7 @@ void-cat-redirects = ["dep:sqlx-postgres"]
[dependencies] [dependencies]
log = "0.4.21" log = "0.4.21"
nostr = "0.36.0" nostr = "0.37.0"
pretty_env_logger = "0.5.0" pretty_env_logger = "0.5.0"
rocket = { version = "0.5.0", features = ["json"] } rocket = { version = "0.5.0", features = ["json"] }
tokio = { version = "1.37.0", features = ["rt", "rt-multi-thread", "macros"] } tokio = { version = "1.37.0", features = ["rt", "rt-multi-thread", "macros"] }
@ -38,7 +38,7 @@ uuid = { version = "1.8.0", features = ["v4"] }
anyhow = "^1.0.82" anyhow = "^1.0.82"
sha2 = "0.10.8" sha2 = "0.10.8"
sqlx = { version = "0.8.1", features = ["mysql", "runtime-tokio", "chrono", "uuid"] } sqlx = { version = "0.8.1", features = ["mysql", "runtime-tokio", "chrono", "uuid"] }
config = { version = "0.14.0", features = ["toml"] } config = { version = "0.14.0", features = ["yaml"] }
chrono = { version = "0.4.38", features = ["serde"] } chrono = { version = "0.4.38", features = ["serde"] }
url = "2.5.0" url = "2.5.0"
serde_with = { version = "3.8.1", features = ["hex"] } serde_with = { version = "3.8.1", features = ["hex"] }

View File

@ -33,12 +33,12 @@ docker compose -f docker-compose.prod.yml up
### Manual ### Manual
Assuming you already created your `config.toml` and configured the `database` run: Assuming you already created your `config.yaml` and configured the `database` run:
```bash ```bash
docker run --rm -it \ docker run --rm -it \
-p 8000:8000 \ -p 8000:8000 \
-v ./config.toml:/app/config.toml \ -v ./config.yaml:/app/config.yaml \
-e "RUST_LOG=info" \ -e "RUST_LOG=info" \
voidic/route96 voidic/route96
``` ```

View File

@ -1,17 +0,0 @@
# Listen address for webserver
listen = "0.0.0.0:8000"
# Database connection string (MYSQL)
database = "mysql://root:root@db:3306/route96"
# Directory to store uploads
storage_dir = "/app/data"
# Maximum support filesize for uploading
max_upload_bytes = 104857600
# Public facing url
public_url = "http://localhost:8000"
# Whitelisted pubkeys, leave out to disable
# whitelist = ["63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed"]

17
config.prod.yaml Normal file
View File

@ -0,0 +1,17 @@
# Listen address for webserver
listen: "0.0.0.0:8000"
# Database connection string (MYSQL)
database: "mysql://root:root@db:3306/route96"
# Directory to store uploads
storage_dir: "/app/data"
# Maximum support filesize for uploading
max_upload_bytes: 104857600
# Public facing url
public_url: "http://localhost:8000"
# Whitelisted pubkeys, leave out to disable
# whitelist: ["63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed"]

View File

@ -1,32 +0,0 @@
# Listen address for webserver
listen = "127.0.0.1:8000"
# Database connection string (MYSQL)
database = "mysql://root:root@localhost:3366/route96"
# Directory to store uploads
storage_dir = "./data"
# Maximum support filesize for uploading
max_upload_bytes = 5e+9
# Public facing url
public_url = "http://localhost:8000"
# Whitelisted pubkeys, leave out to disable
# whitelist = ["63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed"]
# Path for ViT(224) image model (https://huggingface.co/google/vit-base-patch16-224)
#vit_model_path = "falcon_nsfw.safetensors"
# Path for ViT(224) image model config.json
#vit_model_config_path = "falcon_nsfw.json"
# Webhook api endpoint
# webhook_url = "https://api.snort.social/api/v1/media/webhook"
# Analytics support
# plausible_url = "https://plausible.com/"
# Support legacy void
# void_cat_database = "postgres://postgres:postgres@localhost:41911/void"

31
config.yaml Normal file
View File

@ -0,0 +1,31 @@
# Listen address for webserver
listen: "127.0.0.1:8000"
# Database connection string (MYSQL)
database: "mysql://root:root@localhost:3366/route96"
# Directory to store uploads
storage_dir: "./data"
# Maximum support filesize for uploading
max_upload_bytes: 5e+9
# Public facing url
public_url: "http://localhost:8000"
# Whitelisted pubkeys, leave out to disable
# whitelist: ["63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed"]
# Path for ViT(224) image model (https://huggingface.co/google/vit-base-patch16-224)
vit_model:
model: "/home/kieran/Downloads/falcon_nsfw.safetensors"
config: "/home/kieran/Downloads/falcon_nsfw.json"
# Webhook api endpoint
# webhook_url: "https://api.snort.social/api/v1/media/webhook"
# Analytics support
# plausible_url: "https://plausible.com/"
# Support legacy void
# void_cat_database: "postgres://postgres:postgres@localhost:41911/void"

View File

@ -18,4 +18,4 @@ services:
- "8000:8000" - "8000:8000"
volumes: volumes:
- "files:/app/data" - "files:/app/data"
- "./config.prod.toml:/app/config.toml" - "./config.prod.yaml:/app/config.yaml"

View File

@ -2,6 +2,7 @@ use crate::analytics::Analytics;
use crate::settings::Settings; use crate::settings::Settings;
use anyhow::Error; use anyhow::Error;
use log::{info, warn}; use log::{info, warn};
use nostr::serde_json;
use reqwest::ClientBuilder; use reqwest::ClientBuilder;
use rocket::Request; use rocket::Request;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -36,6 +37,8 @@ impl PlausibleAnalytics {
tokio::spawn(async move { tokio::spawn(async move {
while let Some(mut msg) = rx.recv().await { while let Some(mut msg) = rx.recv().await {
msg.url = format!("{}{}", pub_url, msg.url); msg.url = format!("{}{}", pub_url, msg.url);
let body = serde_json::to_string(&msg).unwrap();
match c match c
.post(format!("{}/api/event", url)) .post(format!("{}/api/event", url))
.header( .header(
@ -52,7 +55,8 @@ impl PlausibleAnalytics {
None => "", None => "",
}, },
) )
.json(&msg) .header("content-type", "application/json")
.body(body)
.timeout(Duration::from_secs(30)) .timeout(Duration::from_secs(30))
.send() .send()
.await .await

View File

@ -39,7 +39,7 @@ async fn main() -> Result<(), Error> {
.add_source(config::File::with_name(if let Some(ref c) = args.config { .add_source(config::File::with_name(if let Some(ref c) = args.config {
c.as_str() c.as_str()
} else { } else {
"config.toml" "config.yaml"
})) }))
.add_source(config::Environment::with_prefix("APP")) .add_source(config::Environment::with_prefix("APP"))
.build()?; .build()?;

View File

@ -36,7 +36,7 @@ async fn main() -> Result<(), Error> {
pretty_env_logger::init(); pretty_env_logger::init();
let builder = Config::builder() let builder = Config::builder()
.add_source(config::File::with_name("config.toml")) .add_source(config::File::with_name("config.yaml"))
.add_source(config::Environment::with_prefix("APP")) .add_source(config::Environment::with_prefix("APP"))
.build()?; .build()?;

View File

@ -108,13 +108,8 @@ impl FileStore {
let start = SystemTime::now(); let start = SystemTime::now();
#[cfg(feature = "labels")] #[cfg(feature = "labels")]
let labels = if let Some(mp) = &self.settings.vit_model_path { let labels = if let Some(mp) = &self.settings.vit_model {
let config_path = if let Some(c) = &self.settings.vit_model_config_path { label_frame(&new_temp.result, mp.model.clone(), mp.config.clone())?
c
} else {
bail!("Missing vit_model_config_path");
};
label_frame(&new_temp.result, mp.clone(), config_path.clone())?
.iter() .iter()
.map(|l| FileLabel::new(l.0.clone(), "vit224".to_string())) .map(|l| FileLabel::new(l.0.clone(), "vit224".to_string()))
.collect() .collect()

View File

@ -55,6 +55,7 @@ unsafe fn load_image(path_buf: &Path, width: usize, height: usize) -> Result<Vec
let mut decoder = Decoder::new(); let mut decoder = Decoder::new();
decoder.setup_decoder(image_stream, None)?; decoder.setup_decoder(image_stream, None)?;
// TODO: crop image square
let mut scaler = Scaler::new(); let mut scaler = Scaler::new();
while let Ok((mut pkt, _)) = demux.get_packet() { while let Ok((mut pkt, _)) = demux.get_packet() {
if let Some(mut frame) = decoder.decode_pkt(pkt)?.into_iter().next() { if let Some(mut frame) = decoder.decode_pkt(pkt)?.into_iter().next() {

View File

@ -22,10 +22,7 @@ pub struct Settings {
pub whitelist: Option<Vec<String>>, pub whitelist: Option<Vec<String>>,
/// Path for ViT image model /// Path for ViT image model
pub vit_model_path: Option<PathBuf>, pub vit_model: Option<VitModelConfig>,
/// Path for ViT image model config.json
pub vit_model_config_path: Option<PathBuf>,
/// Webhook api endpoint /// Webhook api endpoint
pub webhook_url: Option<String>, pub webhook_url: Option<String>,
@ -36,3 +33,9 @@ pub struct Settings {
#[cfg(feature = "void-cat-redirects")] #[cfg(feature = "void-cat-redirects")]
pub void_cat_database: Option<String>, pub void_cat_database: Option<String>,
} }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VitModelConfig {
pub model: PathBuf,
pub config: PathBuf,
}

View File

@ -1,4 +1,5 @@
use anyhow::Error; use anyhow::Error;
use nostr::serde_json;
use reqwest::{Client, ClientBuilder}; use reqwest::{Client, ClientBuilder};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -31,11 +32,13 @@ impl Webhook {
subject: Some(hex::encode(pubkey)), subject: Some(hex::encode(pubkey)),
payload: fs, payload: fs,
}; };
let body = serde_json::to_string(&body)?;
let req = self let req = self
.client .client
.post(&self.url) .post(&self.url)
.header("accept", "application/json") .header("accept", "application/json")
.json(&body) .header("content-type", "application/json")
.body(body)
.send() .send()
.await?; .await?;