mirror of
https://github.com/caprover/caprover
synced 2026-05-05 11:10:31 +00:00
1030fe0ec9
Deploy website version based on 8fe0506b3b1d032fc9021bfac183294fc655ac26
69 lines
11 KiB
HTML
69 lines
11 KiB
HTML
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pre-deploy Script · CaptainDuckDuck</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="<p><br/></p>
|
||
"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Pre-deploy Script · CaptainDuckDuck"/><meta property="og:type" content="website"/><meta property="og:url" content="https://www.captainduckduck.com/index.html"/><meta property="og:description" content="<p><br/></p>
|
||
"/><meta property="og:image" content="https://www.captainduckduck.com/img/captainduckduck.png"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://www.captainduckduck.com/img/captainduckduck.png"/><link rel="shortcut icon" href="/img/favicon.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><link rel="stylesheet" href="/css/main.css"/></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/captainduckduck.png" alt="CaptainDuckDuck"/><h2 class="headerTitleWithLogo">CaptainDuckDuck</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/get-started.html" target="_self">Docs</a></li><li class=""><a href="https://github.com/githubsaturn/captainduckduck" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><i></i></div><h2><i>›</i><span>Do More</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Basics</h3><ul><li class="navListItem"><a class="navItem" href="/docs/get-started.html">Getting Started</a></li><li class="navListItem"><a class="navItem" href="/docs/captain-definition-file.html">Captain Definition File</a></li><li class="navListItem"><a class="navItem" href="/docs/deployment-methods.html">Deployment Methods</a></li><li class="navListItem"><a class="navItem" href="/docs/app-configuration.html">App Configuration</a></li><li class="navListItem"><a class="navItem" href="/docs/complete-webapp-tutorial.html">Complete Webapp Tutorial</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Do More</h3><ul><li class="navListItem"><a class="navItem" href="/docs/enabling-https.html">Enabling HTTPS</a></li><li class="navListItem"><a class="navItem" href="/docs/one-click-apps.html">One-Click Apps</a></li><li class="navListItem"><a class="navItem" href="/docs/resource-monitoring.html">Resource Monitoring</a></li><li class="navListItem"><a class="navItem" href="/docs/nginx-customization.html">NGINX Config</a></li><li class="navListItem"><a class="navItem" href="/docs/app-scaling-and-cluster.html">App Scaling & Cluster</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/pre-deploy-script.html">Pre-deploy Script</a></li><li class="navListItem"><a class="navItem" href="/docs/cli-commands.html">CLI Commands</a></li><li class="navListItem"><a class="navItem" href="/docs/run-locally.html">Run Locally</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Recipes and Tips</h3><ul><li class="navListItem"><a class="navItem" href="/docs/recipe-deploy-create-react-app.html">Static React App</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Help</h3><ul><li class="navListItem"><a class="navItem" href="/docs/server-purchase.html">Server Purchase</a></li><li class="navListItem"><a class="navItem" href="/docs/disk-cleanup.html">Disk Clean-Up</a></li><li class="navListItem"><a class="navItem" href="/docs/firewall.html">Firewall & Port Forwarding</a></li><li class="navListItem"><a class="navItem" href="/docs/troubleshooting.html">Troubleshooting</a></li></ul></div></div></section></div><script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
|
||
createToggler('#tocToggler', 'body', 'tocActive');
|
||
|
||
const headings = document.querySelector('.toc-headings');
|
||
headings && headings.addEventListener('click', function(event) {
|
||
if (event.target.tagName === 'A') {
|
||
document.body.classList.remove('tocActive');
|
||
}
|
||
}, false);
|
||
|
||
function createToggler(togglerSelector, targetSelector, className) {
|
||
var toggler = document.querySelector(togglerSelector);
|
||
var target = document.querySelector(targetSelector);
|
||
|
||
if (!toggler) {
|
||
return;
|
||
}
|
||
|
||
toggler.onclick = function(event) {
|
||
event.preventDefault();
|
||
|
||
target.classList.toggle(className);
|
||
};
|
||
}
|
||
});
|
||
</script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 class="postHeaderTitle">Pre-deploy Script</h1></header><article><div><span><p><br/>
|
||
This is a very advanced operation and requires attention. Otherwise, it can break the deployment for your app.</p>
|
||
<p>This script will run right before your container (i.e. app) gets updated due to a configuration change or app deploy. In this script, you can modify the Docker service object, invoke an HTTP call, and literally do anything. The template for this script is:</p>
|
||
<pre><code class="hljs"><span class="hljs-keyword">var</span> preDeployFunction = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">captainAppObj, dockerUpdateObject</span>) </span>{
|
||
<span class="hljs-keyword">return</span> <span class="hljs-built_in">Promise</span>.resolve()
|
||
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
|
||
|
||
<span class="hljs-comment">// Do something in a Promise form</span>
|
||
|
||
<span class="hljs-comment">// In the end, return the "possibly-modified" dockerUpdateObject</span>
|
||
<span class="hljs-keyword">return</span> dockerUpdateObject;
|
||
});
|
||
};
|
||
|
||
</code></pre>
|
||
<p>Note that <code>captainAppObj</code>, is the app object as saved in <code>/captain/config.conf</code> file, and <code>dockerUpdateObject</code> is the service update object that is being passed to Docker to update the service (environmental vars, image version and etc). This object is as per <a href="https://docs.docker.com/engine/api/v1.30/#operation/ServiceUpdate">Docker docs</a>.</p>
|
||
<p>Since this script will be executed in CaptainDuckDuck process, you'll get access to all node dependecies that CaptainDuckDuck has, see <a href="https://github.com/githubsaturn/captainduckduck/blob/master/app-backend/package.json">CaptainDuckDuck/app-backend/package.json</a>. For example, the following script injects a UUID mapped to the deployed version to service label with every update:</p>
|
||
<pre><code class="hljs"><span class="hljs-keyword">var</span> uuid = <span class="hljs-built_in">require</span>(<span class="hljs-string">'uuid/v4'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> preDeployFunction = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">captainAppObj, dockerUpdateObject</span>) </span>{
|
||
<span class="hljs-keyword">return</span> <span class="hljs-built_in">Promise</span>.resolve()
|
||
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
|
||
|
||
dockerUpdateObject.TaskTemplate.ContainerSpec.Labels[uuid()] =
|
||
captainAppObj.deployedVersion+ <span class="hljs-string">''</span>;
|
||
<span class="hljs-keyword">return</span> dockerUpdateObject;
|
||
});
|
||
};
|
||
|
||
</code></pre>
|
||
<p>Note that this pre-deploy script, particularly Docker service update object, is complicated. Hence, it is strongly recommended to use this pre-deploy method if you are an expert user. For example, note that how an empty string is being added to the deployed version in this line:</p>
|
||
<pre><code class="hljs">dockerUpdateObject.TaskTemplate.ContainerSpec.Labels[<span class="hljs-type">uuid</span>()] = captainAppObj.deployedVersion+ <span class="hljs-string">''</span>;
|
||
</code></pre>
|
||
<p>Removing this causes an error. To see logs, you need to run <code>docker service logs captain-captain --follow</code>. Even the error from Docker is not very clear. All in all, this is an advanced feature and is not recommended for beginners and intermiate users.</p>
|
||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/app-scaling-and-cluster.html"><span class="arrow-prev">← </span><span>App Scaling & Cluster</span></a><a class="docs-next button" href="/docs/cli-commands.html"><span>CLI Commands</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/captainduckduck.png" alt="CaptainDuckDuck" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/get-started.html">Getting Started</a></div><div><h5>Community</h5><a href="https://twitter.com/search?vertical=default&q=captainduckduck&src=typd" target="_blank" rel="noreferrer noopener">Twitter</a><a href="https://join.slack.com/t/captainduckduck/shared_invite/enQtNDEwMjc3MjcxNjUzLWQ4YjljN2JiMGU5Nzk5NjcwMDEzNDNiMTNkOTVhNTA4YTYwOThkNDkyMTlkMDFhMzAzOTA5YjcwY2E4NWRkYzk" target="_blank" rel="noreferrer noopener">Slack Group</a></div><div><h5>More</h5><a href="https://github.com/githubsaturn/captainduckduck" target="_blank">GitHub</a><a class="github-button" href="https://github.com/githubsaturn/captainduckduck" data-icon="octicon-star" data-count-href="/githubsaturn/captainduckduck/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2019 githubsaturn</section><script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-121064489-1"></script><script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', 'UA-121064489-1');
|
||
</script></footer></div></body></html> |