mirror of
https://github.com/TheFunny/TelegramTwitterMediaBot.git
synced 2026-09-23 23:32:05 +00:00
chore(log): cap container log growth and echo the resolved config
P2 of the logging plan (the README recipe landed with the code change): - `docker-compose.yml.example`: one `x-logging` anchor applied to all three services. json-file grows without limit by default, so a long-running bot and the proxy in front of it fill the disk; capped at 10m × 3 files. - The startup `config:` line now reports what the process actually resolved — the state DB path (a mistyped `DATA_DIR` or a surprising CWD was invisible until it bit), both TTLs, the caption-quote setting (`off` rather than a bare `0`) and whether a proxy is configured. The proxy URL is never printed (it may embed credentials) and admin ids — chat identifiers — stay at `debug`. Verified: `docker compose config -q` accepts the file, and a scripted fake-API run shows `caption quote off` / `link cache TTL 3600s` under overrides, `proxy=yes` with no credential in any line, and the ids at `debug` only.
This commit is contained in:
@@ -15,6 +15,8 @@ mod urls;
|
|||||||
pub use callback::callback_query_handler;
|
pub use callback::callback_query_handler;
|
||||||
pub use commands::register_commands;
|
pub use commands::register_commands;
|
||||||
pub use inline::inline_query_handler;
|
pub use inline::inline_query_handler;
|
||||||
|
/// The resolved `$DATA_DIR/task_queue.db` path, for the startup config line.
|
||||||
|
pub(crate) use statics::db_path;
|
||||||
pub use statics::{CHAT_STORE, CONFIG, LINK_CACHE, TASK_QUEUE};
|
pub use statics::{CHAT_STORE, CONFIG, LINK_CACHE, TASK_QUEUE};
|
||||||
pub use urls::{start_url_workers, stop_url_workers};
|
pub use urls::{start_url_workers, stop_url_workers};
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ static DB: LazyLock<Arc<db::DbPool>> = LazyLock::new(|| {
|
|||||||
/// create parent dirs, so the old hardcoded `data/task_queue.db` failed with
|
/// create parent dirs, so the old hardcoded `data/task_queue.db` failed with
|
||||||
/// a confusing error when started from a directory without `data/`, and a
|
/// a confusing error when started from a directory without `data/`, and a
|
||||||
/// CWD-relative path is a footgun for systemd / cron deployments — `DATA_DIR`
|
/// CWD-relative path is a footgun for systemd / cron deployments — `DATA_DIR`
|
||||||
/// lets them pin the state anywhere.
|
/// lets them pin the state anywhere. Also read by the startup config line, so
|
||||||
fn db_path() -> std::path::PathBuf {
|
/// the log says where the state actually landed.
|
||||||
|
pub(crate) fn db_path() -> std::path::PathBuf {
|
||||||
let dir = std::env::var("DATA_DIR").unwrap_or_else(|_| "data".to_string());
|
let dir = std::env::var("DATA_DIR").unwrap_or_else(|_| "data".to_string());
|
||||||
let dir_path = std::path::Path::new(&dir);
|
let dir_path = std::path::Path::new(&dir);
|
||||||
std::fs::create_dir_all(dir_path).expect("failed to create data directory");
|
std::fs::create_dir_all(dir_path).expect("failed to create data directory");
|
||||||
|
|||||||
@@ -67,11 +67,27 @@ async fn main() {
|
|||||||
log::warn!("failed to register commands: {e}");
|
log::warn!("failed to register commands: {e}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The effective tunables, so an operator can see what the process actually
|
||||||
|
// resolved (a mistyped DATA_DIR or a forgotten TTL override is otherwise
|
||||||
|
// invisible until it bites). The proxy URL is never printed — it may embed
|
||||||
|
// credentials — and admin ids are chat identifiers, so they stay at debug.
|
||||||
|
let quote_chars = match CONFIG.caption_quote_text_chars {
|
||||||
|
0 => "off".to_string(),
|
||||||
|
n => format!("{n} chars"),
|
||||||
|
};
|
||||||
log::info!(
|
log::info!(
|
||||||
"config: {} admin(s), edit-message TTL {}s",
|
"config: {} admin(s), state {}, edit-message TTL {}s, link cache TTL {}s, caption quote {quote_chars}, proxy={}",
|
||||||
CONFIG.admin_ids.len(),
|
CONFIG.admin_ids.len(),
|
||||||
CONFIG.edit_message_ttl.as_secs()
|
crate::handlers::db_path().display(),
|
||||||
|
CONFIG.edit_message_ttl.as_secs(),
|
||||||
|
CONFIG.link_cache_ttl.as_secs(),
|
||||||
|
if std::env::var("TELOXIDE_PROXY").is_ok() {
|
||||||
|
"yes"
|
||||||
|
} else {
|
||||||
|
"no"
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
log::debug!("config: admin ids {:?}", CONFIG.admin_ids);
|
||||||
|
|
||||||
// Queue worker: handles typed tasks, dead-letters failed sends to the
|
// Queue worker: handles typed tasks, dead-letters failed sends to the
|
||||||
// task's chat. Both closures use the shared context (the queue requires
|
// task's chat. Both closures use the shared context (the queue requires
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
# JSON-file logs grow without limit by default: a long-running bot (and the
|
||||||
|
# proxy in front of it) will fill the disk. One cap, applied to every service
|
||||||
|
# below via the anchor.
|
||||||
|
x-logging: &default-logging
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: '10m'
|
||||||
|
max-file: '3'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
nginx-proxy:
|
nginx-proxy:
|
||||||
image: nginxproxy/nginx-proxy:1.11.6-alpine
|
image: nginxproxy/nginx-proxy:1.11.6-alpine
|
||||||
@@ -13,6 +22,7 @@ services:
|
|||||||
labels:
|
labels:
|
||||||
- 'com.github.nginx-proxy.nginx'
|
- 'com.github.nginx-proxy.nginx'
|
||||||
container_name: nginx-proxy
|
container_name: nginx-proxy
|
||||||
|
logging: *default-logging
|
||||||
|
|
||||||
acme-companion:
|
acme-companion:
|
||||||
image: nginxproxy/acme-companion
|
image: nginxproxy/acme-companion
|
||||||
@@ -28,6 +38,7 @@ services:
|
|||||||
container_name: acme-companion
|
container_name: acme-companion
|
||||||
depends_on:
|
depends_on:
|
||||||
- nginx-proxy
|
- nginx-proxy
|
||||||
|
logging: *default-logging
|
||||||
|
|
||||||
tgxmb:
|
tgxmb:
|
||||||
image: yoursfunny/telegram-twitter-media-bot:latest
|
image: yoursfunny/telegram-twitter-media-bot:latest
|
||||||
@@ -55,6 +66,7 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- nginx-proxy
|
- nginx-proxy
|
||||||
container_name: tgxmb
|
container_name: tgxmb
|
||||||
|
logging: *default-logging
|
||||||
# Webhook mode only: the bot listens on WEBHOOK_PORT; nginx-proxy shows
|
# Webhook mode only: the bot listens on WEBHOOK_PORT; nginx-proxy shows
|
||||||
# 502s while this is down, so surface it to the orchestrator.
|
# 502s while this is down, so surface it to the orchestrator.
|
||||||
healthcheck:
|
healthcheck:
|
||||||
|
|||||||
Reference in New Issue
Block a user