github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/docs/guide/deployment.html (about)

     1  <!DOCTYPE html>
     2  <html lang="en-US">
     3    <head>
     4      <meta charset="utf-8">
     5      <meta name="viewport" content="width=device-width,initial-scale=1">
     6      <title>Deployment | Goyave</title>
     7      <meta name="generator" content="VuePress 1.5.3">
     8      <link rel="icon" type="image/png" sizes="16x16" href="/goyave/goyave_16.png">
     9      <link rel="icon" type="image/png" sizes="32x32" href="/goyave/goyave_32.png">
    10      <link rel="icon" type="image/png" sizes="64x64" href="/goyave/goyave_64.png">
    11      <link rel="icon" type="image/png" sizes="128x128" href="/goyave/goyave_128.png">
    12      <link rel="icon" type="image/png" sizes="256x256" href="/goyave/goyave_256.png">
    13      <link rel="icon" type="image/png" sizes="512x512" href="/goyave/goyave_512.png">
    14      <meta name="description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    15      <meta name="og:title" content="Deployment - Goyave">
    16      <meta name="twitter:title" content="Deployment - Goyave">
    17      <meta name="title" content="Deployment - Goyave">
    18      <meta property="twitter:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    19      <meta property="twitter:image:src" content="https://system-glitch.github.io/goyave/goyave_banner.png">
    20      <meta property="twitter:card" content="summary_large_image">
    21      <meta property="og:type" content="website">
    22      <meta property="og:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    23      <meta property="og:image" content="https://system-glitch.github.io/goyave/goyave_banner.png">
    24      <meta property="og:site_name" content="Goyave">
    25      <link rel="preload" href="/goyave/assets/css/0.styles.589fd562.css" as="style"><link rel="preload" href="/goyave/assets/js/app.092490a7.js" as="script"><link rel="preload" href="/goyave/assets/js/4.75a9cc68.js" as="script"><link rel="preload" href="/goyave/assets/js/1.121dd9ed.js" as="script"><link rel="preload" href="/goyave/assets/js/27.9c5b36f2.js" as="script"><link rel="prefetch" href="/goyave/assets/js/10.2f07bbf5.js"><link rel="prefetch" href="/goyave/assets/js/11.2d66fdef.js"><link rel="prefetch" href="/goyave/assets/js/12.63171b15.js"><link rel="prefetch" href="/goyave/assets/js/13.770050f3.js"><link rel="prefetch" href="/goyave/assets/js/14.b933d8cf.js"><link rel="prefetch" href="/goyave/assets/js/15.36df2a66.js"><link rel="prefetch" href="/goyave/assets/js/16.ed66719e.js"><link rel="prefetch" href="/goyave/assets/js/17.7bef5f05.js"><link rel="prefetch" href="/goyave/assets/js/18.470b55ed.js"><link rel="prefetch" href="/goyave/assets/js/19.90e0dab8.js"><link rel="prefetch" href="/goyave/assets/js/20.3a300ca3.js"><link rel="prefetch" href="/goyave/assets/js/21.c3fd6053.js"><link rel="prefetch" href="/goyave/assets/js/22.d5569617.js"><link rel="prefetch" href="/goyave/assets/js/23.931b2034.js"><link rel="prefetch" href="/goyave/assets/js/24.1a4755e7.js"><link rel="prefetch" href="/goyave/assets/js/25.0d463913.js"><link rel="prefetch" href="/goyave/assets/js/26.3c173a7a.js"><link rel="prefetch" href="/goyave/assets/js/28.41e055b7.js"><link rel="prefetch" href="/goyave/assets/js/29.b87adf4a.js"><link rel="prefetch" href="/goyave/assets/js/3.ef71e77d.js"><link rel="prefetch" href="/goyave/assets/js/5.c83f1192.js"><link rel="prefetch" href="/goyave/assets/js/6.2336bf0c.js"><link rel="prefetch" href="/goyave/assets/js/7.d60e55c1.js"><link rel="prefetch" href="/goyave/assets/js/8.2ee33a42.js"><link rel="prefetch" href="/goyave/assets/js/9.8e043d60.js">
    26      <link rel="stylesheet" href="/goyave/assets/css/0.styles.589fd562.css">
    27    </head>
    28    <body>
    29      <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="/goyave/" class="home-link router-link-active"><img src="/goyave/goyave_64.png" alt="Goyave" class="logo"> <span class="site-name can-hide">Goyave</span></a> <div class="links"><div class="user-settings"><a title="Dark theme" href="#" class="settings-button"><svg aria-hidden="true" data-prefix="fas" data-icon="cog" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="svg-inline--fa fa-cog fa-w-16 settings-icon"><path fill="currentColor" d="M8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zM8 15c-3.9 0-7-3.1-7-7 0-2.4 1.2-4.6 3.2-5.9-0.1 0.6-0.2 1.3-0.2 1.9 0 4.9 4 8.9 8.9 9-1.3 1.3-3 2-4.9 2z"></path></svg></a></div> <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="/goyave/guide/" class="nav-link router-link-active">
    30    Guide
    31  </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external">
    32    pkg.go.dev
    33    <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/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link">
    34      GitHub
    35      <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="/goyave/guide/" class="nav-link router-link-active">
    36    Guide
    37  </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external">
    38    pkg.go.dev
    39    <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/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link">
    40      GitHub
    41      <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><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>Guide</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/goyave/guide/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/goyave/guide/changelog.html" class="sidebar-link">Changelog</a></li><li><a href="/goyave/guide/installation.html" class="sidebar-link">Installation</a></li><li><a href="/goyave/guide/upgrade-guide.html" class="sidebar-link">Upgrade Guide</a></li><li><a href="/goyave/guide/configuration.html" class="sidebar-link">Configuration</a></li><li><a href="/goyave/guide/architecture-concepts.html" class="sidebar-link">Architecture Concepts</a></li><li><a href="/goyave/guide/deployment.html" aria-current="page" class="active sidebar-link">Deployment</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/goyave/guide/deployment.html#introduction" class="sidebar-link">Introduction</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/deployment.html#application-configuration" class="sidebar-link">Application configuration</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/deployment.html#build" class="sidebar-link">Build</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/deployment.html#deamon" class="sidebar-link">Deamon</a></li></ul></li><li><a href="/goyave/guide/contribution-guide.html" class="sidebar-link">Contributing to Goyave</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>The Basics</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Advanced</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="deployment"><a href="#deployment" class="header-anchor">#</a> Deployment</h1> <p></p><div class="table-of-contents"><ul><li><a href="#introduction">Introduction</a></li><li><a href="#application-configuration">Application configuration</a></li><li><a href="#build">Build</a></li><li><a href="#deamon">Deamon</a><ul><li><a href="#systemd">Systemd</a></li></ul></li></ul></div><p></p> <h2 id="introduction"><a href="#introduction" class="header-anchor">#</a> Introduction</h2> <p>There are some important details to think about before deploying your Goyave application to production. We are going to cover them in this section of the guide, and make sure your applications are deployed properly.</p> <h2 id="application-configuration"><a href="#application-configuration" class="header-anchor">#</a> Application configuration</h2> <p>Be sure to deploy your application with a <code>config.production.json</code> config file containing the correct values for your production environment and <strong>set the <code>GOYAVE_ENV</code> environment variable to <code>production</code>.</strong></p> <ol><li>Ensure that the <code>app.environment</code> entry is <code>production</code>.</li> <li>The <code>server.host</code> entry should be <code>0.0.0.0</code> if you want to open access to your service from anywhere. If you're using Apache or Nginx as a proxy on the same machine, keep it at <code>127.0.0.1</code> so the server will only be accessible through the proxy.</li> <li>Change the <code>server.domain</code> entry to your domain name, if you use one.</li> <li>The <code>server.port</code> and <code>server.httpsPort</code> will very likely require a change. Most of the time, you need <code>80</code> and <code>443</code> respectively.</li> <li>If you use <code>https</code>, be sure to provide the paths to your <code>server.tls.cert</code> and <code>server.tls.key</code>. Learn more <a href="/goyave/guide/configuration.html#setting-up-https">here</a>.</li> <li><code>server.debug</code> <strong>must</strong> be set do <code>false</code>. You don't want anyone to get important information about your internal errors and therefore your code when an error occurs.</li> <li>Change your database connection credentials. <code>database.autoMigrate</code> should be set to <code>false</code>.</li></ol> <h2 id="build"><a href="#build" class="header-anchor">#</a> Build</h2> <p>Of course, don't run your application with <code>go run</code> in production. Build your application using <code>go build</code> and deploy the executable, alongside the config files and resources directory.</p> <p>The following Dockerfile is an example of a goyave application called <code>docker-goyave</code>:</p> <div class="language-docker extra-class"><pre class="language-docker"><code><span class="token keyword">FROM</span> golang<span class="token punctuation">:</span>alpine as builder
    42  
    43  <span class="token keyword">WORKDIR</span> /app
    44  
    45  <span class="token keyword">COPY</span> . .
    46  
    47  <span class="token keyword">RUN</span> go build <span class="token punctuation">-</span>ldflags <span class="token string">&quot;-w -s&quot;</span>
    48  
    49  <span class="token keyword">FROM</span> alpine<span class="token punctuation">:</span>3.9
    50  
    51  <span class="token keyword">WORKDIR</span> /app
    52  
    53  <span class="token keyword">COPY</span> <span class="token punctuation">-</span><span class="token punctuation">-</span>from=builder /app/docker<span class="token punctuation">-</span>goyave ./docker<span class="token punctuation">-</span>goyave
    54  <span class="token keyword">COPY</span> resources /app/resources
    55  <span class="token keyword">COPY</span> config.production.json ./config.production.json
    56  
    57  <span class="token keyword">EXPOSE</span> 80
    58  <span class="token keyword">ENV</span> GOYAVE_ENV=production
    59  
    60  <span class="token keyword">ENTRYPOINT</span> <span class="token punctuation">[</span> <span class="token string">&quot;./docker-goyave&quot;</span> <span class="token punctuation">]</span>
    61  </code></pre></div><h2 id="deamon"><a href="#deamon" class="header-anchor">#</a> Deamon</h2> <p>Goyave applications are standalone and don't require any web server (such as Apache or Nginx) to function. However, this also means that you will need some additional installation steps on your production server.</p> <p>When running a web service, it is important that it stays online. Creating a <strong>deamon</strong> is necessary so your server can run in the background, have the correct filesystem permissions, and restart automatically after a crash or a reboot.</p> <p>You can achieve this with any supervisor program, but in this guide, we will use systemd as it's the most common one.</p> <h3 id="systemd"><a href="#systemd" class="header-anchor">#</a> Systemd</h3> <p>First, we need to create a user and its group for our application:</p> <div class="language- extra-class"><pre class="language-text"><code>sudo addgroup goyave
    62  sudo useradd -r -s /bin/false goyave
    63  sudo usermod -a -G goyave goyave
    64  </code></pre></div><p>You may use the following systemd unit file to deploy your Goyave application:</p> <p><code>/etc/systemd/system/my-goyave-application.service</code>:</p> <div class="language- extra-class"><pre class="language-text"><code>[Unit]
    65  Description=Goyave application deamon
    66  
    67  # If you are using a database, mysql for example, make sure the application
    68  # service starts AFTER the database service.
    69  # After=mysqld.service
    70  After=network.target
    71  StartLimitIntervalSec=0
    72  
    73  [Service]
    74  Environment=GOYAVE_ENV=production
    75  WorkingDirectory=/path/to/goyave-application
    76  ExecStart=/path/to/goyave-application/executable
    77  
    78  # Process management
    79  ####################
    80  
    81  Type=simple
    82  
    83  # Can be changed to &quot;on-failure&quot;
    84  Restart=always
    85  RestartSec=1
    86  TimeoutStopSec=600
    87  
    88  # Run as goyave:goyave
    89  User=goyave
    90  Group=goyave
    91  
    92  # Hardening measures
    93  ####################
    94  
    95  # Provide a private /tmp and /var/tmp.
    96  PrivateTmp=true
    97  
    98  # Mount /usr, /boot/ and /etc read-only for the process.
    99  ProtectSystem=full
   100  
   101  # Deny access to /home, /root and /run/user
   102  ProtectHome=true
   103  
   104  # Disallow the process and all of its children to gain
   105  # new privileges through execve().
   106  NoNewPrivileges=true
   107  
   108  # Use a new /dev namespace only populated with API pseudo devices
   109  # such as /dev/null, /dev/zero and /dev/random.
   110  PrivateDevices=true
   111  
   112  # Deny the creation of writable and executable memory mappings.
   113  MemoryDenyWriteExecute=true
   114  
   115  [Install]
   116  WantedBy=multi-user.target
   117  </code></pre></div><div class="custom-block warning"><p class="custom-block-title">WARNING</p> <p>Replace <code>my-goyave-application</code> with the name of your application and <code>/path/to/goyave-application</code> with the <strong>absolute</strong> path to your application. This is important to have unique application names in case you run multiple goyave applications on the same server. You should also create a separate user and group for each application.</p></div> <p>Now let's run the service and enable it on system startup:</p> <div class="language- extra-class"><pre class="language-text"><code>sudo systemctl start my-goyave-application
   118  sudo systemctl enable my-goyave-application
   119  </code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/System-Glitch/goyave/edit/master/docs_src/src/guide/deployment.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <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></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
   120        ←
   121        <a href="/goyave/guide/architecture-concepts.html" class="prev">
   122          Architecture Concepts
   123        </a></span> <span class="next"><a href="/goyave/guide/contribution-guide.html">
   124          Contributing to Goyave
   125        </a>
   126        →
   127      </span></p></div> </main></div><div class="global-ui"><!----></div></div>
   128      <script src="/goyave/assets/js/app.092490a7.js" defer></script><script src="/goyave/assets/js/4.75a9cc68.js" defer></script><script src="/goyave/assets/js/1.121dd9ed.js" defer></script><script src="/goyave/assets/js/27.9c5b36f2.js" defer></script>
   129    </body>
   130  </html>