diff --git a/ui/src/api/queries/admin/apps.ts b/ui/src/api/queries/admin/apps.ts index 9a309229..c868c784 100644 --- a/ui/src/api/queries/admin/apps.ts +++ b/ui/src/api/queries/admin/apps.ts @@ -20,6 +20,8 @@ export interface AppVersion { jarChecksum: string; jarFilename: string; jarSizeBytes: number; + detectedRuntimeType: string | null; + detectedMainClass: string | null; uploadedAt: string; } diff --git a/ui/src/pages/AppsTab/AppsTab.tsx b/ui/src/pages/AppsTab/AppsTab.tsx index a098d6b3..da9d08e2 100644 --- a/ui/src/pages/AppsTab/AppsTab.tsx +++ b/ui/src/pages/AppsTab/AppsTab.tsx @@ -209,6 +209,8 @@ function CreateAppView({ environments, selectedEnv }: { environments: Environmen const [deployStrategy, setDeployStrategy] = useState('blue-green'); const [stripPrefix, setStripPrefix] = useState(true); const [sslOffloading, setSslOffloading] = useState(true); + const [runtimeType, setRuntimeType] = useState(String(defaults.runtimeType ?? 'auto')); + const [customArgs, setCustomArgs] = useState(String(defaults.customArgs ?? '')); const [configTab, setConfigTab] = useState<'monitoring' | 'resources' | 'variables'>('monitoring'); const [busy, setBusy] = useState(false); @@ -222,6 +224,8 @@ function CreateAppView({ environments, selectedEnv }: { environments: Environmen setCpuRequest(String(d.cpuRequest ?? 500)); setCpuLimit(String(d.cpuLimit ?? '')); setPorts(Array.isArray(d.exposedPorts) ? d.exposedPorts as number[] : []); + setRuntimeType(String(d.runtimeType ?? 'auto')); + setCustomArgs(String(d.customArgs ?? '')); }, [envId, environments]); useEffect(() => { @@ -261,6 +265,8 @@ function CreateAppView({ environments, selectedEnv }: { environments: Environmen deploymentStrategy: deployStrategy, stripPathPrefix: stripPrefix, sslOffloading: sslOffloading, + runtimeType: runtimeType, + customArgs: customArgs || null, }; await updateContainerConfig.mutateAsync({ appId: app.slug, config: containerConfig }); @@ -821,6 +827,12 @@ function ConfigSubTab({ app, environment }: { app: App; environment?: Environmen const [deployStrategy, setDeployStrategy] = useState('blue-green'); const [stripPrefix, setStripPrefix] = useState(true); const [sslOffloading, setSslOffloading] = useState(true); + const [runtimeType, setRuntimeType] = useState(String(merged.runtimeType ?? 'auto')); + const [customArgs, setCustomArgs] = useState(String(merged.customArgs ?? '')); + + // Versions query for runtime detection hints + const { data: versions = [] } = useAppVersions(app.slug); + const latestVersion = versions?.[0] ?? null; // Sync from server data const syncFromServer = useCallback(() => { @@ -848,6 +860,8 @@ function ConfigSubTab({ app, environment }: { app: App; environment?: Environmen setDeployStrategy(String(merged.deploymentStrategy ?? 'blue-green')); setStripPrefix(merged.stripPathPrefix !== false); setSslOffloading(merged.sslOffloading !== false); + setRuntimeType(String(merged.runtimeType ?? 'auto')); + setCustomArgs(String(merged.customArgs ?? '')); }, [agentConfig, merged]); useEffect(() => { syncFromServer(); }, [syncFromServer]); @@ -897,6 +911,8 @@ function ConfigSubTab({ app, environment }: { app: App; environment?: Environmen deploymentStrategy: deployStrategy, stripPathPrefix: stripPrefix, sslOffloading: sslOffloading, + runtimeType: runtimeType, + customArgs: customArgs || null, }; try { await updateContainerConfig.mutateAsync({ appId: app.slug, config: containerConfig }); @@ -1092,6 +1108,37 @@ function ConfigSubTab({ app, environment }: { app: App; environment?: Environmen
Container Resources
+ Runtime Type +
+ setCustomArgs(e.target.value)} + placeholder="-Xmx256m -Dfoo=bar" className={styles.inputLg} /> + + {runtimeType === 'native' ? 'Arguments passed to the native binary' : 'Additional JVM arguments appended to the start command'} + +
+ Memory Limit
setMemoryLimit(e.target.value)} className={styles.inputLg} />