From 5c4650be91511aad9a5bc792c9b2625e8dc58e93 Mon Sep 17 00:00:00 2001 From: skal Date: Tue, 3 Feb 2026 15:27:12 +0100 Subject: initial commit --- Cargo.toml | 12 ++ HOWTO.md | 47 ++++++++ demo.html | 32 ++++++ nginx/taar-o.com | 51 +++++++++ src/main.rs | 72 ++++++++++++ static/index.html | 326 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 540 insertions(+) create mode 100644 Cargo.toml create mode 100644 HOWTO.md create mode 100644 demo.html create mode 100644 nginx/taar-o.com create mode 100644 src/main.rs create mode 100644 static/index.html diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a2ab1a7 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "skal_server" +version = "0.1.0" +edition = "2021" + +[dependencies] +axum = "0.6" +tokio = { version = "1", features = ["full"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +uuid = { version = "1", features = ["v4"] } +tower-http = { version = "0.3", features = ["cors"] } diff --git a/HOWTO.md b/HOWTO.md new file mode 100644 index 0000000..72d1050 --- /dev/null +++ b/HOWTO.md @@ -0,0 +1,47 @@ +# how to use + +PORT=3001 cargo run +curl -X POST "http://127.0.0.1:3001/api/echo?name=Dev" +curl -X GET "http://127.0.0.1:3001/" + +## release + +cargo build --release + +=> binary is at target/release/skal_server +=> test: PORT=3001 ./target/release/skal_server + +=> stop the current service: + +sudo systemctl stop skal-server + +=> update the binary + +sudo cp target/release/skal_server /opt/skal_server/skal_server +sudo cp -R static/*html /opt/skal_server/static +sudo chmod +x /opt/skal_server/skal_server + +=> restart + +sudo systemctl restart skal-server + +=> check status: + +sudo systemctl status skal-server + +=> verify endpoint: + +curl -X POST "https://www.taar-o.com/api/echo?name=ProdTest" + +=> logs + +sudo journalctl -u skal-server -f + +## nginx + +=> config: +/etc/nginx/sites-available/taar-o.com + +=> relaunch +sudo nginx -t +sudo systemctl reload nginx diff --git a/demo.html b/demo.html new file mode 100644 index 0000000..4becabe --- /dev/null +++ b/demo.html @@ -0,0 +1,32 @@ + + + + + Axum Echo + + +

Axum Echo Demo

+ + + + +

+ + + + + diff --git a/nginx/taar-o.com b/nginx/taar-o.com new file mode 100644 index 0000000..998bc9d --- /dev/null +++ b/nginx/taar-o.com @@ -0,0 +1,51 @@ +server { + server_name www.taar-o.com taar-o.com; + + root /var/www/taar-o.com; + index index.html; + + location /.well-known/acme-challenge/ { + alias /var/www/taar-o.com/.well-known/acme-challenge/; + try_files $uri =404; + } + + location / { + try_files $uri $uri/ =404; + } + + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/www.taar-o.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/www.taar-o.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + + location /api/ { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + +} +server { + if ($host = taar-o.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + if ($host = www.taar-o.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + server_name www.taar-o.com taar-o.com; + return 404; # managed by Certbot + + + + +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f0775b5 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,72 @@ +use axum::{ + extract::{Query, State}, + response::{Html, IntoResponse}, + routing::{get, post}, + Json, Router, +}; +use serde::Serialize; +use std::fs; +use std::net::SocketAddr; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; +use uuid::Uuid; + +#[derive(Default)] +struct AppState { + sessions: Mutex>, +} + +#[derive(Serialize)] +struct EchoResponse { + name: String, + session_id: String, +} + +async fn echo( + State(state): State>, + Query(params): Query>, +) -> Json { + let name = params.get("name").cloned().unwrap_or_default(); + let session_id = Uuid::new_v4().to_string(); + + state + .sessions + .lock() + .unwrap() + .insert(session_id.clone(), name.clone()); + + Json(EchoResponse { name, session_id }) +} + +#[tokio::main] +async fn main() { + let state = Arc::new(AppState::default()); + + let port: u16 = std::env::var("PORT") + .unwrap_or_else(|_| "3000".into()) + .parse() + .expect("PORT must be a number"); + + let addr = SocketAddr::from(([127, 0, 0, 1], port)); + + let app = Router::new() + .route( + "/", + get(|| async { + // Serve the default index.html + match fs::read_to_string("static/index.html") { + Ok(html) => Html(html).into_response(), + Err(_) => "Index not found".into_response(), + } + }), + ) + .route("/api/echo", post(echo)) + .with_state(state); + + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); +} diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..393be43 --- /dev/null +++ b/static/index.html @@ -0,0 +1,326 @@ + + + + + Taar-O + + + + + + + + + + + + + +
+ +
+
+ +
+

TAAR-O

+

Exploring Noise

+
+
+
+
+ (c) MASSIMINO Pascal - Metaskal.com +
+ + -- cgit v1.2.3