fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer - #115

Merged
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer
Aug 30, 2026
Merged

fix(infra): JARL1183 — reach the SSR instance directly, dropping the load balancer#115
randomdevpete merged 1 commit into
masterfrom
task-1183-drop-the-load-balancer

Conversation

@randomdevpete

@randomdevpeterandomdevpete commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Waiting on decision:

  • Land as-is, leaving the origin-address gap below unmitigated — or say which mitigation you want
    first: pin the AMI, or always deploy JarlSsr and JarlStaticSite together.

CloudFront now reaches the SSR instance directly as a VPC origin. The internal load balancer, its
listener, its target group and its security group are gone; it balanced one target and terminated
nothing.

Also a bugfix. The instance's ingress admitted the VPC CIDR, and a CIDR rule never matches here —
the origin sees a CloudFront address, not the private one on the interface. /ssr/ answers 504 on the
live site today, and the last threemaster deploys failed on that check, going back to
2026-08-19. The rule now names CloudFront-VPCOrigins-Service-SG, resolved at deploy time by a custom
resource that fails naming the group when an account has none. cdk synth still needs no credentials.

The cost, and it bites at exactly one instance. The origin is the instance's private DNS name, and
the AMI is re-resolved on every deploy, so an instance replacement changes it and /ssr/* points at an
instance that has gone until JarlStaticSite deploys too. cdk deploy --all does both in order and
closes the gap; deploying JarlSsr alone does not. Health-check draining and round-robin need more
than one instance to matter — this does not. Nothing here mitigates it.

CI now typechecks and synthesizes infra/. Nothing did before: infra/ is outside the root
workspaces and the root tsconfig.json, and the lookup handler is a template literal that tsc,
oxlint and oxfmt cannot read — so a typo in it would first have run during a production deploy.
The step is credential-free, which is also the property being checked. The wider gap (no infra tests,
no cdk diff on a PR) is a separate piece of work, not this one.

Design, the security-group reasoning, the fresh-account ROLLBACK_FAILED hazard and the
UPDATE_ROLLBACK_FAILED one the re-runnable lookup buys are all in infra/README.md.

Not verifiable without deploying: that the ingress rule admits CloudFront, and the brief window
inside cdk deploy --all where /ssr/* still names the load balancer that has gone.

Checks:tsc --noEmit and cdk synth in infra/ (the latter under env -i with an empty HOME,
so no credentials at all), oxfmt --check, oxlint. Nothing was deployed. No style exceptions.

@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from ec2b7af to 9fa06a8CompareAugust 30, 2026 11:59
…load balancer
The distribution's VPC origin now points at the EC2 instance on port 3000 instead of
at an internal Application Load Balancer that balanced across a single target and
terminated nothing. The load balancer, its listener, its target group and its security
group go with it.
The instance's ingress moves from the load balancer's security group to the one
CloudFront creates and attaches to its own VPC origin network interfaces. The source
has to be a security group rather than an address range: the instance holds a public
IPv4 address for its outbound access, so a rule written against CloudFront's
origin-facing prefix list would admit that address from the internet as well, and one
written against the VPC CIDR matches nothing, because the origin sees a CloudFront
address rather than the interface's private one. That group's id is not an attribute
of the VPC origin, so it is resolved by name at deploy time, by a custom resource that
fails naming the group when an account has none, and leaves synth free of credentials.
Nothing health-checks the instance now that the target group has gone, so the origin's
connection timeout drops to 2 seconds: an unreachable instance costs a viewer three
attempts and a 504 in 6 seconds rather than the default 30.
The origin's address is the instance's private DNS name, and the AMI is re-resolved on
every deploy, so an instance replacement changes it and leaves /ssr/* pointing at an
instance that has gone until JarlStaticSite deploys too. A load balancer's DNS name did
not move. Nothing here mitigates that; infra/README.md says so.
CI typechecks and synthesizes infra/ from here on. Nothing did before — infra/ sits
outside the root workspaces and the root tsconfig — and the lookup handler is a template
literal that tsc, oxlint and oxfmt cannot read, so a typo in it would first have run
during a production deploy.
Ticket: 1183
@randomdevpete
randomdevpeteforce-pushed the task-1183-drop-the-load-balancer branch from 9fa06a8 to 8fce2cbCompareAugust 30, 2026 12:17
@randomdevpete
randomdevpete merged commit 48ede6c into masterAug 30, 2026
5 checks passed
@randomdevpete
randomdevpete deleted the task-1183-drop-the-load-balancer branch August 30, 2026 12:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@randomdevpete