CI / Format & lint (push) Successful in 19s
CI / Test suite (push) Successful in 47s
Docs / Validate documentation (push) Successful in 19s
Rust / fmt, clippy, test, build (push) Successful in 7m35s
Security / Dependency vulnerabilities (push) Successful in 1m37s
Security / Static analysis (push) Successful in 17s
Security / License report (push) Successful in 1m30s
rust/collector replaces the collection half of the Python web app: RID hourly gauges (with the late-report semantics: store everything, retry every 10 min while RID is behind, re-fetch yesterday's holes, startup gap fill), HII rain + water level, RID dams (today + yesterday) and Open-Meteo rain. Same tables and upsert semantics, one UNNEST statement per table, Bangkok wall-clock time regardless of the server time zone. Python side: COLLECTION_ENABLED=false makes the API leader stop collecting and instead re-forecast + notify when the newest RID reading in the database advances (polled every FORECAST_POLL_SECONDS) and once per clock hour; /scraping/status then serves the collector's status file; /scrape/trigger answers 409. Verified: 20 Rust tests (parsers, gap/schedule logic, database tests against PostgreSQL); live parity run of both collectors into two empty databases: all 9 tables row-for-row identical (scripts/collector_parity.py); the Python API served health, measurements, stats, status and model forecasts from a database filled only by ping-collector. 177 Python tests pass. reqwest uses native-tls: app.rid.go.th offers only TLS 1.2 CBC suites, which rustls refuses. Deploy/cutover/rollback: scripts/install_collector.sh, scripts/ping-collector.service; CI: .gitea/workflows/rust.yml (fmt, clippy, tests with a PostgreSQL service, release artifact).
30 lines
1.1 KiB
TOML
30 lines
1.1 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["collector"]
|
|
|
|
[workspace.package]
|
|
edition = "2024"
|
|
license = "MIT"
|
|
publish = false
|
|
repository = "https://git.b4l.co.th/B4L/Northern-Thailand-Ping-River-Monitor"
|
|
|
|
[workspace.dependencies]
|
|
anyhow = "1"
|
|
chrono = { version = "0.4", default-features = false, features = ["std", "clock", "serde"] }
|
|
clap = { version = "4", features = ["derive"] }
|
|
dotenvy = "0.15"
|
|
# native-tls (OpenSSL on Linux, SChannel on Windows), not rustls: app.rid.go.th (dams)
|
|
# offers only TLS 1.2 CBC suites (ECDHE-RSA-AES256-SHA384), which rustls refuses.
|
|
reqwest = { version = "0.12", default-features = false, features = ["native-tls", "json"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "tls-rustls", "postgres", "chrono", "macros"] }
|
|
tokio = { version = "1", features = ["rt-multi-thread", "macros", "time", "signal"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
strip = true
|