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/development/environment/"/><meta data-react-helmet="true" property="og:title" content="Getting started"/><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="Getting started"/><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">Getting started | 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="getting-started" style="position:relative;"><a href="#getting-started" aria-label="getting started 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>Getting started</h1> <p>Follow these instructions to set up a local farmOS development environment.</p> <p>The only requirement is <a href="https://www.docker.com">Docker</a>.</p> <h2 id="1-set-up-docker-containers" style="position:relative;"><a href="#1-set-up-docker-containers" aria-label="1 set up docker containers 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>1. Set up Docker containers</h2> <p>Run the following commands to create a farmOS directory and set up Docker containers for farmOS and PostgreSQL:</p> <div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">mkdir farmOS && cd farmOS curl https://raw.githubusercontent.com/farmOS/farmOS/3.x/docker/docker-compose.development.yml -o docker-compose.yml docker compose up -d</code></pre></div> <h2 id="2-install-farmos" style="position:relative;"><a href="#2-install-farmos" aria-label="2 install 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>2. Install farmOS</h2> <p>Open <code class="language-text">http://localhost</code> in a browser and install farmOS with the following database credentials:</p> <ul> <li>Database type: <strong>PostgreSQL</strong></li> <li>Database name: <code class="language-text">farm</code></li> <li>Database user: <code class="language-text">farm</code></li> <li>Database password: <code class="language-text">farm</code></li> <li>Advanced options > Host: <code class="language-text">db</code></li> </ul> <h2 id="3-develop" style="position:relative;"><a href="#3-develop" aria-label="3 develop 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>3. Develop</h2> <p>After starting the Docker containers, the root <code class="language-text">farmOS</code> directory will contain two new subdirectories: <code class="language-text">www</code> and <code class="language-text">db</code>.</p> <p>The <code class="language-text">www</code> directory contains the fully built farmOS codebase, which is bind-mounted into the <code class="language-text">www</code> container's <code class="language-text">/opt/drupal</code> directory. The <code class="language-text">www/web</code> directory is used as the Apache webroot. Loading the <code class="language-text">www</code> directory in your favorite PHP IDE will provide easy code access to the full Symfony + Drupal + farmOS stack.</p> <p>The <code class="language-text">db</code> directory contains the PostgreSQL database files, which is bind-mounted into the <code class="language-text">db</code> container's <code class="language-text">/var/lib/postgresql/data</code> directory. With the containers stopped, this directory can be backed up (eg: via tarball) to create snapshots for easy rollback during development.</p> <h2 id="optional" style="position:relative;"><a href="#optional" aria-label="optional 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>Optional</h2> <h3 id="configure-private-filesystem" style="position:relative;"><a href="#configure-private-filesystem" aria-label="configure private filesystem 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>Configure private filesystem</h3> <p>In order to upload files, a private file path must be configured. The following line must be added to <code class="language-text">www/web/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>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="configure-debugger" style="position:relative;"><a href="#configure-debugger" aria-label="configure debugger 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>Configure debugger</h3> <p>See <a href="/development/environment/debug">Debugging</a>.</p> <h3 id="enable-https" style="position:relative;"><a href="#enable-https" aria-label="enable https 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>Enable HTTPS</h3> <p>See <a href="/development/environment/https">HTTPS</a>.</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">Getting started</label><div class="tss-smolxg-headings MuiBox-root mui-0"><ul> <li> <p><a href="#getting-started">Getting started</a></p> <ul> <li> <p><a href="#1-set-up-docker-containers">1. Set up Docker containers</a></p> </li> <li> <p><a href="#2-install-farmos">2. Install farmOS</a></p> </li> <li> <p><a href="#3-develop">3. Develop</a></p> </li> <li> <p><a href="#optional">Optional</a></p> <ul> <li><a href="#configure-private-filesystem">Configure private filesystem</a></li> <li><a href="#configure-debugger">Configure debugger</a></li> <li><a href="#enable-https">Enable HTTPS</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="/development/environment/";/*]]>*/</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>