From a11b81bfdd5ebe96abb416cbe17f7808ad9cd3f8 Mon Sep 17 00:00:00 2001 From: charlesgauthereau Date: Mon, 12 Jan 2026 11:52:57 +0100 Subject: [PATCH] fix: patch timezone error. --- docker-compose.yml | 2 +- docker/Dockerfile | 6 +++++- src/domain/mysql/backup.rs | 19 ++++++++++++++++--- src/domain/mysql/connection.rs | 27 +++++++++++++++++++++++++++ src/domain/mysql/mod.rs | 3 ++- src/utils/locks.rs | 5 +++-- src/utils/task_manager/cron.rs | 5 +++-- src/utils/task_manager/scheduler.rs | 4 +++- 8 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 src/domain/mysql/connection.rs diff --git a/docker-compose.yml b/docker-compose.yml index 7277dba..d88732f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: # POOLING: 1 TZ: "Europe/Paris" # DATABASES_CONFIG_FILE: "config.toml" - EDGE_KEY: "eyJzZXJ2ZXJVcmwiOiJodHRwOi8vbG9jYWxob3N0Ojg4ODciLCJhZ2VudElkIjoiOThlZmY1YjEtMDQyZC00MDkxLWJkYjctZTgzYmM0YjczNjAxIiwicHVibGljS2V5IjoiLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tXG5NSUlCQ2dLQ0FRRUFuYUVKdnVBSExlNGF5d0RmNGplelVobm45VXRkdksyZ3pEMEg2cERJYXczYkJKRkpwVnVDXG5uVFV3MXA3Q2RnOXBzdjZhRnpyOXZPd0J2MjMzckxpdVpCT2lCb2p2Q0QrSlZid3hyTzBRRW5hN2dmaHV1ZGYwXG5VVlJOMkxmK1g1aTkvZzJTNm5xcExoTm1DaGFJNk8ybktYZUNlRmtubEErRUJrNnFoV1FCVGozb05TYTFTOFY1XG40UFRTT2I4NUo3a2k5YllEbXRiNWxrU3dCNXdXOTdtQjg0ZzI2WHAvU3FFcmhKc0NGK3YrN09vTWYzTzJqTTNoXG5XMUQ0MzBPRitWaklwUGdoV09rZy96NXZQUWFHRzhqQ0h4VDlJR0Q0bjhyS05LQ3FTOGNyN2diTGU0cWpNdmhvXG5BQVVvaHpHR2FRNkhlWlJ4S0UvM3J1a2JldnY5dnJ2TTNRSURBUUFCXG4tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tXG4ifQ" + EDGE_KEY: "eyJzZXJ2ZXJVcmwiOiJodHRwOi8vbG9jYWxob3N0Ojg4ODciLCJhZ2VudElkIjoiOWU0NjE0YTEtMjJkMi00NWJlLTgyZWEtMTI4MzQ1OGU0YjUwIiwicHVibGljS2V5IjoiLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tXG5NSUlCQ2dLQ0FRRUFuYUVKdnVBSExlNGF5d0RmNGplelVobm45VXRkdksyZ3pEMEg2cERJYXczYkJKRkpwVnVDXG5uVFV3MXA3Q2RnOXBzdjZhRnpyOXZPd0J2MjMzckxpdVpCT2lCb2p2Q0QrSlZid3hyTzBRRW5hN2dmaHV1ZGYwXG5VVlJOMkxmK1g1aTkvZzJTNm5xcExoTm1DaGFJNk8ybktYZUNlRmtubEErRUJrNnFoV1FCVGozb05TYTFTOFY1XG40UFRTT2I4NUo3a2k5YllEbXRiNWxrU3dCNXdXOTdtQjg0ZzI2WHAvU3FFcmhKc0NGK3YrN09vTWYzTzJqTTNoXG5XMUQ0MzBPRitWaklwUGdoV09rZy96NXZQUWFHRzhqQ0h4VDlJR0Q0bjhyS05LQ3FTOGNyN2diTGU0cWpNdmhvXG5BQVVvaHpHR2FRNkhlWlJ4S0UvM3J1a2JldnY5dnJ2TTNRSURBUUFCXG4tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tXG4ifQ" extra_hosts: - "localhost:host-gateway" networks: diff --git a/docker/Dockerfile b/docker/Dockerfile index 33dfeba..7412f0f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -19,10 +19,11 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ && rm -rf /var/lib/apt/lists/* +ARG TARGETARCH + # ========================= # PostgreSQL client binaries (versions 12-18) # ========================= -ARG TARGETARCH RUN for v in 12 13 14 15 16 17 18; do \ mkdir -p /usr/lib/postgresql/$v/bin; \ @@ -44,6 +45,9 @@ RUN if [ "$TARGETARCH" = "amd64" ]; then \ chmod +x /usr/lib/postgresql/*/bin/* + + + WORKDIR /app # ========================= diff --git a/src/domain/mysql/backup.rs b/src/domain/mysql/backup.rs index a8704ff..2ec7531 100644 --- a/src/domain/mysql/backup.rs +++ b/src/domain/mysql/backup.rs @@ -1,10 +1,10 @@ +use crate::domain::mysql::connection::server_version; +use crate::services::config::DatabaseConfig; use anyhow::{Context, Result}; -use tracing::debug; use std::collections::HashMap; use std::path::PathBuf; use std::process::Command; - -use crate::services::config::DatabaseConfig; +use tracing::{debug, error, info}; pub async fn run( cfg: DatabaseConfig, @@ -15,6 +15,19 @@ pub async fn run( tokio::task::spawn_blocking(move || -> Result { debug!("Starting backup for database {}", cfg.name); + let version = match futures::executor::block_on(server_version(&cfg)) { + Ok(v) => { + debug!("Mysql version detected: {}", v); + v + } + Err(e) => { + error!("Failed to get server version for {}: {:?}", cfg.name, e); + return Err(e.into()); + } + }; + + info!("Mysql version found: {}", version); + let file_path = backup_dir.join(format!("{}{}", cfg.generated_id, file_extension)); let output = Command::new("mysqldump") diff --git a/src/domain/mysql/connection.rs b/src/domain/mysql/connection.rs new file mode 100644 index 0000000..b89a0f8 --- /dev/null +++ b/src/domain/mysql/connection.rs @@ -0,0 +1,27 @@ +use crate::services::config::DatabaseConfig; +use std::process::Command; +use anyhow::Result; + +pub async fn server_version(cfg: &DatabaseConfig) -> Result { + let output = Command::new("mysql") + .arg("--host").arg(&cfg.host) + .arg("--port").arg(cfg.port.to_string()) + .arg("--user").arg(&cfg.username) + .arg("-e").arg("SELECT VERSION();") + .env("MYSQL_PWD", &cfg.password) + .output()?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Version query failed: {}", stderr); + } + + let version = String::from_utf8_lossy(&output.stdout) + .lines() + .nth(1) // skip column header + .unwrap_or_default() + .trim() + .to_string(); + + Ok(version) +} diff --git a/src/domain/mysql/mod.rs b/src/domain/mysql/mod.rs index b0f6824..1bfe59e 100644 --- a/src/domain/mysql/mod.rs +++ b/src/domain/mysql/mod.rs @@ -1,4 +1,5 @@ pub mod backup; pub mod database; mod restore; -mod ping; \ No newline at end of file +mod ping; +mod connection; \ No newline at end of file diff --git a/src/utils/locks.rs b/src/utils/locks.rs index 213b0e9..76b1d74 100644 --- a/src/utils/locks.rs +++ b/src/utils/locks.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use chrono::Utc; +use chrono::{Local}; use tracing::{info, warn, error}; use std::path::{Path, PathBuf}; use std::time::{Duration, SystemTime}; @@ -90,7 +90,8 @@ impl FileLock { f.write_all(format!("Service: {}\n", service_name).as_bytes()).await?; f.write_all(format!("PID: {}\n", std::process::id()).as_bytes()).await?; - f.write_all(format!("Timestamp: {}\n", Utc::now()).as_bytes()).await?; + // f.write_all(format!("Timestamp: {}\n", Utc::now()).as_bytes()).await?; + f.write_all(format!("Timestamp: {}\n", Local::now()).as_bytes()).await?; info!("Successfully acquired lock for {}", id); Ok(()) diff --git a/src/utils/task_manager/cron.rs b/src/utils/task_manager/cron.rs index a0adc6b..5cc3756 100644 --- a/src/utils/task_manager/cron.rs +++ b/src/utils/task_manager/cron.rs @@ -1,7 +1,7 @@ use crate::utils::task_manager::models; use crate::utils::task_manager::tasks::{remove_task, upsert_task}; use crate::utils::text::normalize_cron; -use chrono::Utc; +use chrono::{Local}; use cron::Schedule; use tracing::debug; use redis::AsyncCommands; @@ -11,7 +11,8 @@ use tracing::info; pub fn next_run_timestamp(expr: &str) -> i64 { let schedule = Schedule::from_str(expr).unwrap(); - schedule.upcoming(Utc).next().unwrap().timestamp() + // schedule.upcoming(Utc).next().unwrap().timestamp() + schedule.upcoming(Local).next().unwrap().timestamp() } pub async fn check_and_update_cron( diff --git a/src/utils/task_manager/scheduler.rs b/src/utils/task_manager/scheduler.rs index e2f115f..06e9de1 100644 --- a/src/utils/task_manager/scheduler.rs +++ b/src/utils/task_manager/scheduler.rs @@ -13,7 +13,9 @@ use tracing::error; pub async fn scheduler_loop(mut conn: MultiplexedConnection) { loop { - let now = chrono::Utc::now().timestamp(); + // let now = chrono::Utc::now().timestamp(); + let now = chrono::Local::now().timestamp(); + // info!("Scheduling task {}", chrono::Local::now()); let due: Vec = conn .zrangebyscore(SCHEDULE_KEY, 0, now)