mirror of
https://github.com/MAKS-IT-COM/maksit-certs-ui.git
synced 2026-05-16 04:48:12 +02:00
9.7 KiB
9.7 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.3.12] - 2026-04-26
Fixed
- FluentMigrator: Use
.ScanIn(…).For.All()instead of.For.Migrations()so in-process discovery matches FluentMigrator guidance (avoids “no migrations” / incomplete runner behavior in some versions). - FluentMigrator: Throw if the engine connection string is empty when registering the runner — a null/empty
WithGlobalConnectionStringputs the processor in connectionless/preview mode (SQL logged, nothing committed), which matches reports of empty databases with no errors. - Migrations: Log host/database (no password) and count of
[Migration]types beforeMigrateUp; after coordination DDL, verifypublic.usersorpublic."VersionInfo"exists or fail with an actionable error (wrongDatabase=, permissions, or preview mode). - Database bootstrap: If the role cannot open a maintenance connection to database
postgres(common for locked-down app users), log a warning and skip automaticCREATE DATABASEinstead of failing the whole migration step.
[3.3.11] - 2026-04-26
Added
- Database: FluentMigrator
RestoreUsersJwtTokensJsonIfDropped(20260426120000) restoresusers.JwtTokensJsonwithADD COLUMN IF NOT EXISTSwhen an older database had it removed by a priorJwtTokensTableMigrateFromJsonrevision. - Helm / config:
certsServerConfig.configuration.certsUIEngineConfiguration.autoSyncSchema(defaulttrue) is rendered into serverappsettings.jsonso add-only schema sync runs on every startup unless explicitly disabled.
Changed
- Startup schema policy: Documented expand-only expectations — FluentMigrator
Up()should add tables/columns; avoid dropping renamed or legacy columns inUp().JwtTokensTableMigrateFromJsonno longer dropsJwtTokensJson(tokens remain injwt_tokens; legacy JSON column may remain for audit). - Schema sync:
AutoSyncSchemadefaults to true in repoappsettings.json;SchemaSyncServicedesired map includesusers.IsActive,TwoFactorSharedKey, and optionalJwtTokensJsonfor additive repair. Still ADD COLUMN IF NOT EXISTS only (no DROP). - ICertsEngineConfiguration / ISchemaSyncService: Clarified that add-only sync is recommended and describes the no-DROP guarantee.
[3.3.10] - 2026-04-26
Fixed
- Database: After FluentMigrator
MigrateUp,RunMigrationsServiceapplies idempotentCREATE TABLE IF NOT EXISTS/CREATE INDEX IF NOT EXISTSforacme_http_challengesandapp_runtime_leases. IfVersionInfoalready records the migration but tables are missing (restore drift, partial apply, manual DB edits), FluentMigrator would skipUp()and the bootstrap lease would fail with42P01; this repair aligns schema with runtime needs.
[3.3.9] - 2026-04-26
Fixed
- Startup / database: FluentMigrator (
EnsureCertsEngineMigratedAsync) now runs inProgram.csimmediately afterWebApplication.Build()and beforeRunAsync, so schema (includingapp_runtime_leases) exists before anyIHostedServicestarts.InitializationHostedServiceonly performs bootstrap lease + identity init.
[3.3.8] - 2026-04-26
Fixed
- Startup / database:
InitializationHostedServicenow runs FluentMigrator (EnsureCertsEngineMigratedAsync) before acquiring the bootstrap PostgreSQL lease, soapp_runtime_leasesexists on an empty database (same ordering idea as Vault: migrate first, then coordination). - Startup: While waiting for the bootstrap lease, migrations are not re-run on every poll interval (
migrationsAppliedguard).
Changed
- Container image:
MaksIT.CertsUIDockerfile installslibgssapi-krb5-2so Npgsql can load GSS/Kerberos support without missing-library warnings on slimaspnetimages.
[3.3.7] - 2026-04-25
Added
- HA runtime coordination: Added DB-backed HTTP-01 challenge persistence and runtime lease infrastructure (
acme_http_challenges,app_runtime_leases) plus coordinated startup/renewal execution. - Kubernetes readiness model: Added per-component Helm
replicaCount+ PodDisruptionBudget support and health endpoints (/health/live,/health/ready) for probes. - New backend host: Added
MaksIT.CertsUIWebAPI host with controllers, authorization filters (JWT and JWT-or-API-key), hosted services, and mapping/configuration abstractions. - Engine platform expansion: Added a domain-oriented
MaksIT.CertsUI.Enginestructure (Domain,Dto,DomainServices,Persistance,QueryServices,Infrastructure,FluentMigrations) with linq2db mappings and migration services. - Frontend identity/api-key UX: Added Users/API Keys pages and forms (
CreateUser,EditUser,SearchUser,CreateApiKey) with reusable list/filter/paging components. - Test suite: Added
MaksIT.CertsUI.Testswith service and integration coverage plus shared Postgres/WebAPI fixtures.
Changed
- Namespace and solution layout: Standardized around
MaksIT.CertsUI*and moved responsibilities into clearer host/engine layers. - Engine model organization: Reorganized ACME and related contracts from legacy top-level
Entities/ModelsintoDomainandDto. - Helm/runtime behavior: Updated deployment templates to support
env.valueFrom, pod-name-based holder identity, and probe wiring for live/ready endpoints. - Documentation: Updated README architecture references and linked HA architecture guidance.
- WebUI contracts: Aligned identity/API-key request/response and paged-search models with updated backend endpoints.
Removed
- Deprecated host: Removed legacy
MaksIT.Webapiproject and its old controllers/services/background services. - Legacy engine layout: Removed obsolete top-level engine files (
Entities,Models, previous ACME helper locations, old project.vscodefiles). - Old test project: Removed
MaksIT.Webapi.Testsin favor ofMaksIT.CertsUI.Tests.
[3.3.6] - 2026-04-13
Added
- LetsEncrypt: Per-host ACME rate-limit cooldown on
RegistrationCache(AcmeRenewalNotBeforeUtcByHostname), with HTTPRetry-Afterand problem-detail parsing (AcmeRetryAfterParser), structured logging, andResult.TooManyRequestswhen the CA returnsrateLimited. - LetsEncrypt:
AcmeProblemKindas anEnumeration(RFC 8555 problemtypeURIs) instead of ad hoc strings;LetsEncrytExceptionexposesProblemKind,RetryAfterUtc, and optional rate-limit hostname. - LetsEncrypt:
AcmeSessionStorefor per-sessionStatein memory;LetsEncryptServicesplit into partial files (LetsEncryptService.Helpers.cs) for HTTP/JWS/error helpers. - LetsEncrypt:
State.TryGetAccountKeyfor a single place to validate account key material afterInit. - LetsEncrypt.Tests: Unit tests for retry parsing, problem-kind resolution, and cooldown JSON round-trip.
Changed
- AutoRenewal: Skips hostnames that are still in an ACME cooldown window (with debug logs for skipped hosts).
- Certs flow: Persists registration cache after failed full certificate flows when a session exists so cooldown metadata is saved.
- LetsEncrypt: Broader nullable reference annotations on ACME DTOs (
Problem,AcmeDirectory,AuthorizationChallengeError, etc.) and explicit null guards inLetsEncryptService.
Fixed
- LetsEncrypt: Certificate PEM loading uses
X509Certificate2.CreateFromPeminstead of the obsoleteX509Certificate2(byte[])constructor (SYSLIB0057). - LetsEncrypt:
RevokeCertificatenow fails correctly on non-success responses (missingreturn), uses the same problem-document handling as other ACME calls, and disposes the HTTP response on successful revoke. - LetsEncrypt:
NewOrderauthorization error log line now logs the authorization status, not the order status.
[3.3.5] - 2026-04-12
Changed
CachedHostnamenow uses a C# 12 primary constructor (same public construction as before).
Fixed
RegistrationCacheloads cached PEM certificates viaX509CertificateLoader.LoadCertificateand disposes them withusingwhere certificates are parsed for expiry and host listing.RegistrationCache.TryGetCachedCertificatereturnsfalsewhen the cached entry has no private key blob, avoiding a null argument when importing key material.
[3.3.4] - 2026-04-01
Added
MaksIT.Webapi.Tests: service-level unit tests (settings, cache, identity, agent, account, certs flow) and domain tests forSettings.- Postman collections under
src/Postmanupdated to match currentMaksIT.Webapiroutes, JWT flow, and cache endpoints.
Fixed
- WebUI Terms of Service (Let's Encrypt): PDF viewer loads
pdfjs-distworker from a Vite-bundled asset (pdf.worker.min.mjs?url) so rendering works in dev and production instead of failing on missing or wrong worker URLs. AccountService.PatchAccountAsyncreturns the account built from the cache after reload, not a stale in-memory instance.
[3.3.3] - 2025-12-20
Changed
- Relicensed project from GPL-3.0 to Apache-2.0.
[3.3.2] - 2025-12-20
Changed
- Minimal Helm chart and documentation improvements.
[3.3.1] - 2025-11-22
Changed
- Public release following the v3.3.0 pre-release.
[3.3.0] - 2025-11-15
Changed
- Pre-release of the v3.3.x line.
[3.2.0] - 2025-09-11
Added
- New WebUI with authentication.
[3.1.0] - 2024-08-11
Changed
- Stabilized release following v3.0.0.
[3.0.0] - 2024-05-31
Added
- WebAPI and containerization.
[2.0.0] - 2019-11-01
Changed
- Dependency injection pattern implementation.
[1.0.0] - 2019-06-29
Added
- Initial release.