Add telegram-archiver microservice (MVP)

This commit is contained in:
2026-02-19 21:41:52 +03:00
parent 7166f535d6
commit 6332b91ba4
13 changed files with 1635 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
"""
Configuration management for Telegram Archiver.
Uses pydantic-settings for .env file parsing and validation.
"""
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field
from pathlib import Path
from typing import Optional
class Settings(BaseSettings):
"""Application settings loaded from environment variables and .env file."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore",
)
# Telegram API credentials
api_id: int = Field(..., description="Telegram API ID from my.telegram.org")
api_hash: str = Field(..., description="Telegram API Hash from my.telegram.org")
phone: str = Field(..., description="Phone number for Telegram account")
# Session configuration
session_name: str = Field(
default="telegram-archiver",
description="Session name for Telethon (creates .session file)"
)
# File download limits
max_file_size: int = Field(
default=209715200, # 200 MB
description="Maximum file size to download in bytes"
)
# Output configuration
output_dir: Path = Field(
default=Path("./archives"),
description="Directory to store archived channels"
)
# Logging configuration
log_level: str = Field(
default="INFO",
description="Logging level: DEBUG, INFO, WARNING, ERROR"
)
# OpenTelemetry (optional, for future)
otel_service_name: str = Field(
default="telegram-archiver",
description="Service name for OpenTelemetry traces"
)
otel_enabled: bool = Field(
default=False,
description="Enable OpenTelemetry tracing"
)
@property
def session_path(self) -> Path:
"""Return full path to session file."""
return Path(__file__).parent / f"{self.session_name}.session"
def validate_credentials(self) -> bool:
"""Validate that required credentials are present."""
if self.api_id <= 0:
raise ValueError("API_ID must be a positive integer")
if len(self.api_hash) < 10:
raise ValueError("API_HASH seems too short")
if not self.phone.startswith("+"):
raise ValueError("PHONE must start with +")
return True
# Global settings instance
settings: Optional[Settings] = None
def get_settings() -> Settings:
"""Get or create settings instance."""
global settings
if settings is None:
settings = Settings()
settings.validate_credentials()
return settings