CINXE.COM
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="generator" content="Gatsby 5.10.0"/><meta data-react-helmet="true" name="description" content="farmOS is a free and open source web-based application for farm management, planning, and record keeping."/><meta data-react-helmet="true" name="keywords" content="agriculture, technology, software, data, open source, farming, Drupal"/><meta data-react-helmet="true" name="image" content="https://farmos.org/images/farmOS-logo.png"/><meta data-react-helmet="true" property="og:url" content="https://farmos.org/hosting/install/"/><meta data-react-helmet="true" property="og:title" content="Installing farmOS"/><meta data-react-helmet="true" property="og:description" content="farmOS is a free and open source web-based application for farm management, planning, and record keeping."/><meta data-react-helmet="true" property="og:image" content="https://farmos.org/images/farmOS-logo.png"/><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"/><meta data-react-helmet="true" name="twitter:creator" content="@farmOSorg"/><meta data-react-helmet="true" name="twitter:title" content="Installing farmOS"/><meta data-react-helmet="true" name="twitter:description" content="farmOS is a free and open source web-based application for farm management, planning, and record keeping."/><meta data-react-helmet="true" name="twitter:image" content="https://farmos.org/images/farmOS-logo.png"/><style data-href="/styles.b3622f1573c9b5a13a23.css" data-identity="gatsby-global-css">code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#000;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#b3d4fc;text-shadow:none}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:hsla(0,0%,100%,.5);color:#9a6e3a}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}</style><style data-emotion="mui-global 0"></style><style data-emotion="mui-global 1sqripj">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:rgba(0, 0, 0, 0.87);font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;background-color:#fff;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#fff;}html{height:100%;overflow-x:hidden;}body{height:100%;background-color:#fafafa;}#___gatsby,#gatsby-focus-wrapper{all:inherit;margin-top:0;}[id],[name]{scroll-margin-top:64px;}video{width:100%;height:auto;}a{-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion="mui 1lp4rn5 1qsxih2 i6s8oy 43et34 vubbuv 1anx036 1q5dumb 9l3uo3 76xi3e 1v2gfp5">.mui-1lp4rn5{background-color:#fff;color:rgba(0, 0, 0, 0.87);-webkit-transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:fixed;z-index:1100;top:0;left:auto;right:0;background-color:#336633;color:#fff;}@media print{.mui-1lp4rn5{position:absolute;}}.mui-1qsxih2{width:100%;margin-left:auto;box-sizing:border-box;margin-right:auto;display:block;padding-left:16px;padding-right:16px;}@media (min-width:600px){.mui-1qsxih2{padding-left:24px;padding-right:24px;}}@media (min-width:1200px){.mui-1qsxih2{max-width:1200px;}}.mui-i6s8oy{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:16px;padding-right:16px;min-height:56px;}@media (min-width:600px){.mui-i6s8oy{padding-left:24px;padding-right:24px;}}@media (min-width:0px){@media (orientation: landscape){.mui-i6s8oy{min-height:48px;}}}@media (min-width:600px){.mui-i6s8oy{min-height:64px;}}.mui-43et34{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;overflow:visible;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;margin-left:-12px;color:inherit;}.mui-43et34::-moz-focus-inner{border-style:none;}.mui-43et34.Mui-disabled{pointer-events:none;cursor:default;}@media print{.mui-43et34{-webkit-print-color-adjust:exact;color-adjust:exact;}}.mui-43et34:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.mui-43et34:hover{background-color:transparent;}}.mui-43et34.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}@media (min-width:0px){.mui-43et34{display:block;}}@media (min-width:1200px){.mui-43et34{display:none;}}.mui-vubbuv{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;fill:currentColor;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-size:1.5rem;}.mui-1anx036{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:1.25rem;line-height:1.6;letter-spacing:0.0075em;}.mui-1q5dumb{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:0.9375rem;line-height:1.75;letter-spacing:0.02857em;text-transform:uppercase;min-width:64px;padding:7px 21px;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border:1px solid rgba(51, 102, 51, 0.5);color:#336633;}.mui-1q5dumb::-moz-focus-inner{border-style:none;}.mui-1q5dumb.Mui-disabled{pointer-events:none;cursor:default;}@media print{.mui-1q5dumb{-webkit-print-color-adjust:exact;color-adjust:exact;}}.mui-1q5dumb:hover{-webkit-text-decoration:none;text-decoration:none;background-color:rgba(51, 102, 51, 0.04);border:1px solid #336633;}@media (hover: none){.mui-1q5dumb:hover{background-color:transparent;}}.mui-1q5dumb.Mui-disabled{color:rgba(0, 0, 0, 0.26);border:1px solid rgba(0, 0, 0, 0.12);}.mui-9l3uo3{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;}.mui-76xi3e{width:100%;margin-left:auto;box-sizing:border-box;margin-right:auto;display:block;padding-left:16px;padding-right:16px;}@media (min-width:600px){.mui-76xi3e{padding-left:24px;padding-right:24px;}}@media (min-width:1200px){.mui-76xi3e{max-width:1200px;}}@media (min-width:0px){.mui-76xi3e{display:none;}}@media (min-width:900px){.mui-76xi3e{display:block;}}.mui-1v2gfp5{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:0.75rem;line-height:1.66;letter-spacing:0.03333em;}</style><link rel="sitemap" type="application/xml" href="/sitemap-index.xml"/><link rel="preconnect" href="https://www.google-analytics.com"/><link rel="dns-prefetch" href="https://www.google-analytics.com"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/robotomono/v23/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnANW6Cpk.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_gPq_ROW4.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2"/><link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2_ROW4.woff2"/><style>@font-face{font-display:swap;font-family:Roboto;font-style:italic;font-weight:400;src:url(/static/webfonts/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/webfonts/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto;font-style:italic;font-weight:400;src:url(/static/webfonts/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzQ.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc-.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/webfonts/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxM.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/webfonts/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc-.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(/static/webfonts/s/robotomono/v23/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnANW6Cpk.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:300;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_gPq_ROW4.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:700;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2_ROW4.woff2) format("woff2")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(/static/webfonts/s/robotomono/v23/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnANW6Cp8.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:300;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_gPq_ROW-.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW-.woff) format("woff")}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:700;src:url(/static/webfonts/s/robotomono/v23/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2_ROW-.woff) format("woff")}</style><style>.gatsby-image-wrapper{position:relative;overflow:hidden}.gatsby-image-wrapper picture.object-fit-polyfill{position:static!important}.gatsby-image-wrapper img{bottom:0;height:100%;left:0;margin:0;max-width:none;padding:0;position:absolute;right:0;top:0;width:100%;object-fit:cover}.gatsby-image-wrapper [data-main-image]{opacity:0;transform:translateZ(0);transition:opacity .25s linear;will-change:opacity}.gatsby-image-wrapper-constrained{display:inline-block;vertical-align:top}</style><noscript><style>.gatsby-image-wrapper noscript [data-main-image]{opacity:1!important}.gatsby-image-wrapper [data-placeholder-image]{opacity:0!important}</style></noscript><script type="module">const e="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;e&&document.body.addEventListener("load",(function(e){const t=e.target;if(void 0===t.dataset.mainImage)return;if(void 0===t.dataset.gatsbyImageSsr)return;let a=null,n=t;for(;null===a&&n;)void 0!==n.parentNode.dataset.gatsbyImageWrapper&&(a=n.parentNode),n=n.parentNode;const o=a.querySelector("[data-placeholder-image]"),r=new Image;r.src=t.currentSrc,r.decode().catch((()=>{})).then((()=>{t.style.opacity=1,o&&(o.style.opacity=0,o.style.transition="opacity 500ms linear")}))}),!0);</script><title data-react-helmet="true">Installing farmOS | farmOS</title><link rel="icon" href="/favicon-32x32.png?v=150360eec5470ba3f9649b7f150c9e06" type="image/png"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="anonymous"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=150360eec5470ba3f9649b7f150c9e06"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=150360eec5470ba3f9649b7f150c9e06"/><style type="text/css"> .anchor.before { position: absolute; top: 0; left: 0; transform: translateX(-100%); padding-right: 4px; } .anchor.after { display: inline-block; padding-left: 4px; } h1 .anchor svg, h2 .anchor svg, h3 .anchor svg, h4 .anchor svg, h5 .anchor svg, h6 .anchor svg { visibility: hidden; } h1:hover .anchor svg, h2:hover .anchor svg, h3:hover .anchor svg, h4:hover .anchor svg, h5:hover .anchor svg, h6:hover .anchor svg, h1 .anchor:focus svg, h2 .anchor:focus svg, h3 .anchor:focus svg, h4 .anchor:focus svg, h5 .anchor:focus svg, h6 .anchor:focus svg { visibility: visible; } </style><script> document.addEventListener("DOMContentLoaded", function(event) { var hash = window.decodeURI(location.hash.replace('#', '')) if (hash !== '') { var element = document.getElementById(hash) if (element) { var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop var clientTop = document.documentElement.clientTop || document.body.clientTop || 0 var offset = element.getBoundingClientRect().top + scrollTop - clientTop // Wait for the browser to finish rendering before scrolling. setTimeout((function() { window.scrollTo(0, offset - 0) }), 0) } } }) </script></head><body><div id="___gatsby"><div class="tss-1pf6ksb-layoutContainer MuiBox-root mui-0"><header class="MuiPaper-root MuiPaper-elevation MuiPaper-elevation4 MuiAppBar-root MuiAppBar-colorPrimary MuiAppBar-positionFixed mui-fixed mui-1lp4rn5"><div class="MuiContainer-root MuiContainer-maxWidthLg tss-1oojoi4-toolbarContainer mui-1qsxih2"><div class="MuiToolbar-root MuiToolbar-gutters MuiToolbar-regular mui-i6s8oy"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorInherit MuiIconButton-edgeStart MuiIconButton-sizeMedium tss-kpfml4-menuButton mui-43et34" tabindex="0" type="button" aria-label="open drawer"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-vubbuv" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MenuIcon"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path></svg></button><h6 class="MuiTypography-root MuiTypography-h6 mui-1anx036" style="flex:1"><a aria-current="page" class="" href="/">farmOS</a></h6><a class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeLarge MuiButton-outlinedSizeLarge MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeLarge MuiButton-outlinedSizeLarge tss-111xuox-demoButton mui-1q5dumb" tabindex="0" href="https://farmos-demo.rootedsolutions.io" target="_blank">Demo farmOS</a></div></div></header><div class="MuiContainer-root MuiContainer-maxWidthLg tss-12yrz91-mainContainer mui-1qsxih2"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><main class="MuiBox-root mui-0"><span class="MuiTypography-root MuiTypography-body1 tss-cjqj4o-markdown mui-9l3uo3"><h1 id="installing-farmos" style="position:relative;"><a href="#installing-farmos" aria-label="installing farmos permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Installing farmOS</h1> <p>These instructions are for installing farmOS on a live production server. For local development/testing, please refer to the <a href="/development/environment">development environment</a> documentation.</p> <h2 id="server-requirements" style="position:relative;"><a href="#server-requirements" aria-label="server requirements permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Server requirements</h2> <p>farmOS is based on <a href="https://drupal.org">Drupal</a>, and therefore shares many of the same <a href="https://drupal.org/docs/system-requirements">requirements</a>.</p> <h3 id="web-server" style="position:relative;"><a href="#web-server" aria-label="web server permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Web server</h3> <p>In addition to Drupal's basic requirements, farmOS has the following server dependencies. The <a href="#farmos-in-docker">farmOS Docker images</a> include these.</p> <ul> <li><strong>PHP 8+</strong></li> <li><strong>PHP configuration</strong> - The following PHP settings are recommended: <ul> <li><code class="language-text">memory_limit=256M</code></li> <li><code class="language-text">max_execution_time=240</code></li> <li><code class="language-text">max_input_time=240</code></li> <li><code class="language-text">max_input_vars=5000</code></li> <li><code class="language-text">realpath_cache_size=4096K</code></li> <li><code class="language-text">realpath_cache_ttl=3600</code></li> </ul> </li> <li><strong><a href="https://www.php.net/manual/en/book.bc.php">PHP BCMath extension</a></strong> and <strong><a href="https://trac.osgeo.org/geos">GEOS</a></strong> are required for accurate geometric calculations. farmOS can be installed without these, but production usage without them is strongly discouraged.</li> </ul> <h3 id="database-server" style="position:relative;"><a href="#database-server" aria-label="database server permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Database server</h3> <p>A database server needs to be provisioned that farmOS can connect to. PostgreSQL is recommended. MySQL/MariaDB and SQLite are also supported.</p> <p>This can be installed on the same server as farmOS (either directly or in a Docker container), or it can be on a separate server.</p> <p>If PostgreSQL is used, it must be version 12 or higher, and the <code class="language-text">pg_trgm</code> extension must be installed and enabled on the farmOS database. On PostgreSQL 13+ this will be enabled automatically by farmOS. On PostgreSQL 12, the following SQL query must be run on the farmOS database by a PostgreSQL superuser to enable the extension:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">CREATE EXTENSION pg_trgm;</code></pre></div> <h3 id="ssl" style="position:relative;"><a href="#ssl" aria-label="ssl permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>SSL</h3> <p>Although not strictly a requirement, some features (like the "Geolocate" button on maps) will only work over a secure connection. <a href="https://farmOS.app">Field Kit</a> requires SSL in order to connect to it. SSL is also recommended if you are streaming sensor data into farmOS, to keep your sensor's private key a secret.</p> <p>A common strategy is to use <a href="https://nginx.org">Nginx</a> as a reverse proxy with SSL termination, which listens on port 443 and forwards to farmOS on port 80. <a href="https://letsencrypt.org">Let's Encrypt</a> is a good option for free SSL certificate issuance, and renewal can be automated via cron.</p> <p>These resources may be helpful:</p> <ul> <li><a href="https://www.drupal.org/https-information">Drupal HTTPS Information</a></li> <li><a href="https://farmos.discourse.group/t/running-behind-reverse-proxy/108">Reverse Proxy Forum Post</a> - Includes links to related GitHub issues and examples of how others have configured reverse proxies serving HTTPS.</li> <li><a href="/development/environment/https">Local HTTPS</a> - Documentation for running an Nginx reverse proxy with self-signed certificates for local farmOS development with HTTPS.</li> </ul> <h3 id="satellite-map-layers" style="position:relative;"><a href="#satellite-map-layers" aria-label="satellite map layers permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Satellite map layers</h3> <p>farmOS includes an optional <a href="https://www.mapbox.com">Mapbox</a> module that can be enabled to add satellite imagery layers to the map. A Mapbox API key is required. For more information, see Mapbox's official documentation: <a href="https://docs.mapbox.com/help/how-mapbox-works/access-tokens">Access tokens</a>. Enable the Mapbox module at Setup > Modules, and then add the API key at Setup > Settings > Map > Mapbox.</p> <h2 id="farmos-codebase" style="position:relative;"><a href="#farmos-codebase" aria-label="farmos codebase permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>farmOS Codebase</h2> <p>There are two supported approaches to deploying the farmOS codebase:</p> <ol> <li>Using <a href="https://docker.com">Docker</a> images.</li> <li>Using packaged releases.</li> </ol> <p>Docker is the recommended method of hosting farmOS because it encapsulates the server level dependencies that farmOS needs.</p> <p>If you need to build a more customized farmOS codebase, including modules provided by the community, or custom modules written by yourself, see <a href="/hosting/composer">Building farmOS with Composer</a>.</p> <h3 id="farmos-in-docker" style="position:relative;"><a href="#farmos-in-docker" aria-label="farmos in docker permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>farmOS in Docker</h3> <p>Official farmOS Docker images are available on Docker Hub: <a href="https://hub.docker.com/r/farmos/farmos">https://hub.docker.com/r/farmos/farmos</a></p> <p>This allows farmOS to be run in a Docker container with:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">docker pull farmos/farmos:3.x.y docker run --rm -p 80:80 -v "${PWD}/sites:/opt/drupal/web/sites" farmos/farmos:3.x.y</code></pre></div> <p>Replace <code class="language-text">3.x.y</code> with the desired version. Find the latest farmOS version on the <a href="https://github.com/farmOS/farmOS/releases">GitHub release page</a>. Using the <code class="language-text">latest</code> Docker tag is not recommended, because updates require manual steps. See <a href="/hosting/update">Updating farmOS</a> for more info.</p> <p>This will pull the farmOS Docker image, provision a farmOS web server container listening on port 80, and bind-mount a <code class="language-text">sites</code> directory into the container for persistence of settings and uploaded files.</p> <h4 id="docker-compose" style="position:relative;"><a href="#docker-compose" aria-label="docker compose permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Docker Compose</h4> <p><a href="https://docs.docker.com/compose">Docker Compose</a> can be used to encapsulate these decisions.</p> <p>An example <code class="language-text">docker-compose.production.yml</code> configuration file is provided in the farmOS repository's <code class="language-text">docker</code> directory, with an accompanying <code class="language-text">README.md</code>. Copy this to a file named <code class="language-text">docker-compose.yml</code> in the directory you would like to install farmOS, update the <code class="language-text">farmos/farmos:x.y.z</code> version reference, and run:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">docker compose up -d</code></pre></div> <h4 id="persistence" style="position:relative;"><a href="#persistence" aria-label="persistence permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Persistence</h4> <p>All site-specific settings and user-uploaded files are stored in <code class="language-text">/opt/drupal/web/sites</code> inside the container, so it is important that the contents of this directory be persisted outside of the container. Bind-mounting a directory from the host into the container is the recommended way to achieve this.</p> <p>The <code class="language-text">docker run</code> command above does this, as well as the example <code class="language-text">docker-compose.yml</code> provided in the farmOS repository's <code class="language-text">docker</code> directory.</p> <p>If the <code class="language-text">sites</code> directory is not persisted, all settings and files will be lost when the container is destroyed, and you will be prompted to install farmOS again when a new container is started.</p> <h4 id="customizing-php" style="position:relative;"><a href="#customizing-php" aria-label="customizing php permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Customizing PHP</h4> <p>If customizations to PHP's configuration are required, such as increasing the maximum upload size limit, you can bind-mount a custom PHP settings file into the container.</p> <p>Create a file called <code class="language-text">php.ini</code> alongside <code class="language-text">docker-compose.yml</code>:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">upload_max_filesize = 50M post_max_size = 50M</code></pre></div> <p>Bind-mount <code class="language-text">php.ini</code> into the <code class="language-text">www</code> service in your <code class="language-text">docker-compose.yml</code> file:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text"> volumes: ... - './php.ini:/usr/local/etc/php/conf.d/farmos.ini'</code></pre></div> <h3 id="packaged-releases" style="position:relative;"><a href="#packaged-releases" aria-label="packaged releases permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Packaged releases</h3> <p>An alternative to the Docker-based deployment is to install the farmOS codebase directly on the host server using a packaged release tarball, available from GitHub: <a href="https://github.com/farmOS/farmOS/releases">github.com/farmOS/farmOS/releases</a></p> <p>Packaged releases include everything from the <code class="language-text">/opt/drupal</code> directory in the Docker image. This represents the entire farmOS codebase, pre-built with <a href="https://getcomposer.org">Composer</a>.</p> <p>Download and unpack the tarball on your web server, and point the document root at the <code class="language-text">web</code> subdirectory.</p> <h2 id="installing-farmos-1" style="position:relative;"><a href="#installing-farmos-1" aria-label="installing farmos 1 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Installing farmOS</h2> <p>Once you have the farmOS codebase deployed, and a database server provisioned, you can proceed with the web-based farmOS installation. Visit the farmOS server's hostname in your browser and follow the steps to install farmOS and optional modules.</p> <h3 id="file-uploads" style="position:relative;"><a href="#file-uploads" aria-label="file uploads permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>File uploads</h3> <p>In order to upload files, a private filesystem path must be configured in the <code class="language-text">settings.php</code> file after installation is complete.</p> <p>If you are using the official Docker image, and bind-mounting the <code class="language-text">sites</code> directory as a volume, add the following line to <code class="language-text">sites/default/settings.php</code>:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">$settings['file_private_path'] = '/opt/drupal/web/sites/default/private/files';</code></pre></div> <p>Additionally, create the folder <code class="language-text">/opt/drupal/web/sites/default/private/</code>.</p> <p>Set the correct user and permissions:</p> <p>Folder ownership and group should match the web server user. If you are using the farmOS Docker image (running Apache), this will be <code class="language-text">www-data</code>.</p> <p>Folder permissions should be set to <code class="language-text">770</code> or <code class="language-text">drwxrwx---</code>.</p> <p>If you are using a packaged release outside of Docker, replace <code class="language-text">/opt/drupal/web</code> with the path to the webroot directory that contains your <code class="language-text">sites</code> directory.</p> <p>Finally, make sure to clear the caches by visiting Administration > Configuration > Development > Performance and clicking the <code class="language-text">Clear all caches</code> button, or use Drush via the command line: <code class="language-text">drush cr</code>.</p> <h3 id="cron" style="position:relative;"><a href="#cron" aria-label="cron permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Cron</h3> <p>farmOS performs routine tasks via its built-in cron. This includes database cleanup and garbage collection. A cron job must be configured on the host system to trigger this. There are three ways to do this:</p> <p><strong>1. Via the <code class="language-text">drush cron</code> command (recommended)</strong></p> <p>The Drush command-line tool provides a <code class="language-text">cron</code> command for triggering the execution of cron tasks. This can be run via a scheduled system <code class="language-text">crontab</code>. Weekly is enough for most use-cases.</p> <p>The actual <code class="language-text">drush</code> command will vary depending on how/where you have farmOS installed. Drush is located in <code class="language-text">vendor/bin/drush</code> within the farmOS codebase, and may require additional arguments to find your farmOS database correctly. For more information, see the <a href="https://www.drush.org/latest/cron">Drush cron documentation</a>.</p> <p>If you are running farmOS in the official Docker container, your <code class="language-text">crontab</code> will look something like this (replace <code class="language-text">[container-name]</code> with the name of your running farmOS container):</p> <p><code class="language-text">4 0 * * 0 sudo docker exec -it -u www-data [container-name] drush cron > /dev/null</code></p> <p><strong>2. Via the secret cron URL</strong></p> <p>A special URL is available for running cron via an HTTP request. This URL includes a secret key to prevent it from being run by unauthorized requests. To find the secret cron URL, while logged in as a farmOS administrator, go to Administration > Configuration > System > Cron. The URL will look like this:</p> <p><code class="language-text">https://[base-url]/cron/[secret-key]</code></p> <p>Use <code class="language-text">wget</code> in a Linux cron job to request this URL on a schedule. Weekly is enough for most use-cases.</p> <p><code class="language-text">4 0 * * 0 wget -O - -q -t 1 [cron-url] > /dev/null</code></p> <p>The only disadvantage of this approach is it may run into PHP <code class="language-text">memory_limit</code> or <code class="language-text">max_execution_time</code> restrictions, if the cron tasks are particularly long or complex.</p> <p><strong>3. Via the "Automated Cron" module (not recommended)</strong></p> <p>Drupal also includes an "Automated Cron" module, which is disabled by default in farmOS. When enabled, this module will automatically perform cron tasks at the end of normal visitor requests. This option is only recommended if your host system does not have the ability to configure cron jobs. It can cause random requests to farmOS to be very slow, as the cron tasks are tacked onto the normal page loading process.</p></span></main><div class="MuiContainer-root MuiContainer-maxWidthLg tss-1abjw0-mainToC mui-76xi3e"><label class="MuiTypography-root MuiTypography-body1 tss-14ynmsm-title mui-9l3uo3">Installing farmOS</label><div class="tss-smolxg-headings MuiBox-root mui-0"><ul> <li> <p><a href="#installing-farmos">Installing farmOS</a></p> <ul> <li> <p><a href="#server-requirements">Server requirements</a></p> <ul> <li><a href="#web-server">Web server</a></li> <li><a href="#database-server">Database server</a></li> <li><a href="#ssl">SSL</a></li> <li><a href="#satellite-map-layers">Satellite map layers</a></li> </ul> </li> <li> <p><a href="#farmos-codebase">farmOS Codebase</a></p> <ul> <li> <p><a href="#farmos-in-docker">farmOS in Docker</a></p> <ul> <li><a href="#docker-compose">Docker Compose</a></li> <li><a href="#persistence">Persistence</a></li> <li><a href="#customizing-php">Customizing PHP</a></li> </ul> </li> <li> <p><a href="#packaged-releases">Packaged releases</a></p> </li> </ul> </li> <li> <p><a href="#installing-farmos-1">Installing farmOS</a></p> <ul> <li><a href="#file-uploads">File uploads</a></li> <li><a href="#cron">Cron</a></li> </ul> </li> </ul> </li> </ul></div></div></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div><footer class="tss-1xccyd3-footer MuiBox-root mui-0"><div class="MuiContainer-root MuiContainer-maxWidthLg tss-i0924k-copyright mui-1qsxih2"><span class="MuiTypography-root MuiTypography-caption mui-1v2gfp5">This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>. farmOS is a <a href="/community/trademark">registered trademark</a> of <a href="http://mstenta.net">Michael Stenta</a>.</span></div></footer></div></div><script> function gaOptout(){document.cookie=disableStr+'=true; expires=Thu, 31 Dec 2099 23:59:59 UTC;path=/',window[disableStr]=!0}var gaProperty='UA-56974603-1',disableStr='ga-disable-'+gaProperty;document.cookie.indexOf(disableStr+'=true')>-1&&(window[disableStr]=!0); if(!(parseInt(navigator.doNotTrack) === 1 || parseInt(window.doNotTrack) === 1 || parseInt(navigator.msDoNotTrack) === 1 || navigator.doNotTrack === "yes")) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); } if (typeof ga === "function") { ga('create', 'UA-56974603-1', 'auto', {}); ga('set', 'anonymizeIp', true); }</script><script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/hosting/install/";/*]]>*/</script><!-- slice-start id="_gatsby-scripts-1" --> <script id="gatsby-chunk-mapping" > window.___chunkMapping="{\"app\":[\"/app-51a601761b0e1f62435d.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-48bd4704817f86c3ae3f.js\"],\"component---src-pages-blog-js\":[\"/component---src-pages-blog-js-4caff98e930d72634c50.js\"],\"component---src-pages-community-monthly-call-join-js\":[\"/component---src-pages-community-monthly-call-join-js-ebb1a946ac6f6d598701.js\"],\"component---src-pages-home-js\":[\"/component---src-pages-home-js-a8a6bf9f0c6f1e9f49ca.js\"],\"component---src-templates-blog-js\":[\"/component---src-templates-blog-js-d07568132d9b0d5764c3.js\"],\"component---src-templates-docs-js\":[\"/component---src-templates-docs-js-567344475a717cc03e79.js\"]}"; </script> <script>window.___webpackCompilationHash="f98c42d81280eb4248d6";</script><script src="/webpack-runtime-b1f6124e4314446c8b5a.js" async></script><script src="/framework-0f09bd0071a391c3dc9e.js" async></script><script src="/app-51a601761b0e1f62435d.js" async></script><!-- slice-end id="_gatsby-scripts-1" --></body></html>