feat: prepare all services for production deployment

Co-authored-by: blackboxprogramming <118287761+blackboxprogramming@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-03-06 02:28:24 +00:00
parent b1953ea883
commit 9085e7a023
37 changed files with 668 additions and 13 deletions

5
roadchain/.dockerignore Normal file
View File

@@ -0,0 +1,5 @@
target
.git
.gitignore
README.md
.DS_Store

5
roadchain/.env.example Normal file
View File

@@ -0,0 +1,5 @@
# Server
PORT=8080
# CORS
CORS_ORIGIN=https://your-domain.com

18
roadchain/Dockerfile Normal file
View File

@@ -0,0 +1,18 @@
FROM rust:1.75-slim AS builder
WORKDIR /app
RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/*
COPY Cargo.toml ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release && rm -f target/release/deps/roadchain*
COPY src ./src
RUN cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN groupadd --system appgroup && useradd --system --gid appgroup appuser
COPY --from=builder /app/target/release/roadchain .
RUN chown appuser:appgroup ./roadchain
USER appuser
EXPOSE 8080
CMD ["./roadchain"]

View File

@@ -5,6 +5,7 @@ use sha2::{Sha256, Digest};
use std::sync::Mutex;
use chrono::Utc;
use uuid::Uuid;
use std::env;
#[derive(Debug, Clone, Serialize, Deserialize)]
struct Block {
@@ -62,9 +63,10 @@ async fn root() -> impl Responder {
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string());
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
let addr = format!("0.0.0.0:{}", port);
let allowed_origin = env::var("CORS_ORIGIN").unwrap_or_else(|_| "http://localhost:3000".to_string());
let genesis = Block::new(0, "Genesis".to_string(), "0".to_string());
let app_state = web::Data::new(AppState {
blockchain: Mutex::new(vec![genesis]),
@@ -73,10 +75,16 @@ async fn main() -> std::io::Result<()> {
println!("RoadChain running on port {}", port);
HttpServer::new(move || {
let cors = Cors::default()
.allowed_origin(&allowed_origin)
.allowed_methods(vec!["GET", "POST"])
.allowed_headers(vec!["Content-Type", "Authorization"])
.max_age(3600);
App::new()
.wrap(Cors::default().allow_any_origin())
.wrap(cors)
.app_data(app_state.clone())
.route("/health", web::get().to(health_check))
.route("/api/health", web::get().to(health_check))
.route("/", web::get().to(root))
})
.bind(&addr)?