namespace OTSSignsOrchestrator.Core.Configuration; public class FileLoggingOptions { public const string SectionName = "FileLogging"; public bool Enabled { get; set; } = true; public string Path { get; set; } = "logs"; public string RollingInterval { get; set; } = "Day"; public int RetentionDays { get; set; } = 30; public long FileSizeLimitBytes { get; set; } = 100 * 1024 * 1024; // 100MB } public class GitOptions { public const string SectionName = "Git"; public string CacheDir { get; set; } = ".template-cache"; public int CacheTtlMinutes { get; set; } = 60; public int ShallowCloneDepth { get; set; } = 1; } public class DockerOptions { public const string SectionName = "Docker"; public List DefaultConstraints { get; set; } = new() { "node.labels.xibo==true" }; public int DeployTimeoutSeconds { get; set; } = 30; public bool ValidateBeforeDeploy { get; set; } = true; } public class XiboDefaultImages { public string Cms { get; set; } = "ghcr.io/xibosignage/xibo-cms:release-4.4.0"; public string Mysql { get; set; } = "mysql:8.4"; public string Memcached { get; set; } = "memcached:alpine"; public string QuickChart { get; set; } = "ianw/quickchart"; } public class XiboOptions { public const string SectionName = "Xibo"; public XiboDefaultImages DefaultImages { get; set; } = new(); public int TestConnectionTimeoutSeconds { get; set; } = 10; } public class DatabaseOptions { public const string SectionName = "Database"; public string Provider { get; set; } = "Sqlite"; } /// /// Bitwarden Secrets Manager connection settings. /// Stored in appsettings.json so they can bootstrap the connection before any other settings are loaded. /// public class BitwardenOptions { public const string SectionName = "Bitwarden"; public string IdentityUrl { get; set; } = "https://identity.bitwarden.com"; public string ApiUrl { get; set; } = "https://api.bitwarden.com"; /// Machine account access token (sensitive — may be set via environment variable). public string AccessToken { get; set; } = string.Empty; public string OrganizationId { get; set; } = string.Empty; /// Project where config secrets are created/listed. Required. public string ProjectId { get; set; } = string.Empty; /// /// Optional separate project for instance-level secrets (DB passwords, Newt credentials, etc.). /// When empty, instance secrets are stored in the default . /// public string InstanceProjectId { get; set; } = string.Empty; } public class InstanceDefaultsOptions { public const string SectionName = "InstanceDefaults"; /// Default template repo URL if not overridden per-instance. public string? TemplateRepoUrl { get; set; } public string? TemplateRepoPat { get; set; } /// Template for CMS server hostname. Use {abbrev} as placeholder. public string CmsServerNameTemplate { get; set; } = "{abbrev}.ots-signs.com"; public string SmtpServer { get; set; } = string.Empty; public string SmtpUsername { get; set; } = string.Empty; public string SmtpPassword { get; set; } = string.Empty; public int BaseHostHttpPort { get; set; } = 8080; /// Template for theme path. Use {abbrev} as placeholder. /// Static host path for the theme volume mount. Overridable per-instance. public string ThemeHostPath { get; set; } = "/cms/ots-theme"; /// Subfolder name on CIFS share for the library volume. Use {abbrev} as placeholder. public string LibraryShareSubPath { get; set; } = "{abbrev}-cms-library"; public string MySqlDatabaseTemplate { get; set; } = "{abbrev}_cms_db"; public string MySqlUserTemplate { get; set; } = "{abbrev}_cms_user"; }