Add per-service instance sizing defaults
VPN/DNS/Vault → nanode/t3.micro, Matrix → g6-standard-2/t3.medium, Cloud/Media/Email → g6-standard-1/t3.small, All-in-One → g6-standard-2/t3.medium. Previously all services used the same provider-level default (often pulled from c2itall vars), which meant a WireGuard VPN would default to g6-standard-2. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,10 +6,10 @@
|
|||||||
# Linode
|
# Linode
|
||||||
LINODE_TOKEN=
|
LINODE_TOKEN=
|
||||||
LINODE_REGION=us-east
|
LINODE_REGION=us-east
|
||||||
LINODE_PLAN=g6-nanode-1
|
# LINODE_PLAN= (auto-selected per service; override here to force a specific plan)
|
||||||
|
|
||||||
# AWS
|
# AWS
|
||||||
AWS_ACCESS_KEY_ID=
|
AWS_ACCESS_KEY_ID=
|
||||||
AWS_SECRET_ACCESS_KEY=
|
AWS_SECRET_ACCESS_KEY=
|
||||||
AWS_REGION=us-east-1
|
AWS_REGION=us-east-1
|
||||||
AWS_INSTANCE_TYPE=t3.micro
|
# AWS_INSTANCE_TYPE= (auto-selected per service; override here to force a specific type)
|
||||||
|
|||||||
+23
-4
@@ -564,6 +564,20 @@ def _mask(token):
|
|||||||
return token[:4] + "…" + token[-4:]
|
return token[:4] + "…" + token[-4:]
|
||||||
|
|
||||||
|
|
||||||
|
# Per-service recommended instance sizes — minimum viable for each workload
|
||||||
|
SERVICE_PLANS = {
|
||||||
|
# Linode plan AWS type Notes
|
||||||
|
"vpn": {"linode": "g6-nanode-1", "aws": "t3.micro"}, # ~64MB RAM usage
|
||||||
|
"dns": {"linode": "g6-nanode-1", "aws": "t3.micro"}, # Pi-hole is tiny
|
||||||
|
"vault": {"linode": "g6-nanode-1", "aws": "t3.micro"}, # Vaultwarden ~50MB
|
||||||
|
"cloud": {"linode": "g6-standard-1", "aws": "t3.small"}, # Nextcloud + MariaDB + Redis
|
||||||
|
"matrix": {"linode": "g6-standard-2", "aws": "t3.medium"}, # Synapse + Postgres + Element (memory hungry)
|
||||||
|
"media": {"linode": "g6-standard-1", "aws": "t3.small"}, # Jellyfin transcoding benefits from RAM
|
||||||
|
"email": {"linode": "g6-standard-1", "aws": "t3.small"}, # Mail-in-a-Box full stack
|
||||||
|
"all_in_one": {"linode": "g6-standard-2", "aws": "t3.medium"}, # Multiple services
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# ─── Provider Selection ─────────────────────────────────────────────────────
|
# ─── Provider Selection ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
def select_provider():
|
def select_provider():
|
||||||
@@ -581,10 +595,11 @@ def select_provider():
|
|||||||
return providers.get(choice)
|
return providers.get(choice)
|
||||||
|
|
||||||
|
|
||||||
def gather_credentials(provider, config):
|
def gather_credentials(provider, config, service_type=None):
|
||||||
"""Gather provider-specific credentials.
|
"""Gather provider-specific credentials.
|
||||||
|
|
||||||
Loads defaults from c2itall vars files or environment variables.
|
Loads defaults from c2itall vars files or environment variables.
|
||||||
|
Uses per-service recommended plans when available.
|
||||||
Press Enter at any prompt to accept the stored default.
|
Press Enter at any prompt to accept the stored default.
|
||||||
"""
|
"""
|
||||||
defaults = _load_provider_defaults()
|
defaults = _load_provider_defaults()
|
||||||
@@ -594,7 +609,9 @@ def gather_credentials(provider, config):
|
|||||||
d = defaults.get("linode", {})
|
d = defaults.get("linode", {})
|
||||||
stored_token = d.get("api_token", "")
|
stored_token = d.get("api_token", "")
|
||||||
default_region = d.get("region", "us-east")
|
default_region = d.get("region", "us-east")
|
||||||
default_plan = d.get("plan", "g6-nanode-1")
|
# Per-service plan takes priority over provider-level default
|
||||||
|
svc_plans = SERVICE_PLANS.get(service_type, {})
|
||||||
|
default_plan = svc_plans.get("linode", d.get("plan", "g6-nanode-1"))
|
||||||
|
|
||||||
if stored_token:
|
if stored_token:
|
||||||
ok(f"Linode token loaded: {_mask(stored_token)}")
|
ok(f"Linode token loaded: {_mask(stored_token)}")
|
||||||
@@ -612,7 +629,9 @@ def gather_credentials(provider, config):
|
|||||||
stored_key = d.get("aws_access_key", "")
|
stored_key = d.get("aws_access_key", "")
|
||||||
stored_secret = d.get("aws_secret_key", "")
|
stored_secret = d.get("aws_secret_key", "")
|
||||||
default_region = d.get("region", "us-east-1")
|
default_region = d.get("region", "us-east-1")
|
||||||
default_type = d.get("instance_type", "t3.micro")
|
# Per-service instance type takes priority over provider-level default
|
||||||
|
svc_plans = SERVICE_PLANS.get(service_type, {})
|
||||||
|
default_type = svc_plans.get("aws", d.get("instance_type", "t3.micro"))
|
||||||
|
|
||||||
if stored_key:
|
if stored_key:
|
||||||
ok(f"AWS credentials loaded: {_mask(stored_key)}")
|
ok(f"AWS credentials loaded: {_mask(stored_key)}")
|
||||||
@@ -1040,7 +1059,7 @@ def main_menu():
|
|||||||
|
|
||||||
config = {"deployment_id": generate_id()}
|
config = {"deployment_id": generate_id()}
|
||||||
|
|
||||||
if not gather_credentials(provider, config):
|
if not gather_credentials(provider, config, service_type=selected):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Gather service-specific config
|
# Gather service-specific config
|
||||||
|
|||||||
Reference in New Issue
Block a user