Fixes

Changes

  • Added custom timeout for database proxies on the dashboard ( All one click databases + one click service databases )

https://github.com/user-attachments/assets/eb43ffec-ec7f-42e7-9738-b71631fee8d8

On the above video I use timeout less than 10s because I don’t want to make the video too long

Notes:

  1. Minimum timeout is 0 seconds (we can force like min 10s but allowing min as 0 would give user more control over the timeout), also default is 1800 (30mins)
  2. Maximum timeout is 31536000 seconds which is 1 year (check comments below)
  3. To update the timeout user must disable “Make it publicly available” and enable it again (I tried to make nginx auto reload new timeout config but didn’t got any success with it)
  4. Enabled TCP keepalive by default (has no effect for short timeouts but important for long lived connections)
  5. I don’t know PHP so all the changes are done by AI, but tested the changes locally.

Testing

  1. I am using a mac and I was getting few issue with volumes (expected with docker desktop) so I was building the coolify image on Github actions (https://github.com/ShadowArcanist/coolify-dev/actions/workflows/coolify-production-build.yml) and used ghcr.io/shadowarcanist/coolify-dev:latest to test it locally.
  2. Downgrading to previous version works fine without any issue (proxy started before the downgrade will use the config you used before the downgrade – until you stop the proxy by unchecking “Make it publicly available”)
  3. On the attached video you can see I was using a rust app to test if the proxy timeouts were working as it should be so below is the codebase for that rust app:
// main.rs
use std::net::TcpStream;
use std::time::{Duration, Instant};
use std::io::{Read};
use std::process::exit;
fn main() {
let addr = "192.168.1.222:5566"; // NGINX stream port
let probe_interval = Duration::from_secs(1);
println!("Connecting to {}", addr);
let mut stream = match TcpStream::connect(addr) {
Ok(s) => s,
Err(e) => {
eprintln!("Connection failed: {}", e);
exit(1);
}
};
// Make reads non-blocking so we don't hang forever
stream
.set_read_timeout(Some(Duration::from_secs(1)))
.expect("Failed to set read timeout");
let start = Instant::now();
let mut buf = [0u8; 1];
println!("Connected. Waiting for NGINX to close idle connection...");
loop {
match stream.read(&mut buf) {
Ok(0) => {
println!(
"Connection closed cleanly (EOF) after {:.2?}",
start.elapsed()
);
break;
}
Ok(_) => {
println!("Unexpected data received (connection active)");
}
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock
|| e.kind() == std::io::ErrorKind::TimedOut =>
{
// Normal idle state
}
Err(e) => {
println!(
"Connection closed by peer after {:.2?}: {}",
start.elapsed(),
e
);
break;
}
}
std::thread::sleep(probe_interval);
}
println!("Test complete.");
}

/claim https://github.com/coollabsio/coolify/issues/7743

Claim

Total prize pool $100
Total paid $0
Status Pending
Submitted December 23, 2025
Last updated December 23, 2025

Contributors

SH

ShadowArcanist

@ShadowArcanist

100%

Sponsors

ZA

Zach Latta

@zachlatta

$100