The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
265 lines
22 KiB
Plaintext
265 lines
22 KiB
Plaintext
Sub-scope 01 (fileserver) governance / build / config / activation - manifest and probes
|
|
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
generatedAt=2026-08-30T01:07:08+00:00
|
|
|
|
=== OWNED FILES ===
|
|
0526605004cba24b4653ce9dda3e344447de5ad1 CLAUDE.md 66
|
|
8c05831905836fcfb3db444e820c1d7e2f43aafd README.md 140
|
|
a34958ba1fc2596886d2d2cb5ad648b038c57738 build.gradle 16
|
|
17910be715e0ad53d5f8b70ef68c36f701dcf583 gradle.lockfile 150
|
|
18d2700b9b403e46ace4d4bf49724592d4e6a90e src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java 73
|
|
dc9a6cd8f5dd74eff3b7982fb88f5ded240271da src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java 92
|
|
c8413a3ed8501115322274f62a1bdb5e33e79776 src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java 92
|
|
5ed171f83c1f24567d1e6a588a9a6dea6926983d src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java 41
|
|
42d188e20225fc93385e7b5cfa4973eeaf0b0379 src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Validation.java 189
|
|
d8ebf9ffb1c19ef77525933817127f4a4a9ec689 src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverActivationValidator.java 22
|
|
561a808299750095da0080492ac904d9a69c2cb9 src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageProperties.java 45
|
|
1769f2fd207ec9e9bf37841413d33492319faa21 src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java 108
|
|
b32c5f7b7a77b8510d1e13922e2a7c7d454027fb src/test/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2ConfigTest.java 530
|
|
|
|
=== 8.1 reachability: how do these @Configuration classes get loaded? ===
|
|
$ git ls-files 'adapter/outbound/fileserver' | grep -i 'META-INF\|imports\|spring.factories'
|
|
exit=1
|
|
|
|
$ git grep -rn 'FileExportConfig\|FileserverR2Config' -- . | grep -v "^adapter/outbound/fileserver/" | head -20
|
|
app-bootstrap/src/test/java/dev/caskeleton/adapter/outbound/OptionalAdapterBeanGatingTest.java:7:import dev.caskeleton.adapter.outbound.fileserver.FileExportConfig;
|
|
app-bootstrap/src/test/java/dev/caskeleton/adapter/outbound/OptionalAdapterBeanGatingTest.java:8:import dev.caskeleton.adapter.outbound.fileserver.FileserverR2Config;
|
|
app-bootstrap/src/test/java/dev/caskeleton/adapter/outbound/OptionalAdapterBeanGatingTest.java:72: FileExportConfig.class,
|
|
app-bootstrap/src/test/java/dev/caskeleton/adapter/outbound/OptionalAdapterBeanGatingTest.java:73: FileserverR2Config.class,
|
|
exit=0
|
|
|
|
$ git grep -rn 'app.fileserver.enabled\|app.file-export.enabled' -- app-bootstrap/src/main sample-portfolio/src/main 2>/dev/null | head -20
|
|
exit=0
|
|
|
|
=== 8.1b who else validates the R1/R2 ambiguity ===
|
|
$ git grep -rn 'rejectAmbiguous\|FileserverActivationValidator' -- . | grep -v '^Binary'
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java:33: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java:49: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverActivationValidator.java:8:final class FileserverActivationValidator {
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverActivationValidator.java:10: private FileserverActivationValidator() {}
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverActivationValidator.java:12: static void rejectAmbiguous(Environment environment) {
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java:31: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
exit=0
|
|
|
|
$ git grep -n 'file-export\|fileserver' app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java | head -20
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java:1:package dev.caskeleton.bootstrap.autoconfigure.fileserver;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java:3:import dev.caskeleton.adapter.outbound.fileserver.platform.local.LocalStorageProbeResult;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java:4:import dev.caskeleton.application.fileserver.api.content.PublishMode;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java:102: "fileserver startup validation failed: " + String.join("; ", violations));
|
|
exit=0
|
|
|
|
=== 8.2 conditional siblings: R1 vs R2 settings handling ===
|
|
$ grep -n 'ConfigurationProperties' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java:3:import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java:10:@ConfigurationProperties(prefix = "app.file-export")
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java:4:import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java:7:@ConfigurationProperties(prefix = "app.fileserver", ignoreUnknownFields = false)
|
|
exit=0
|
|
|
|
$ grep -n 'configuredRoot\|toAbsolutePath\|createDirectories' -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java
|
|
34: Path publicationRoot = configuredRoot(properties.getBaseDirectory(), "base-directory");
|
|
35: Path legacyRoot = configuredRoot(properties.getLegacyBaseDirectory(), "legacy-base-directory");
|
|
36- Path canonicalPublicationRoot = canonicalDirectory(publicationRoot);
|
|
37- Path canonicalLegacyRoot = canonicalDirectory(legacyRoot);
|
|
38- if (canonicalPublicationRoot.startsWith(canonicalLegacyRoot)
|
|
--
|
|
53: configuredRoot(properties.getBaseDirectory(), "base-directory"),
|
|
54- properties.getMaximumRows(),
|
|
55- properties.getMaximumEncodedBytes()));
|
|
56- }
|
|
--
|
|
58: private static Path configuredRoot(String value, String property) {
|
|
59- if (value == null || value.isBlank()) {
|
|
60- throw new IllegalArgumentException("app.file-export." + property + " must be non-blank");
|
|
61- }
|
|
62: return Path.of(value).toAbsolutePath().normalize();
|
|
63- }
|
|
64-
|
|
65- private static Path canonicalDirectory(Path root) {
|
|
--
|
|
67: Files.createDirectories(root);
|
|
68- return root.toRealPath();
|
|
69- } catch (IOException exception) {
|
|
70- throw new IllegalStateException("fileserver root cannot be canonicalized", exception);
|
|
exit=0
|
|
|
|
$ grep -n 'requireAbsoluteNormalizedPath' -A 8 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Validation.java | head -24
|
|
51: static Path requireAbsoluteNormalizedPath(String label, String configuredPath) {
|
|
52- String value = requireNonBlank(label, configuredPath);
|
|
53- try {
|
|
54: return requireAbsoluteNormalizedPath(label, Path.of(value));
|
|
55- } catch (InvalidPathException exception) {
|
|
56- throw new IllegalArgumentException(label + " must be a valid path", exception);
|
|
57- }
|
|
58- }
|
|
59-
|
|
60: static Path requireAbsoluteNormalizedPath(String label, Path path) {
|
|
61- Objects.requireNonNull(path, label + " must be non-null");
|
|
62- if (!path.isAbsolute()) {
|
|
63- throw new IllegalArgumentException(label + " must be absolute");
|
|
64- }
|
|
65- Path normalized = path.normalize();
|
|
66- if (!path.equals(normalized)) {
|
|
67- throw new IllegalArgumentException(label + " must already be normalized");
|
|
68- }
|
|
exit=0
|
|
|
|
$ grep -n 'unknownConfigurationFieldIsRejected' -A 14 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2ConfigTest.java
|
|
312: void unknownConfigurationFieldIsRejectedInsteadOfSilentlyIgnored() throws IOException {
|
|
313- RootFixture root = preProvisionedRoot("unknown-field");
|
|
314-
|
|
315- r2Runner
|
|
316- .withPropertyValues(validProperties(root, "local-export"))
|
|
317- .withPropertyValues(providerProperty("local-primary", "strict-path-securty", "true"))
|
|
318- .run(
|
|
319- context -> {
|
|
320- assertThat(context).hasFailed();
|
|
321- assertThat(root.path().resolve(".ca-fileserver")).doesNotExist();
|
|
322- assertThat(root.path().resolve("data")).doesNotExist();
|
|
323- });
|
|
324- }
|
|
325-
|
|
326- @ParameterizedTest
|
|
exit=0
|
|
|
|
$ git grep -rn 'app.file-export' -- 'adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver' | head
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:33: "app.file-export.enabled=true",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:34: "app.file-export.base-directory=build/test-files",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:35: "app.file-export.destination-id=nightly-export",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:36: "app.file-export.maximum-rows=125",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:37: "app.file-export.maximum-encoded-bytes=4096")
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:54: "app.file-export.enabled=true",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:55: "app.file-export.base-directory=build/test-files",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:56: "app.file-export.legacy-enabled=true",
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:57: "app.file-export.legacy-base-directory=build/test-files-legacy")
|
|
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FilePublicationConfigTest.java:70: .withPropertyValues("app.file-export.enabled=true", "app.file-export.base-directory= ")
|
|
exit=0
|
|
|
|
=== 8.2b does any test cover an unknown app.file-export.* key? ===
|
|
$ grep -c 'ignoreUnknownFields' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportSettings.java:0
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Settings.java:1
|
|
exit=0
|
|
|
|
=== 8.3 the three rejectAmbiguous call sites and what each protects ===
|
|
$ grep -n 'rejectAmbiguous' -B 6 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-27- @ConditionalOnProperty(
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-28- prefix = "app.file-export",
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-29- name = {"enabled", "legacy-enabled"},
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-30- havingValue = "true")
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-31- public FileExportPort filesystemCsvExportPort(
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-32- FileExportSettings properties, Environment environment) {
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java:33: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
--
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-43- }
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-44-
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-45- @Bean
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-46- @ConditionalOnProperty(prefix = "app.file-export", name = "enabled", havingValue = "true")
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-47- public FilePublicationPort localFilePublicationPort(
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java-48- FileExportSettings properties, Environment environment) {
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileExportConfig.java:49: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
--
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-25- private static final HexFormat HEX = HexFormat.of();
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-26-
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-27- @Bean
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-28- @ConditionalOnProperty(prefix = "app.fileserver", name = "enabled", havingValue = "true")
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-29- public FilePublicationPort routingFilePublicationPort(
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java-30- FileserverR2Settings settings, Environment environment) {
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FileserverR2Config.java:31: FileserverActivationValidator.rejectAmbiguous(environment);
|
|
exit=0
|
|
|
|
=== 8.4 documentation drift ===
|
|
$ grep -n 'FilePublicationContractTest' adapter/outbound/fileserver/README.md
|
|
117:- `FilePublicationContractTest`: framework-free values and invalid contract inputs.
|
|
exit=0
|
|
|
|
$ git grep -rln 'FilePublicationContractTest' -- . | head
|
|
adapter/outbound/fileserver/README.md
|
|
application-core/src/test/java/dev/caskeleton/application/filepublication/FilePublicationContractTest.java
|
|
exit=0
|
|
|
|
$ grep -rn 'app.fileserver' app-bootstrap/src/main/resources/application.yml | head -20
|
|
193: # Same placeholders as app.fileserver-platform.upload.*, deliberately. Two independent
|
|
833: # HTTP Fileserver platform — a different capability from app.fileserver above, which publishes
|
|
exit=0
|
|
|
|
$ grep -rn 'file-export' app-bootstrap/src/main/resources/application.yml | head -10
|
|
exit=0
|
|
|
|
--- forward reference for sub-scopes 5: what CLAUDE.md says is NOT implemented
|
|
$ grep -n 'not implemented\|Advertising' adapter/outbound/fileserver/CLAUDE.md adapter/outbound/fileserver/README.md
|
|
adapter/outbound/fileserver/CLAUDE.md:48:- Advertising `FILE_AND_DIRECTORY_SYNC` as physical device/controller/replica/site power-loss
|
|
adapter/outbound/fileserver/CLAUDE.md:50:- Advertising `shared-mounted`/NFS, SFTP, cross-node fencing, reaper, retention, quota,
|
|
adapter/outbound/fileserver/README.md:103:`shared-mounted`/NFS and SFTP providers are not implemented. Cross-node producer fencing,
|
|
adapter/outbound/fileserver/README.md:105:tracing, and audit are also not implemented. No setting or bean for those capabilities is exposed.
|
|
exit=0
|
|
|
|
$ git ls-files 'adapter/outbound/fileserver/src/main' | grep -iE 'audit|health|usage|orphan|reconcil'
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/audit/StructuredAdminAuditAdapter.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/audit/StructuredFileserverAuditAdapter.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalReconciliationContentProbe.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java
|
|
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageUsageProbe.java
|
|
exit=0
|
|
|
|
|
|
=== 8.1c how production actually loads the two @Configuration classes ===
|
|
$ grep -n 'SpringBootApplication\|ComponentScan\|Import\|scanBasePackages' app-bootstrap/src/main/java/dev/caskeleton/bootstrap/CaSkeletonApplication.java
|
|
9:import org.springframework.context.annotation.ComponentScan;
|
|
16: * {@code @ComponentScan} rather than {@code @SpringBootApplication}, because the scan needs an
|
|
18: * {@code @SpringBootApplication} contributes and must stay.
|
|
41:@ComponentScan(
|
|
50: @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
|
|
51: @ComponentScan.Filter(
|
|
54: @ComponentScan.Filter(
|
|
exit=0
|
|
|
|
$ grep -n 'fileserver' app-bootstrap/src/main/java/dev/caskeleton/bootstrap/CaSkeletonApplication.java
|
|
61: "dev.caskeleton.bootstrap.autoconfigure.fileserver",
|
|
75: "dev.caskeleton.adapter.outbound.fileserver",
|
|
103: + "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.fileserver\\.admin\\..*"
|
|
exit=0
|
|
|
|
=== 8.4e where the two selectors are actually defaulted ===
|
|
$ grep -rn 'app\.fileserver\.\|app\.file-export\.' app-bootstrap/src/main/resources/ sample-portfolio/src/main/resources/ 2>/dev/null | head
|
|
exit=0
|
|
|
|
$ sed -n '190,196p;830,840p' app-bootstrap/src/main/resources/application.yml
|
|
# GlobalExceptionHandler#handleMaxUploadSizeExceededException), never a raw 500.
|
|
# Multipart-specific upload limits (UPLOAD_SIZE_EXCEEDED) are refined by
|
|
# feature-file-resource-handling-contract.
|
|
# Same placeholders as app.fileserver-platform.upload.*, deliberately. Two independent
|
|
# ceilings meant the servlet container rejected at 10MB whatever the Fileserver policy said,
|
|
# so a 100MB upload failed before any Fileserver code — including its error mapping — ran,
|
|
# and the configured limit described a policy nobody could reach.
|
|
mount-sentinel-sha256: ${APP_FILESERVER_LOCAL_MOUNT_SENTINEL_SHA256:}
|
|
expected-owner: ${APP_FILESERVER_LOCAL_EXPECTED_OWNER:}
|
|
maximum-root-mode: "0750"
|
|
# HTTP Fileserver platform — a different capability from app.fileserver above, which publishes
|
|
# tabular exports. This one serves upload/download/lifecycle routes over HTTP and owns its own
|
|
# namespace so the two cannot be switched on by accident together.
|
|
#
|
|
# While enabled=false none of the detail below is bound: FileserverPlatformAutoConfiguration
|
|
# binds the block itself, and it is not processed until the master switch is true. Unknown keys
|
|
# under this prefix are refused rather than ignored.
|
|
# Outbound HTTP Client platform. Only the master switch lives here.
|
|
exit=0
|
|
|
|
=== 8.4f is the platform/** tree exposed as beans by app-bootstrap? (lead for sub-scope 05) ===
|
|
$ git grep -rn 'StructuredFileserverAuditAdapter\|StructuredAdminAuditAdapter\|LocalStorageHealthAdapter\|LocalStorageUsageProbe\|LocalOrphanScanAdapter\|LocalReconciliationContentProbe' -- app-bootstrap/src/main | head -20
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverSecurityConfiguration.java:3:import dev.caskeleton.adapter.outbound.fileserver.platform.audit.StructuredAdminAuditAdapter;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverSecurityConfiguration.java:4:import dev.caskeleton.adapter.outbound.fileserver.platform.audit.StructuredFileserverAuditAdapter;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverSecurityConfiguration.java:71: return new StructuredAdminAuditAdapter();
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverSecurityConfiguration.java:77: return new StructuredFileserverAuditAdapter();
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:7:import dev.caskeleton.adapter.outbound.fileserver.platform.local.LocalOrphanScanAdapter;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:8:import dev.caskeleton.adapter.outbound.fileserver.platform.local.LocalReconciliationContentProbe;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:10:import dev.caskeleton.adapter.outbound.fileserver.platform.local.LocalStorageHealthAdapter;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:13:import dev.caskeleton.adapter.outbound.fileserver.platform.local.LocalStorageUsageProbe;
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:179: return new LocalStorageHealthAdapter(properties, probeResult, store);
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:189: return new LocalOrphanScanAdapter(
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:196: return new LocalStorageUsageProbe(properties.root());
|
|
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java:203: return new LocalReconciliationContentProbe(store, stagingLocator);
|
|
exit=0
|
|
|