7474 < div data-md-component ="skip ">
7575
7676
77- < a href ="#1-update-application " class ="md-skip ">
77+ < a href ="#1-create-a-new-project " class ="md-skip ">
7878 Skip to content
7979 </ a >
8080
376376 < ul class ="md-nav__list " data-md-component ="toc " data-md-scrollfix >
377377
378378 < li class ="md-nav__item ">
379- < a href ="#1-update-application " class ="md-nav__link ">
379+ < a href ="#1-create-a-new-project " class ="md-nav__link ">
380380 < span class ="md-ellipsis ">
381- 1. Update Application
381+ 1. Create a new project
382382 </ span >
383383 </ a >
384384
385385</ li >
386386
387387 < li class ="md-nav__item ">
388- < a href ="#1-add-a-traffic-switcher-proxy-service " class ="md-nav__link ">
388+ < a href ="#2-update-the-application " class ="md-nav__link ">
389389 < span class ="md-ellipsis ">
390- 1. Add a traffic-switcher proxy service
390+ 2. Update the Application
391391 </ span >
392392 </ a >
393393
394394</ li >
395395
396396 < li class ="md-nav__item ">
397- < a href ="#deploying " class ="md-nav__link ">
397+ < a href ="#deploy-the-proxy " class ="md-nav__link ">
398398 < span class ="md-ellipsis ">
399- Deploying
399+ Deploy the Proxy
400+ </ span >
401+ </ a >
402+
403+ </ li >
404+
405+ < li class ="md-nav__item ">
406+ < a href ="#deploy-the-app " class ="md-nav__link ">
407+ < span class ="md-ellipsis ">
408+ Deploy the app
400409 </ span >
401410 </ a >
402411
453462 < ul class ="md-nav__list " data-md-component ="toc " data-md-scrollfix >
454463
455464 < li class ="md-nav__item ">
456- < a href ="#1-update-application " class ="md-nav__link ">
465+ < a href ="#1-create-a-new-project " class ="md-nav__link ">
457466 < span class ="md-ellipsis ">
458- 1. Update Application
467+ 1. Create a new project
459468 </ span >
460469 </ a >
461470
462471</ li >
463472
464473 < li class ="md-nav__item ">
465- < a href ="#1-add-a-traffic-switcher-proxy-service " class ="md-nav__link ">
474+ < a href ="#2-update-the-application " class ="md-nav__link ">
466475 < span class ="md-ellipsis ">
467- 1. Add a traffic-switcher proxy service
476+ 2. Update the Application
468477 </ span >
469478 </ a >
470479
471480</ li >
472481
473482 < li class ="md-nav__item ">
474- < a href ="#deploying " class ="md-nav__link ">
483+ < a href ="#deploy-the-proxy " class ="md-nav__link ">
475484 < span class ="md-ellipsis ">
476- Deploying
485+ Deploy the Proxy
486+ </ span >
487+ </ a >
488+
489+ </ li >
490+
491+ < li class ="md-nav__item ">
492+ < a href ="#deploy-the-app " class ="md-nav__link ">
493+ < span class ="md-ellipsis ">
494+ Deploy the app
477495 </ span >
478496 </ a >
479497
518536
519537 < h1 > Advanced Deployments</ h1 >
520538
521- < p > A new < code > proxy</ code > service is added to direct traffic.</ p >
539+ < p > The standard SuperStack replaces the stack in place.</ p >
540+ < ul >
541+ < li > There's some downtime while upgrading.</ li >
542+ < li > You can't test one app while another is live (blue/green)</ li >
543+ < li > Once an app is upgrade, you can't rollback.</ li >
544+ </ ul >
545+ < p > Once your app is ready for production, consider adding a traffic-switcher in
546+ front of your app.</ p >
547+ < p > How it works:</ p >
548+ < ul >
549+ < li > We stop exposing ports in the < code > app</ code > project.</ li >
550+ < li > A new < code > proxy</ code > project is added, with ports open.</ li >
551+ < li > It's purpose is to direct traffic to the right application.</ li >
552+ < li > Apps are deployed completely separate to the live one.</ li >
553+ </ ul >
554+ < p > This way, environments are < em > ephemeral, immutable and idempotent</ em > .</ p >
555+ < p > The directory structure looks like:</ p >
522556< div class ="highlight "> < pre > < span > </ span > < code > proxy/
523557 compose.yaml
524558app/
525- ...
559+ a/
560+ compose.yaml
561+ .env
562+ b/
563+ compose.yaml
564+ .env
526565</ code > </ pre > </ div >
527- < h2 id ="1-update-application "> 1. Update Application</ h2 >
528- < p > Remove the exposed ports, and connect to the proxy's network:</ p >
529- < p > ```yaml title="app/compose.yaml" hl_lines="6-13,15-17"
530- services:
531- caddy:
532- build:
533- context: ./caddy
534- environment:
535- CADDY_SITE_ADDRESS: ":80"
536- networks:
537- default:
538- # This alias allows the proxy to target this container, while still
539- # allowing Docker to manage the container name
540- proxy_default:
541- aliases:
542- - ${COMPOSE_PROJECT_NAME}_caddy</ p >
543- < p > networks:
544- proxy_default:
545- external: true
546- < div class ="highlight "> < pre > < span > </ span > < code > **app/compose.override.yaml**
547-
548- ```yaml
549- # Development overrides
550-
551- services:
552- caddy:
553- volumes:
554- - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
555- </ code > </ pre > </ div > </ p >
556- < h2 id ="1-add-a-traffic-switcher-proxy-service "> 1. Add a traffic-switcher proxy service</ h2 >
557- < p > < strong > proxy/compose.yaml</ strong > </ p >
558- < div class ="highlight "> < pre > < span > </ span > < code > < span class ="nt "> services</ span > < span class ="p "> :</ span >
566+ < h2 id ="1-create-a-new-project "> 1. Create a new project</ h2 >
567+ < p > From the root of the repository, create a new < code > proxy</ code > project:</ p >
568+ < div class ="highlight "> < pre > < span > </ span > < code > mkdir< span class ="w "> </ span > proxy
569+ </ code > </ pre > </ div >
570+ < p > Add a compose file:</ p >
571+ < div class ="highlight "> < span class ="filename "> proxy/compose.yaml</ span > < pre > < span > </ span > < code > < span class ="nt "> services</ span > < span class ="p "> :</ span >
559572< span class ="w "> </ span > < span class ="nt "> caddy</ span > < span class ="p "> :</ span >
560573< span class ="w "> </ span > < span class ="nt "> build</ span > < span class ="p "> :</ span >
561574< 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 >
@@ -569,10 +582,9 @@ <h2 id="1-add-a-traffic-switcher-proxy-service">1. Add a traffic-switcher proxy
569582
570583< span class ="nt "> volumes</ span > < span class ="p "> :</ span >
571584< span class ="w "> </ span > < span class ="nt "> caddy_data</ span > < span class ="p "> :</ span >
572- < 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 "> caddy-data</ span >
585+ < 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 "> caddy-data</ span > < span class =" w " > </ span > < span class =" c1 " > # The proxy manages TLS, so give it a persistent volume for certificates </ span >
573586</ code > </ pre > </ div >
574- < p > < strong > proxy/compose.override.yaml</ strong > </ p >
575- < div class ="highlight "> < pre > < span > </ span > < code > < span class ="c1 "> # Development overrides</ span >
587+ < div class ="highlight "> < span class ="filename "> proxy/compose.override.yaml</ span > < pre > < span > </ span > < code > < span class ="c1 "> # Development overrides</ span >
576588
577589< span class ="nt "> services</ span > < span class ="p "> :</ span >
578590< span class ="w "> </ span > < span class ="nt "> caddy</ span > < span class ="p "> :</ span >
@@ -581,39 +593,49 @@ <h2 id="1-add-a-traffic-switcher-proxy-service">1. Add a traffic-switcher proxy
581593< span class ="w "> </ span > < span class ="nt "> environment</ span > < span class ="p "> :</ span >
582594< 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 >
583595</ code > </ pre > </ div >
584- < p > < strong > proxy/caddy/Caddyfile</ strong > </ p >
585- < div class ="highlight "> < pre > < span > </ span > < code > < span class ="p p-Indicator "> {</ span > < span class ="nv "> $CADDY_SITE_ADDRESS</ span > < span class ="p p-Indicator "> }</ span >
596+ < div class ="highlight "> < span class ="filename "> proxy/caddy/Caddyfile</ span > < pre > < span > </ span > < code > < span class ="p p-Indicator "> {</ span > < span class ="nv "> $CADDY_SITE_ADDRESS</ span > < span class ="p p-Indicator "> }</ span >
586597
587598< span class ="l l-Scalar l-Scalar-Plain "> reverse_proxy app_caddy:80</ span >
588599</ code > </ pre > </ div >
589- < h2 id ="deploying "> Deploying</ h2 >
590- < p > The proxy is deployed manually, and app infra files are created in a new
591- directory every time.</ p >
592- < div class ="highlight "> < pre > < span > </ span > < code > proxy/
593- compose.yaml
594- app/
595- a/
596- compose.yaml
597- .env
598- b/
599- compose.yaml
600- .env
601- </ code > </ pre > </ div >
602- < p > the Proxy (Manual Step)</ p >
600+ < h2 id ="2-update-the-application "> 2. Update the Application</ h2 >
601+ < p > Remove the app's exposed ports, and connect to the proxy's network:</ p >
602+ < p > ```yaml title="app/compose.yaml" hl_lines="6-13,15-17"
603+ services:
604+ caddy:
605+ build:
606+ context: ./caddy
607+ environment:
608+ CADDY_SITE_ADDRESS: ":80"
609+ networks:
610+ default:
611+ # This alias allows the proxy to target this container, while still
612+ # allowing Docker to manage the container name
613+ proxy_default:
614+ aliases:
615+ - ${COMPOSE_PROJECT_NAME}_caddy</ p >
616+ < p > networks:
617+ proxy_default:
618+ external: true
619+ < div class ="highlight "> < pre > < span > </ span > < code > ```yaml title="app/compose.override.yaml"
620+ # Development overrides
621+
622+ services:
623+ caddy:
624+ volumes:
625+ - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
626+ </ code > </ pre > </ div > </ p >
627+ < h2 id ="deploy-the-proxy "> Deploy the Proxy</ h2 >
628+ < p > The proxy is only deployed once.</ p >
603629< p > On the server, create a proxy directory:</ p >
604630< div class ="highlight "> < pre > < span > </ span > < code > mkdir< span class ="w "> </ span > proxy
605631</ code > </ pre > </ div >
606632< p > Back on local, copy your Compose file to the server:</ p >
607633< div class ="highlight "> < pre > < span > </ span > < code > scp< span class ="w "> </ span > proxy/compose.yaml< span class ="w "> </ span > app-backend:proxy/
608634</ code > </ pre > </ div >
609635< blockquote >
610- < p > Optionally, you might point a second hostname to an idle stack for testing.</ p >
636+ < p > You might also point a second hostname to an idle stack for testing.</ p >
611637</ blockquote >
612- < p > The proxy manages TLS, so give it a persistent volume for certificates:</ p >
613- < div class ="highlight "> < pre > < span > </ span > < code > docker< span class ="w "> </ span > volume< span class ="w "> </ span > create< span class ="w "> </ span > caddy_data
614- </ code > </ pre > </ div >
615- < p > Start the proxy, attaching it to both networks β this requires both stacks to
616- be up first, so the networks exist:</ p >
638+ < h2 id ="deploy-the-app "> Deploy the app</ h2 >
617639< div class ="highlight "> < pre > < span > </ span > < code > docker< span class ="w "> </ span > compose< span class ="w "> </ span > up< span class ="w "> </ span > -d
618640</ code > </ pre > </ div >
619641< h2 id ="flip-traffic "> Flip traffic</ h2 >
@@ -622,8 +644,7 @@ <h2 id="flip-traffic">Flip traffic</h2>
622644< span class ="w "> </ span > http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/upstreams/0/dial
623645</ code > </ pre > </ div >
624646< h2 id ="github-actions-workflow "> Github Actions Workflow</ h2 >
625- < p > < strong > .github/workflows/ci.yaml</ strong > </ p >
626- < div class ="highlight "> < pre > < span > </ span > < code > < span class ="nt "> name</ span > < span class ="p "> :</ span > < span class ="w "> </ span > < span class ="l l-Scalar l-Scalar-Plain "> Deploy</ span >
647+ < div class ="highlight "> < span class ="filename "> .github/workflows/ci.yaml</ span > < pre > < span > </ span > < code > < span class ="nt "> name</ span > < span class ="p "> :</ span > < span class ="w "> </ span > < span class ="l l-Scalar l-Scalar-Plain "> Deploy</ span >
627648
628649< span class ="nt "> on</ span > < span class ="p "> :</ span >
629650< span class ="w "> </ span > < span class ="nt "> push</ span > < span class ="p "> :</ span >
0 commit comments