diff --git a/README.md b/README.md index 7cee3d8c14..281d6003b7 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,9 @@ Windmill is fully open-sourced: `docker compose up` with the following docker-compose is sufficient: +For older kernels < 4.18, set DISABLE_NUSER to true otherwise nsjail will not be +able to launch the isolated scripts. + The default super-admin user is: admin@windmill.dev / changeme From there, you can create other users (do not forget to change the password!) diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 3030eb2e01..5e5a7b31a9 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -265,6 +265,7 @@ pub async fn run_workers( num_workers: i32, sleep_queue: u64, base_url: String, + disable_nuser: bool, tx: tokio::sync::broadcast::Sender<()>, ) -> anyhow::Result<()> { let instance_name = rd_string(5); @@ -304,6 +305,7 @@ pub async fn run_workers( &ip, sleep_queue, &base_url, + disable_nuser, tx, ) .await diff --git a/backend/src/main.rs b/backend/src/main.rs index 52fa2727d6..cfbc60adf6 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -66,7 +66,14 @@ async fn main() -> anyhow::Result<()> { .ok() .and_then(|x| x.parse::().ok()) .unwrap_or(windmill::DEFAULT_SLEEP_QUEUE); + let disable_nuser = std::env::var("DISABLE_NUSER") + .ok() + .and_then(|x| x.parse::().ok()) + .unwrap_or(false); + tracing::info!( + "DISABLE_NUSER: {disable_nuser}, BASE_URL: {base_url}, SLEEP_QUEUE: {sleep_queue}, NUM_WORKERS: {num_workers}, TIMEOUT: {timeout}" + ); windmill::run_workers( db.clone(), addr, @@ -74,6 +81,7 @@ async fn main() -> anyhow::Result<()> { num_workers, sleep_queue, base_url, + disable_nuser, tx.clone(), ) .await?; diff --git a/backend/src/worker.rs b/backend/src/worker.rs index 0d265c71c2..970a369713 100644 --- a/backend/src/worker.rs +++ b/backend/src/worker.rs @@ -64,6 +64,7 @@ pub async fn run_worker( ip: &str, sleep_queue: u64, base_url: &str, + disable_nuser: bool, tx: tokio::sync::broadcast::Sender<()>, ) { let worker_dir = format!("{TMP_DIR}/{worker_name}"); @@ -106,10 +107,17 @@ pub async fn run_worker( tracing::info!(worker = %worker_name, id = %job.id, "Fetched job"); let job2 = job.clone(); - if let Some(err) = - handle_queued_job(job, db, timeout, &worker_name, &worker_dir, base_url) - .await - .err() + if let Some(err) = handle_queued_job( + job, + db, + timeout, + &worker_name, + &worker_dir, + base_url, + disable_nuser, + ) + .await + .err() { let err_string = err.to_string().clone(); let _ = add_completed_job_error( @@ -161,6 +169,7 @@ async fn handle_queued_job( worker_name: &str, worker_dir: &str, base_url: &str, + disable_nuser: bool, ) -> crate::error::Result<()> { let job_id = job.id; let w_id = &job.workspace_id.clone(); @@ -197,6 +206,7 @@ async fn handle_queued_job( &mut logs, &mut last_line, base_url, + disable_nuser, ) .await; @@ -272,6 +282,7 @@ async fn handle_job( mut logs: &mut String, mut last_line: &mut String, base_url: &str, + disable_nuser: bool, ) -> Result { tracing::info!( worker = %worker_name, @@ -389,9 +400,13 @@ async fn handle_job( .await?; let _ = write_file(&job_dir, "requirements.txt", &requirements).await?; + let mut args = vec!["--config", "download.config.proto"]; + if disable_nuser { + args.insert(0, "--disable_clone_newuser") + } let child = Command::new("nsjail") .current_dir(&job_dir) - .args(vec!["--config", "download.config.proto"]) + .args(args) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn()?; @@ -488,17 +503,21 @@ print(res_json) ) .await?; + let mut args = vec![ + "--config", + "run.config.proto", + "--", + "/usr/local/bin/python3", + "-u", + "/tmp/main.py", + ]; + if disable_nuser { + args.insert(0, "--disable_clone_newuser") + } let child = Command::new("nsjail") .current_dir(&job_dir) .envs(reserved_variables) - .args(vec![ - "--config", - "run.config.proto", - "--", - "/usr/local/bin/python3", - "-u", - "/tmp/main.py", - ]) + .args(args) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn()?; @@ -592,19 +611,23 @@ run(); ) .await?; + let mut args = vec![ + "--config", + "run.config.proto", + "--", + "/usr/bin/deno", + "run", + "--v8-flags=--max-heap-size=2048", + "-A", + "/tmp/main.ts", + ]; + if disable_nuser { + args.insert(0, "--disable_clone_newuser") + } let child = Command::new("nsjail") .current_dir(&job_dir) .envs(reserved_variables) - .args(vec![ - "--config", - "run.config.proto", - "--", - "/usr/bin/deno", - "run", - "--v8-flags=--max-heap-size=2048", - "-A", - "/tmp/main.ts", - ]) + .args(args) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn()?; diff --git a/docker-compose.yml b/docker-compose.yml index 7ce8e051a9..bf5da58889 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -34,6 +34,7 @@ services: - RUST_BACKTRACE=1 - GITHUB_OAUTH_CLIENT_ID=${GITHUB_OAUTH_CLIENT_ID} - GITHUB_OAUTH_CLIENT_SECRET=${GITHUB_OAUTH_CLIENT_SECRET} + - DISABLE_NUSER=false depends_on: db: