Update vpn service

This commit is contained in:
MacRimi
2026-03-14 21:29:16 +01:00
parent a3f4277bdc
commit 09513c0beb
3 changed files with 84 additions and 34 deletions

View File

@@ -154,7 +154,6 @@ export function SecureGatewaySetup() {
// Remove CIDR notation if present (e.g., "192.168.0.55/24" -> "192.168.0.55")
const ip = hostIpValue.split("/")[0]
setHostIp(ip)
console.log("[v0] Host IP for Host Only mode:", ip)
}
}
} catch (err) {
@@ -194,15 +193,22 @@ export function SecureGatewaySetup() {
}
}
// Prepare config - for "host_only" mode, set routes to just the host IP
// Prepare config based on access_mode
const deployConfig = { ...config }
console.log("[v0] access_mode:", config.access_mode, "hostIp:", hostIp)
if (config.access_mode === "host_only" && hostIp) {
deployConfig.advertise_routes = [`${hostIp}/32`]
console.log("[v0] Set advertise_routes for host_only:", deployConfig.advertise_routes)
}
console.log("[v0] Final deploy config:", JSON.stringify(deployConfig, null, 2))
if (config.access_mode === "host_only" && hostIp) {
// Host only: just the host IP
deployConfig.advertise_routes = [`${hostIp}/32`]
} else if (config.access_mode === "proxmox_network") {
// Proxmox network: use the recommended network (should already be set)
if (!deployConfig.advertise_routes?.length) {
const recommendedNetwork = networks.find((n) => n.recommended) || networks[0]
if (recommendedNetwork) {
deployConfig.advertise_routes = [recommendedNetwork.subnet]
}
}
}
// For "custom", the user has already selected networks manually
setDeployProgress("Creating LXC container...")
@@ -419,6 +425,29 @@ export function SecureGatewaySetup() {
)
case "select":
// Special handling for access_mode to auto-select networks
const handleSelectChange = (value: string) => {
const newConfig = { ...config, [fieldName]: value }
// When access_mode changes to proxmox_network, auto-select the recommended network
if (fieldName === "access_mode" && value === "proxmox_network") {
const recommendedNetwork = networks.find((n) => n.recommended) || networks[0]
if (recommendedNetwork) {
newConfig.advertise_routes = [recommendedNetwork.subnet]
}
}
// Clear routes when switching to host_only
if (fieldName === "access_mode" && value === "host_only") {
newConfig.advertise_routes = []
}
// Clear routes when switching to custom (user will select manually)
if (fieldName === "access_mode" && value === "custom") {
newConfig.advertise_routes = []
}
setConfig(newConfig)
}
return (
<div key={fieldName} className="space-y-3">
<Label className="text-sm font-medium">
@@ -429,7 +458,7 @@ export function SecureGatewaySetup() {
{field.options?.map((opt) => (
<div
key={opt.value}
onClick={() => setConfig({ ...config, [fieldName]: opt.value })}
onClick={() => handleSelectChange(opt.value)}
className={`p-3 rounded-lg border cursor-pointer transition-colors ${
config[fieldName] === opt.value
? "border-cyan-500 bg-cyan-500/10"
@@ -444,11 +473,18 @@ export function SecureGatewaySetup() {
<div className="w-2 h-2 rounded-full bg-cyan-500" />
)}
</div>
<div>
<div className="flex-1">
<p className="font-medium text-sm">{opt.label}</p>
{opt.description && (
<p className="text-xs text-muted-foreground">{opt.description}</p>
)}
{/* Show selected network for proxmox_network */}
{fieldName === "access_mode" && opt.value === "proxmox_network" && config[fieldName] === "proxmox_network" && (
<p className="text-xs text-cyan-400 mt-1 flex items-center gap-1">
<Network className="h-3 w-3" />
{networks.find((n) => n.recommended)?.subnet || networks[0]?.subnet || "No network detected"}
</p>
)}
</div>
</div>
</div>
@@ -527,8 +563,8 @@ export function SecureGatewaySetup() {
<p className="font-medium text-sm">{field.label}</p>
<p className="text-xs text-muted-foreground">{field.description}</p>
{field.warning && config[fieldName] && (
<p className="text-xs text-yellow-500 mt-1 flex items-center gap-1">
<AlertTriangle className="h-3 w-3" />
<p className="text-xs text-cyan-400 mt-2 flex items-start gap-1.5 bg-cyan-500/10 p-2 rounded">
<Info className="h-3 w-3 mt-0.5 flex-shrink-0" />
{field.warning}
</p>
)}
@@ -1115,18 +1151,27 @@ export function SecureGatewaySetup() {
</DialogTitle>
</DialogHeader>
{/* Progress indicator */}
{/* Progress indicator - filter out "advanced" step if using Proxmox Only */}
<div className="flex items-center gap-1 mb-4">
{wizardSteps.map((step, idx) => (
<div
key={step.id}
className={`flex-1 h-1 rounded-full transition-colors ${
idx < currentStep ? "bg-cyan-500" :
idx === currentStep ? "bg-cyan-500" :
"bg-muted"
}`}
/>
))}
{wizardSteps
.filter((step) => !(config.access_mode === "host_only" && step.id === "advanced"))
.map((step, idx) => {
// Recalculate the actual step index accounting for skipped steps
const actualIdx = wizardSteps.findIndex((s) => s.id === step.id)
const adjustedCurrentStep = config.access_mode === "host_only"
? (currentStep > wizardSteps.findIndex((s) => s.id === "advanced") ? currentStep - 1 : currentStep)
: currentStep
return (
<div
key={step.id}
className={`flex-1 h-1 rounded-full transition-colors ${
idx < adjustedCurrentStep ? "bg-cyan-500" :
idx === adjustedCurrentStep ? "bg-cyan-500" :
"bg-muted"
}`}
/>
)
})}
</div>
{renderWizardContent()}
@@ -1135,7 +1180,14 @@ export function SecureGatewaySetup() {
<div className="flex justify-between pt-4 border-t border-border">
<Button
variant="outline"
onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}
onClick={() => {
// Skip "advanced" step when going back if using "Proxmox Only"
let prevStep = currentStep - 1
if (config.access_mode === "host_only" && wizardSteps[prevStep]?.id === "advanced") {
prevStep = prevStep - 1
}
setCurrentStep(Math.max(0, prevStep))
}}
disabled={currentStep === 0 || deploying}
>
Back
@@ -1143,7 +1195,14 @@ export function SecureGatewaySetup() {
{currentStep < wizardSteps.length - 1 ? (
<Button
onClick={() => setCurrentStep(currentStep + 1)}
onClick={() => {
// Skip "advanced" step when using "Proxmox Only"
let nextStep = currentStep + 1
if (config.access_mode === "host_only" && wizardSteps[nextStep]?.id === "advanced") {
nextStep = nextStep + 1
}
setCurrentStep(nextStep)
}}
className="bg-cyan-600 hover:bg-cyan-700"
>
Continue

View File

@@ -248,9 +248,6 @@ def deploy_app():
}), 400
logger.info(f"Deploy request: app_id={app_id}, config_keys={list(config.keys())}")
logger.info(f"Deploy config advertise_routes: {config.get('advertise_routes')}")
logger.info(f"Deploy config access_mode: {config.get('access_mode')}")
logger.info(f"Full config: {config}")
result = oci_manager.deploy_app(app_id, config, installed_by="web")

View File

@@ -349,9 +349,6 @@ def _configure_tailscale(vmid: int, config: Dict[str, Any]) -> bool:
return False
print(f"[*] Configuring Tailscale...")
print(f"[DEBUG] Config received: {list(config.keys())}")
print(f"[DEBUG] advertise_routes: {config.get('advertise_routes')}")
print(f"[DEBUG] exit_node: {config.get('exit_node')}")
# Build tailscale up command
ts_cmd = ["tailscale", "up", f"--authkey={auth_key}"]
@@ -365,7 +362,6 @@ def _configure_tailscale(vmid: int, config: Dict[str, Any]) -> bool:
if isinstance(advertise_routes, list):
advertise_routes = ",".join(advertise_routes)
ts_cmd.append(f"--advertise-routes={advertise_routes}")
print(f"[DEBUG] Adding routes: {advertise_routes}")
if config.get("exit_node"):
ts_cmd.append("--advertise-exit-node")
@@ -824,8 +820,6 @@ def deploy_app(app_id: str, config: Dict[str, Any], installed_by: str = "web") -
# Special handling for Tailscale
if "tailscale" in packages:
logger.info(f"Configuring Tailscale with config keys: {list(config.keys())}")
logger.info(f"advertise_routes value: {config.get('advertise_routes')}")
_configure_tailscale(vmid, config)
# Step 8: Save instance data