diff --git a/src/app/apps/page.tsx b/src/app/apps/page.tsx index 2a4a9e2..5fe23c3 100644 --- a/src/app/apps/page.tsx +++ b/src/app/apps/page.tsx @@ -1001,16 +1001,14 @@ function InstallModal({ if (!mounted) return null; return createPortal( -
-
+
+
@@ -1057,624 +1055,645 @@ function InstallModal({
-
- - + + + {template && + template.presets && + template.presets.length > 0 && + mode === "template" && ( +
+ + Preset + + +
+ )} +
+ {template && - template.presets && - template.presets.length > 0 && - mode === "template" && ( + mode === "template" && + presetId && + getTemplatePreset(template, presetId) && (
- - Preset + {getTemplatePreset(template, presetId)?.desc} +
+ )} + + {error && ( +
+ {error} +
+ )} + + {serverId && ( +
+
+ + {dockerStatusLoading + ? "Checking Docker runtime..." + : dockerStatus?.available + ? // ? `Docker ready${dockerStatus.version ? ` · v${dockerStatus.version}` : ""}` + `Yeay! Docker ready installed on this server.` + : dockerStatus + ? "Docker not ready" + : "Docker not checked yet"} + + {dockerStatusLoading + ? "Verifying whether this server can run Docker app installs." + : dockerNotice || + dockerStatus?.reason || + "App Installer will validate Docker on the target server when you submit the install."} + +
+ {!dockerStatusLoading && + !dockerStatus?.available && + dockerStatus?.canInstall && ( + + )} +
+ )} + +
+
+
+ Target Server *
- )} -
+
+ Project Environment * + 0 + ? "No environment selected" + : "No environment mapped to this server" + } + searchPlaceholder="Search environment..." + emptyText="No environment found" + disabled={!serverId || projectsLoading} + /> +
+
- {template && - mode === "template" && - presetId && - getTemplatePreset(template, presetId) && (
- {getTemplatePreset(template, presetId)?.desc} +
+ App Name * + setAppName(e.target.value)} + placeholder="Example: n8n workflow" + style={{ width: "100%" }} + /> +
+
+ Container Name + setContainerName(e.target.value)} + placeholder="Leave blank to auto-generate" + style={{ width: "100%" }} + /> +
+
+ Docker Network + + {networksError ? ( +

+ {networksError} +

+ ) : null} +
+
+ Docker Image * + setImageName(e.target.value)} + placeholder="n8nio/n8n" + style={{ width: "100%" }} + /> +
+
+ Tag + setImageTag(e.target.value)} + placeholder="latest" + style={{ width: "100%" }} + /> +
+
+ Restart Policy + +
+
+ Command Override + setCommand(e.target.value)} + placeholder="Optional custom command" + style={{ width: "100%" }} + /> +
- )} - {error && ( -
- {error} -
- )} - - {serverId && ( -
-
- - {dockerStatusLoading - ? "Checking Docker runtime..." - : dockerStatus?.available - ? // ? `Docker ready${dockerStatus.version ? ` · v${dockerStatus.version}` : ""}` - `Yeay! Docker ready installed on this server.` - : dockerStatus - ? "Docker not ready" - : "Docker not checked yet"} - - - {dockerStatusLoading - ? "Verifying whether this server can run Docker app installs." - : dockerNotice || - dockerStatus?.reason || - "App Installer will validate Docker on the target server when you submit the install."} - -
- {!dockerStatusLoading && - !dockerStatus?.available && - dockerStatus?.canInstall && ( +
+
+
+

+ Port Mappings +

+

+ Map host ports to container ports. Use UDP only when needed. +

+
- )} -
- )} - - -
-
- Target Server * - + updatePort(index, "host", e.target.value) + } + placeholder="Host port" + /> + + updatePort(index, "container", e.target.value) + } + placeholder="Container port" + /> + + +
))} - -
-
- Project Environment * - 0 - ? "No environment selected" - : "No environment mapped to this server" - } - searchPlaceholder="Search environment..." - emptyText="No environment found" - disabled={!serverId || projectsLoading} - /> -
-
- -
-
- App Name * - setAppName(e.target.value)} - placeholder="Example: n8n workflow" - style={{ width: "100%" }} - /> -
-
- Container Name - setContainerName(e.target.value)} - placeholder="Leave blank to auto-generate" - style={{ width: "100%" }} - /> -
-
- Docker Network - - {networksError ? ( -

- {networksError} -

- ) : null} -
-
- Docker Image * - setImageName(e.target.value)} - placeholder="n8nio/n8n" - style={{ width: "100%" }} - /> -
-
- Tag - setImageTag(e.target.value)} - placeholder="latest" - style={{ width: "100%" }} - /> -
-
- Restart Policy - -
-
- Command Override - setCommand(e.target.value)} - placeholder="Optional custom command" - style={{ width: "100%" }} - /> -
-
- -
-
-
-

- Port Mappings -

-

- Map host ports to container ports. Use UDP only when needed. -

-
+ +
+
- Add Port +
+

+ Volume and Path Mounts +

+

+ Persist data or attach existing directories from the server. +

+
+ +
+
+ {volumes.length === 0 && ( +
+ No mounted paths yet. +
+ )} + {volumes.map((row, index) => ( +
+ + updateVolume(index, "host", e.target.value) + } + placeholder="Host path" + /> + + updateVolume(index, "container", e.target.value) + } + placeholder="Container path" + /> + +
+ ))} +
+
+ +
+
+
+

+ Environment Variables +

+

+ Override credentials, URLs, feature flags, or app runtime + settings. +

+
+ +
+
+ {envVars.length === 0 && ( +
+ No environment variables yet. +
+ )} + {envVars.map((row, index) => ( +
+ updateEnv(index, "key", e.target.value)} + placeholder="KEY" + /> + + updateEnv(index, "value", e.target.value) + } + placeholder="value" + /> + +
+ ))} +
+
+ +
+ +
-
- {ports.length === 0 && ( -
- No port mappings yet. -
- )} - {ports.map((row, index) => ( -
- updatePort(index, "host", e.target.value)} - placeholder="Host port" - /> - - updatePort(index, "container", e.target.value) - } - placeholder="Container port" - /> - - -
- ))} -
-
- -
-
-
-

- Volume and Path Mounts -

-

- Persist data or attach existing directories from the server. -

-
- -
-
- {volumes.length === 0 && ( -
- No mounted paths yet. -
- )} - {volumes.map((row, index) => ( -
- - updateVolume(index, "host", e.target.value) - } - placeholder="Host path" - /> - - updateVolume(index, "container", e.target.value) - } - placeholder="Container path" - /> - -
- ))} -
-
- -
-
-
-

- Environment Variables -

-

- Override credentials, URLs, feature flags, or app runtime - settings. -

-
- -
-
- {envVars.length === 0 && ( -
- No environment variables yet. -
- )} - {envVars.map((row, index) => ( -
- updateEnv(index, "key", e.target.value)} - placeholder="KEY" - /> - updateEnv(index, "value", e.target.value)} - placeholder="value" - /> - -
- ))} -
-
- -
- - -
- +
,