Skip to content

Commit 459f9fd

Browse files
author
Exploding Labs Bot
committed
Update site from docs source repo
1 parent ccd149a commit 459f9fd

File tree

16 files changed

+239
-59
lines changed

16 files changed

+239
-59
lines changed

superstack/404.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414
<link rel="icon" href="/superstack/assets/images/favicon.png">
15-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
15+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.19">
1616

1717

1818

@@ -469,10 +469,10 @@ <h1>404 - Not found</h1>
469469

470470

471471

472-
<script id="__config" type="application/json">{"base": "/superstack/", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "/superstack/assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
472+
<script id="__config" type="application/json">{"base": "/superstack/", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "/superstack/assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
473473

474474

475-
<script src="/superstack/assets/javascripts/bundle.50899def.min.js"></script>
475+
<script src="/superstack/assets/javascripts/bundle.92b07e13.min.js"></script>
476476

477477

478478
</body>

superstack/assets/javascripts/bundle.50899def.min.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

superstack/assets/javascripts/bundle.92b07e13.min.js

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

superstack/assets/javascripts/bundle.50899def.min.js.map renamed to superstack/assets/javascripts/bundle.92b07e13.min.js.map

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

superstack/assets/javascripts/workers/search.d50fe291.min.js renamed to superstack/assets/javascripts/workers/search.973d3a69.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

superstack/assets/javascripts/workers/search.d50fe291.min.js.map renamed to superstack/assets/javascripts/workers/search.973d3a69.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

superstack/deploying/index.html

Lines changed: 187 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<link rel="icon" href="../assets/images/favicon.png">
21-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
21+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.19">
2222

2323

2424

@@ -459,6 +459,57 @@
459459
</span>
460460
</a>
461461

462+
</li>
463+
464+
<li class="md-nav__item">
465+
<a href="#bluegreen-deployments" class="md-nav__link">
466+
<span class="md-ellipsis">
467+
Blue/Green Deployments
468+
</span>
469+
</a>
470+
471+
<nav class="md-nav" aria-label="Blue/Green Deployments">
472+
<ul class="md-nav__list">
473+
474+
<li class="md-nav__item">
475+
<a href="#1-caddyfile" class="md-nav__link">
476+
<span class="md-ellipsis">
477+
1. Caddyfile
478+
</span>
479+
</a>
480+
481+
</li>
482+
483+
<li class="md-nav__item">
484+
<a href="#2-start-two-stacks" class="md-nav__link">
485+
<span class="md-ellipsis">
486+
2. Start two Stacks
487+
</span>
488+
</a>
489+
490+
</li>
491+
492+
<li class="md-nav__item">
493+
<a href="#3-front-proxy" class="md-nav__link">
494+
<span class="md-ellipsis">
495+
3. Front Proxy
496+
</span>
497+
</a>
498+
499+
</li>
500+
501+
<li class="md-nav__item">
502+
<a href="#4-deploying" class="md-nav__link">
503+
<span class="md-ellipsis">
504+
4. Deploying
505+
</span>
506+
</a>
507+
508+
</li>
509+
510+
</ul>
511+
</nav>
512+
462513
</li>
463514

464515
</ul>
@@ -551,6 +602,57 @@
551602
</span>
552603
</a>
553604

605+
</li>
606+
607+
<li class="md-nav__item">
608+
<a href="#bluegreen-deployments" class="md-nav__link">
609+
<span class="md-ellipsis">
610+
Blue/Green Deployments
611+
</span>
612+
</a>
613+
614+
<nav class="md-nav" aria-label="Blue/Green Deployments">
615+
<ul class="md-nav__list">
616+
617+
<li class="md-nav__item">
618+
<a href="#1-caddyfile" class="md-nav__link">
619+
<span class="md-ellipsis">
620+
1. Caddyfile
621+
</span>
622+
</a>
623+
624+
</li>
625+
626+
<li class="md-nav__item">
627+
<a href="#2-start-two-stacks" class="md-nav__link">
628+
<span class="md-ellipsis">
629+
2. Start two Stacks
630+
</span>
631+
</a>
632+
633+
</li>
634+
635+
<li class="md-nav__item">
636+
<a href="#3-front-proxy" class="md-nav__link">
637+
<span class="md-ellipsis">
638+
3. Front Proxy
639+
</span>
640+
</a>
641+
642+
</li>
643+
644+
<li class="md-nav__item">
645+
<a href="#4-deploying" class="md-nav__link">
646+
<span class="md-ellipsis">
647+
4. Deploying
648+
</span>
649+
</a>
650+
651+
</li>
652+
653+
</ul>
654+
</nav>
655+
554656
</li>
555657

556658
</ul>
@@ -578,12 +680,17 @@ <h1 id="deploying-to-remote-environments">☁️ Deploying to Remote Environment
578680
<p>A clear goal of SuperStack is that <strong>only <code>compose.yaml</code> should be required on
579681
the remote server</strong>. No other file should need to be copied there.</p>
580682
<h2 id="1-prepare-your-images">✅ 1. Prepare your Images</h2>
581-
<p>For services that are built, add <code>image:</code> URIs to your own container repository
582-
(e.g. your Docker Hub or GitHub Container Registry account), for example:</p>
683+
<p>For services that are built (they have a <code>build:</code> section in <code>compose.yaml</code>),
684+
add your own container repository image URIs (e.g. your Docker Hub or GitHub
685+
Container Registry account), for example:</p>
583686
<div class="highlight"><span class="filename">compose.yaml</span><pre><span></span><code><span class="nt">caddy</span><span class="p">:</span>
687+
<span class="w"> </span><span class="nt">build</span><span class="p">:</span>
688+
<span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./caddy</span>
584689
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ghcr.io/youruser/yourapp-caddy</span>
585690

586691
<span class="nt">postgres</span><span class="p">:</span>
692+
<span class="w"> </span><span class="nt">build</span><span class="p">:</span>
693+
<span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./postgres</span>
587694
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ghcr.io/youruser/yourapp-postgres</span>
588695
</code></pre></div>
589696
<h2 id="2-build-and-push-your-images">🛠️ 2. Build and Push your Images</h2>
@@ -592,8 +699,7 @@ <h2 id="2-build-and-push-your-images">🛠️ 2. Build and Push your Images</h2>
592699
docker<span class="w"> </span>compose<span class="w"> </span>push
593700
</code></pre></div>
594701
<h2 id="3-deploy-the-compose-file">📦 3. Deploy the Compose File</h2>
595-
<p>Only <code>compose.yaml</code> is required on the remote server.</p>
596-
<p>Copy it to your server:</p>
702+
<p>Copy <code>compose.yaml</code> to your server:</p>
597703
<div class="highlight"><pre><span></span><code>scp<span class="w"> </span>compose.yaml<span class="w"> </span>youruser@yourserver:
598704
</code></pre></div>
599705
<h2 id="4-launch-your-stack">🚀 4. Launch your Stack</h2>
@@ -618,6 +724,80 @@ <h2 id="4-launch-your-stack">🚀 4. Launch your Stack</h2>
618724
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
619725
docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>postgres<span class="w"> </span>migrate
620726
</code></pre></div>
727+
<h2 id="bluegreen-deployments">Blue/Green Deployments</h2>
728+
<p>This is a deployment method where two complete stacks are running side-by-side.
729+
One is serving production traffic, while the other is idle. You deploy to the
730+
idle stack, test it, and when you’re ready you swap roles — the idle stack
731+
becomes production instantly, and the old production becomes idle. This
732+
provides near-zero downtime and an easy rollback path.</p>
733+
<p>We’ll bring up two stacks, <code>blue</code> and <code>green</code>, with no ports exposed. A
734+
separate lightweight front proxy binds to <code>:80</code> and <code>:443</code> and routes traffic
735+
to whichever stack is active.</p>
736+
<h3 id="1-caddyfile">1. Caddyfile</h3>
737+
<p>Remove the exposed ports from the Caddy service. Also set <code>CADDY_SITE_ADDRESS</code>
738+
to only <code>:80</code> (leaving TLS termination to the front proxy):</p>
739+
<div class="highlight"><span class="filename">compose.yaml</span><pre><span></span><code><span class="nt">caddy</span><span class="p">:</span>
740+
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
741+
<span class="w"> </span><span class="nt">CADDY_SITE_ADDRESS</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">:80</span>
742+
</code></pre></div>
743+
<p>To share data between the two stacks (database, uploads, etc.), give volumes
744+
explicit names:</p>
745+
<div class="highlight"><span class="filename">compose.yaml</span><pre><span></span><code><span class="nt">volumes</span><span class="p">:</span>
746+
<span class="w"> </span><span class="nt">postgres_data</span><span class="p">:</span>
747+
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">postgres-data</span>
748+
<span class="w"> </span><span class="nt">user_data</span><span class="p">:</span>
749+
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">user-data</span>
750+
</code></pre></div>
751+
<h3 id="2-start-two-stacks">2. Start two Stacks</h3>
752+
<p>On the server, bring up two stacks, <code>blue</code> and <code>green</code>:</p>
753+
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>-p<span class="w"> </span>blue<span class="w"> </span>up<span class="w"> </span>-d
754+
docker<span class="w"> </span>compose<span class="w"> </span>-p<span class="w"> </span>green<span class="w"> </span>up<span class="w"> </span>-d
755+
</code></pre></div>
756+
<h3 id="3-front-proxy">3. Front Proxy</h3>
757+
<p>The front proxy is a single Caddy container that binds <code>:80</code> and <code>:443</code> on the
758+
server and routes requests into either the Blue or Green stack.</p>
759+
<p>On the server, create a simple <code>Caddyfile</code>:</p>
760+
<div class="highlight"><span class="filename">Caddyfile</span><pre><span></span><code>api.myapp.com {
761+
reverse_proxy blue_caddy:80
762+
}
763+
764+
# Optionally point a second hostname to the idle stack for testing
765+
next.myapp.com {
766+
reverse_proxy blue_caddy:80
767+
}
768+
</code></pre></div>
769+
<p>The front proxy manages TLS, so give it a persistent volume for certificates:</p>
770+
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span>volume<span class="w"> </span>create<span class="w"> </span>caddy_data
771+
</code></pre></div>
772+
<p>Start the proxy and attach it to both networks:</p>
773+
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span>run<span class="w"> </span>-d<span class="w"> </span><span class="se">\</span>
774+
<span class="w"> </span>--name<span class="w"> </span>front-proxy<span class="w"> </span><span class="se">\</span>
775+
<span class="w"> </span>-p<span class="w"> </span><span class="m">80</span>:80<span class="w"> </span>-p<span class="w"> </span><span class="m">443</span>:443<span class="w"> </span><span class="se">\</span>
776+
<span class="w"> </span>-v<span class="w"> </span>./Caddyfile:/etc/caddy/Caddyfile<span class="w"> </span><span class="se">\</span>
777+
<span class="w"> </span>-v<span class="w"> </span>caddy_data:/data<span class="w"> </span><span class="se">\</span>
778+
<span class="w"> </span>--network<span class="w"> </span>blue_default<span class="w"> </span><span class="se">\</span>
779+
<span class="w"> </span>--network<span class="w"> </span>green_default<span class="w"> </span><span class="se">\</span>
780+
<span class="w"> </span>caddy:2
781+
</code></pre></div>
782+
<h3 id="4-deploying">4. Deploying</h3>
783+
<p>Update the idle stack:</p>
784+
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>pull
785+
docker<span class="w"> </span>compose<span class="w"> </span>-p<span class="w"> </span>green<span class="w"> </span>up<span class="w"> </span>-d
786+
</code></pre></div>
787+
<p>Edit the front proxy's config to flip traffic:</p>
788+
<div class="highlight"><span class="filename">Caddyfile</span><pre><span></span><code>api.myapp.com {
789+
reverse_proxy green_caddy:80
790+
}
791+
792+
next.myapp.com {
793+
reverse_proxy blue_caddy:80
794+
}
795+
</code></pre></div>
796+
<p>Restart Caddy:</p>
797+
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>front-proxy<span class="w"> </span>caddy<span class="w"> </span>reload
798+
</code></pre></div>
799+
<p>Cutover is instant. Green is now live, and Blue is the idle stack.</p>
800+
<p>And rollback is simple: flip the <code>Caddyfile</code> back and <code>caddy reload</code>.</p>
621801

622802

623803

@@ -706,10 +886,10 @@ <h2 id="4-launch-your-stack">🚀 4. Launch your Stack</h2>
706886

707887

708888

709-
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
889+
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
710890

711891

712-
<script src="../assets/javascripts/bundle.50899def.min.js"></script>
892+
<script src="../assets/javascripts/bundle.92b07e13.min.js"></script>
713893

714894

715895
</body>

superstack/extensions/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<link rel="icon" href="../assets/images/favicon.png">
21-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
21+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.19">
2222

2323

2424

@@ -728,10 +728,10 @@ <h2 id="loading-an-extension">🔌 Loading an Extension</h2>
728728

729729

730730

731-
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
731+
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
732732

733733

734-
<script src="../assets/javascripts/bundle.50899def.min.js"></script>
734+
<script src="../assets/javascripts/bundle.92b07e13.min.js"></script>
735735

736736

737737
</body>

superstack/gettingstarted/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<link rel="icon" href="../assets/images/favicon.png">
21-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
21+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.19">
2222

2323

2424

@@ -794,10 +794,10 @@ <h2 id="whats-next">➕ What's Next?</h2>
794794

795795

796796

797-
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
797+
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.footer", "palette.toggle", "content.code.copy"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
798798

799799

800-
<script src="../assets/javascripts/bundle.50899def.min.js"></script>
800+
<script src="../assets/javascripts/bundle.92b07e13.min.js"></script>
801801

802802

803803
</body>

0 commit comments

Comments
 (0)