From c5909c6a364b7779218d442450073e41fb769076 Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Tue, 2 Jun 2026 13:40:24 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20WriteTimeout=2030s=20=E2=86=92=2010m=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=B4=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Скачивание нового прайслиста через VPN с высокой задержкой (>600 мс RTT) превышало WriteTimeout=30s — браузер не получал ответ на POST /api/sync/all и пользователь видел зависание без фидбека. Сервер слушает только loopback, внешних клиентов нет — длинный таймаут не создаёт угрозы безопасности. Co-Authored-By: Claude Sonnet 4.6 --- cmd/qfs/main.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/qfs/main.go b/cmd/qfs/main.go index c147c53..acce2ee 100644 --- a/cmd/qfs/main.go +++ b/cmd/qfs/main.go @@ -332,7 +332,9 @@ func setConfigDefaults(cfg *config.Config) { cfg.Server.ReadTimeout = 30 * time.Second } if cfg.Server.WriteTimeout == 0 { - cfg.Server.WriteTimeout = 30 * time.Second + // Sync operations (pricelist download over slow VPN) can take several minutes. + // Loopback-only binding means there is no risk of holding connections from external clients. + cfg.Server.WriteTimeout = 10 * time.Minute } if cfg.Backup.Time == "" { cfg.Backup.Time = "00:00" @@ -394,7 +396,7 @@ func ensureDefaultConfigFile(configPath string) error { port: 8080 mode: "release" read_timeout: 30s - write_timeout: 30s + write_timeout: 10m backup: time: "00:00"