mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
107 lines
22 KiB
HTML
107 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en-US">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>Alerting | Flagger</title>
|
|
<meta name="description" content="Progressive Delivery operator for Kubernetes (Canary, A/B Testing and Blue/Green deployments)">
|
|
<link rel="icon" href="/favicon.png">
|
|
<link rel="stylesheet" href="/website.css">
|
|
<meta name="keywords" content="gitops kubernetes flagger istio linkerd appmesh contour gloo nginx">
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:title" content="Flagger">
|
|
<meta name="twitter:description" content="Progressive delivery Kubernetes operator (Canary, A/B Testing and Blue/Green deployments)">
|
|
<meta name="twitter:image:src" content="https://flagger.app/flagger-overview.png">
|
|
|
|
<link rel="preload" href="/assets/css/0.styles.a0ada997.css" as="style"><link rel="preload" href="/assets/js/app.9b46ae46.js" as="script"><link rel="preload" href="/assets/js/2.ba5bf77c.js" as="script"><link rel="preload" href="/assets/js/30.edda19d9.js" as="script"><link rel="prefetch" href="/assets/js/10.bf6f38d4.js"><link rel="prefetch" href="/assets/js/11.3af38cfe.js"><link rel="prefetch" href="/assets/js/12.eca4b89c.js"><link rel="prefetch" href="/assets/js/13.9104349a.js"><link rel="prefetch" href="/assets/js/14.a4f3d810.js"><link rel="prefetch" href="/assets/js/15.aada2caa.js"><link rel="prefetch" href="/assets/js/16.3012a10b.js"><link rel="prefetch" href="/assets/js/17.a98b6aa9.js"><link rel="prefetch" href="/assets/js/18.e5188926.js"><link rel="prefetch" href="/assets/js/19.bb9498f7.js"><link rel="prefetch" href="/assets/js/20.2b1bebf5.js"><link rel="prefetch" href="/assets/js/21.e1068843.js"><link rel="prefetch" href="/assets/js/22.1c5d14b9.js"><link rel="prefetch" href="/assets/js/23.b3dcc355.js"><link rel="prefetch" href="/assets/js/24.4f54d289.js"><link rel="prefetch" href="/assets/js/25.914acd1d.js"><link rel="prefetch" href="/assets/js/26.b2d4f402.js"><link rel="prefetch" href="/assets/js/27.ea9f1f9c.js"><link rel="prefetch" href="/assets/js/28.deae273d.js"><link rel="prefetch" href="/assets/js/29.ce4011f4.js"><link rel="prefetch" href="/assets/js/3.8b254d5d.js"><link rel="prefetch" href="/assets/js/31.fbfb336c.js"><link rel="prefetch" href="/assets/js/32.591c3f2b.js"><link rel="prefetch" href="/assets/js/33.c456709f.js"><link rel="prefetch" href="/assets/js/34.5a071e36.js"><link rel="prefetch" href="/assets/js/35.fc27c09e.js"><link rel="prefetch" href="/assets/js/36.144098aa.js"><link rel="prefetch" href="/assets/js/4.26a3069c.js"><link rel="prefetch" href="/assets/js/5.0c32bdf9.js"><link rel="prefetch" href="/assets/js/6.ee5ffca3.js"><link rel="prefetch" href="/assets/js/7.6bf27a87.js"><link rel="prefetch" href="/assets/js/8.8b72a8d3.js"><link rel="prefetch" href="/assets/js/9.7919fc1d.js">
|
|
<link rel="stylesheet" href="/assets/css/0.styles.a0ada997.css">
|
|
</head>
|
|
<body>
|
|
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">Flagger</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="https://docs.flagger.app" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
|
Docs
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div><div class="nav-item"><a href="https://github.com/weaveworks/flagger/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
|
Changelog
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/weaveworks/flagger" target="_blank" rel="noopener noreferrer" class="repo-link">
|
|
GitHub
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="https://docs.flagger.app" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
|
Docs
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div><div class="nav-item"><a href="https://github.com/weaveworks/flagger/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
|
Changelog
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/weaveworks/flagger" target="_blank" rel="noopener noreferrer" class="repo-link">
|
|
GitHub
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <ul class="sidebar-links"><li><a href="/" class="sidebar-link">Home</a></li><li><section class="sidebar-group depth-0"><a href="/intro/" class="sidebar-heading clickable"><span>Introduction</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/intro/" class="sidebar-link">Get Started</a></li><li><a href="/intro/faq.html" class="sidebar-link">FAQ</a></li></ul></section></li><li><section class="sidebar-group depth-0"><a href="/install/flagger-install-on-kubernetes" class="sidebar-heading clickable"><span>Install</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/install/flagger-install-on-kubernetes.html" class="sidebar-link">On Kubernetes</a></li><li><a href="/install/flagger-install-on-google-cloud.html" class="sidebar-link">On GKE Istio</a></li><li><a href="/install/flagger-install-on-eks-appmesh.html" class="sidebar-link">On EKS App Mesh</a></li></ul></section></li><li><section class="sidebar-group depth-0"><a href="/usage/how-it-works" class="sidebar-heading clickable open"><span>Usage</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/usage/how-it-works.html" class="sidebar-link">How it works</a></li><li><a href="/usage/deployment-strategies.html" class="sidebar-link">Deployment Strategies</a></li><li><a href="/usage/metrics.html" class="sidebar-link">Metrics Analysis</a></li><li><a href="/usage/webhooks.html" class="sidebar-link">Webhooks</a></li><li><a href="/usage/alerting.html" class="active sidebar-link">Alerting</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/usage/alerting.html#global-configuration" class="sidebar-link">Global configuration</a></li><li class="sidebar-sub-header"><a href="/usage/alerting.html#canary-configuration" class="sidebar-link">Canary configuration</a></li><li class="sidebar-sub-header"><a href="/usage/alerting.html#prometheus-alert-manager" class="sidebar-link">Prometheus Alert Manager</a></li></ul></li><li><a href="/usage/monitoring.html" class="sidebar-link">Monitoring</a></li></ul></section></li><li><section class="sidebar-group depth-0"><a href="/tutorials/istio-progressive-delivery" class="sidebar-heading clickable"><span>Tutorials</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/tutorials/istio-progressive-delivery.html" class="sidebar-link">Istio Canaries</a></li><li><a href="/tutorials/istio-ab-testing.html" class="sidebar-link">Istio A/B Testing</a></li><li><a href="/tutorials/linkerd-progressive-delivery.html" class="sidebar-link">Linkerd Canaries</a></li><li><a href="/tutorials/appmesh-progressive-delivery.html" class="sidebar-link">App Mesh Canaries</a></li><li><a href="/tutorials/nginx-progressive-delivery.html" class="sidebar-link">NGINX Ingress Canaries</a></li><li><a href="/tutorials/gloo-progressive-delivery.html" class="sidebar-link">Gloo Canaries</a></li><li><a href="/tutorials/contour-progressive-delivery.html" class="sidebar-link">Contour Canaries</a></li><li><a href="/tutorials/kubernetes-blue-green.html" class="sidebar-link">Kubernetes Blue/Green</a></li><li><a href="/tutorials/canary-helm-gitops.html" class="sidebar-link">Canaries with Helm charts and GitOps</a></li></ul></section></li><li><section class="sidebar-group depth-0"><a href="/dev/dev-guide" class="sidebar-heading clickable"><span>Dev</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/dev/dev-guide.html" class="sidebar-link">Development Guide</a></li><li><a href="/dev/release-guide.html" class="sidebar-link">Release Guide</a></li><li><a href="/dev/upgrade-guide.html" class="sidebar-link">Upgrade Guide</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="alerting"><a href="#alerting" aria-hidden="true" class="header-anchor">#</a> Alerting</h1> <p>Flagger can be configured to send alerts to various chat platforms. You can define a global alert provider at
|
|
install time or configure alerts on a per canary basis.</p> <h2 id="global-configuration"><a href="#global-configuration" aria-hidden="true" class="header-anchor">#</a> Global configuration</h2> <p>Flagger can be configured to send Slack notifications:</p> <div class="language-bash extra-class"><pre class="language-bash"><code>helm upgrade -i flagger flagger/flagger <span class="token punctuation">\</span>
|
|
--set slack.url<span class="token operator">=</span>https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK <span class="token punctuation">\</span>
|
|
--set slack.channel<span class="token operator">=</span>general <span class="token punctuation">\</span>
|
|
--set slack.user<span class="token operator">=</span>flagger
|
|
</code></pre></div><p>Once configured with a Slack incoming <strong>webhook</strong>, Flagger will post messages when a canary deployment
|
|
has been initialised, when a new revision has been detected and if the canary analysis failed or succeeded.</p> <p><img src="https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/slack-canary-notifications.png" alt="Slack Notifications"></p> <p>A canary deployment will be rolled back if the progress deadline exceeded or if the analysis reached the
|
|
maximum number of failed checks:</p> <p><img src="https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/slack-canary-failed.png" alt="Slack Notifications"></p> <p>Flagger can be configured to send notifications to Microsoft Teams:</p> <div class="language-bash extra-class"><pre class="language-bash"><code>helm upgrade -i flagger flagger/flagger <span class="token punctuation">\</span>
|
|
--set msteams.url<span class="token operator">=</span>https://outlook.office.com/webhook/YOUR/TEAMS/WEBHOOK
|
|
</code></pre></div><p>Similar to Slack, Flagger alerts on canary analysis events:</p> <p><img src="https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/flagger-ms-teams-notifications.png" alt="MS Teams Notifications"></p> <p><img src="https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/flagger-ms-teams-failed.png" alt="MS Teams Notifications"></p> <h2 id="canary-configuration"><a href="#canary-configuration" aria-hidden="true" class="header-anchor">#</a> Canary configuration</h2> <p>Configuring alerting globally has several limitations as it's not possible to specify different channels
|
|
or configure the verbosity on a per canary basis.
|
|
To make the alerting move flexible, the canary analysis can be extended
|
|
with a list of alerts that reference an alert provider.
|
|
For each alert, users can configure the severity level.
|
|
The alerts section overrides the global setting.</p> <p>Slack example:</p> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> flagger.app/v1beta1
|
|
<span class="token key atrule">kind</span><span class="token punctuation">:</span> AlertProvider
|
|
<span class="token key atrule">metadata</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> on<span class="token punctuation">-</span>call
|
|
<span class="token key atrule">namespace</span><span class="token punctuation">:</span> flagger
|
|
<span class="token key atrule">spec</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">type</span><span class="token punctuation">:</span> slack
|
|
<span class="token key atrule">channel</span><span class="token punctuation">:</span> on<span class="token punctuation">-</span>call<span class="token punctuation">-</span>alerts
|
|
<span class="token key atrule">username</span><span class="token punctuation">:</span> flagger
|
|
<span class="token comment"># webhook address (ignored if secretRef is specified)</span>
|
|
<span class="token key atrule">address</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//hooks.slack.com/services/YOUR/SLACK/WEBHOOK
|
|
<span class="token comment"># secret containing the webhook address (optional)</span>
|
|
<span class="token key atrule">secretRef</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> on<span class="token punctuation">-</span>call<span class="token punctuation">-</span>url
|
|
<span class="token punctuation">---</span>
|
|
<span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1
|
|
<span class="token key atrule">kind</span><span class="token punctuation">:</span> Secret
|
|
<span class="token key atrule">metadata</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> on<span class="token punctuation">-</span>call<span class="token punctuation">-</span>url
|
|
<span class="token key atrule">namespace</span><span class="token punctuation">:</span> flagger
|
|
<span class="token key atrule">data</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">address</span><span class="token punctuation">:</span> <encoded<span class="token punctuation">-</span>url<span class="token punctuation">></span>
|
|
</code></pre></div><p>The alert provider <strong>type</strong> can be: <code>slack</code>, <code>msteams</code>, <code>rocket</code> or <code>discord</code>. When set to <code>discord</code>,
|
|
Flagger will use <a href="https://birdie0.github.io/discord-webhooks-guide/other/slack_formatting.html" target="_blank" rel="noopener noreferrer">Slack formatting<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>
|
|
and will append <code>/slack</code> to the Discord address.</p> <p>When not specified, <strong>channel</strong> defaults to <code>general</code> and <strong>username</strong> defaults to <code>flagger</code>.</p> <p>When <strong>secretRef</strong> is specified, the Kubernetes secret must contain a data field named <code>address</code>,
|
|
the address in the secret will take precedence over the <strong>address</strong> field in the provider spec.</p> <p>The canary analysis can have a list of alerts, each alert referencing an alert provider:</p> <div class="language-yaml extra-class"><pre class="language-yaml"><code> <span class="token key atrule">analysis</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">alerts</span><span class="token punctuation">:</span>
|
|
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"on-call Slack"</span>
|
|
<span class="token key atrule">severity</span><span class="token punctuation">:</span> error
|
|
<span class="token key atrule">providerRef</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> on<span class="token punctuation">-</span>call
|
|
<span class="token key atrule">namespace</span><span class="token punctuation">:</span> flagger
|
|
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"qa Discord"</span>
|
|
<span class="token key atrule">severity</span><span class="token punctuation">:</span> warn
|
|
<span class="token key atrule">providerRef</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> qa<span class="token punctuation">-</span>discord
|
|
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"dev MS Teams"</span>
|
|
<span class="token key atrule">severity</span><span class="token punctuation">:</span> info
|
|
<span class="token key atrule">providerRef</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">name</span><span class="token punctuation">:</span> dev<span class="token punctuation">-</span>msteams
|
|
</code></pre></div><p>Alert fields:</p> <ul><li><strong>name</strong> (required)</li> <li><strong>severity</strong> levels: <code>info</code>, <code>warn</code>, <code>error</code> (default info)</li> <li><strong>providerRef.name</strong> alert provider name (required)</li> <li><strong>providerRef.namespace</strong> alert provider namespace (defaults to the canary namespace)</li></ul> <p>When the severity is set to <code>warn</code>, Flagger will alert when waiting on manual confirmation or if the analysis fails.
|
|
When the severity is set to <code>error</code>, Flagger will alert only if the canary analysis fails.</p> <h2 id="prometheus-alert-manager"><a href="#prometheus-alert-manager" aria-hidden="true" class="header-anchor">#</a> Prometheus Alert Manager</h2> <p>You can use Alertmanager to trigger alerts when a canary deployment failed:</p> <div class="language-yaml extra-class"><pre class="language-yaml"><code> <span class="token punctuation">-</span> <span class="token key atrule">alert</span><span class="token punctuation">:</span> canary_rollback
|
|
<span class="token key atrule">expr</span><span class="token punctuation">:</span> flagger_canary_status <span class="token punctuation">></span> 1
|
|
<span class="token key atrule">for</span><span class="token punctuation">:</span> 1m
|
|
<span class="token key atrule">labels</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">severity</span><span class="token punctuation">:</span> warning
|
|
<span class="token key atrule">annotations</span><span class="token punctuation">:</span>
|
|
<span class="token key atrule">summary</span><span class="token punctuation">:</span> <span class="token string">"Canary failed"</span>
|
|
<span class="token key atrule">description</span><span class="token punctuation">:</span> <span class="token string">"Workload {{ $labels.name }} namespace {{ $labels.namespace }}"</span>
|
|
</code></pre></div></div> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
|
|
←
|
|
<a href="/usage/webhooks.html" class="prev">
|
|
Webhooks
|
|
</a></span> <span class="next"><a href="/usage/monitoring.html">
|
|
Monitoring
|
|
</a>
|
|
→
|
|
</span></p></div> </main></div><div class="global-ui"></div></div>
|
|
<script src="/assets/js/app.9b46ae46.js" defer></script><script src="/assets/js/2.ba5bf77c.js" defer></script><script src="/assets/js/30.edda19d9.js" defer></script>
|
|
</body>
|
|
</html>
|