1"use strict";(self.webpackChunkphpvms_docs=self.webpackChunkphpvms_docs||[]).push([[2857],{85101(e,s,t){t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"phpvms runs on PHP 8.2+ with MySQL or MariaDB. Follow these five steps and","source":"@site/docs/getting-started.mdx","sourceDirName":".","slug":"/getting-started","permalink":"/8.x/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/phpvms/docs/tree/master/docs/getting-started.mdx","tags":[],"version":"current","frontMatter":{"id":"getting-started","title":"Getting Started","slug":"/getting-started"},"sidebar":"docs","next":{"title":"What\'s New","permalink":"/8.x/whats-new"}}');var a=t(74848),l=t(28453),r=t(14783);const i={id:"getting-started",title:"Getting Started",slug:"/getting-started"},c=void 0,d={},o=[];function p(e){const s={code:"code",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.p,{children:"phpvms runs on PHP 8.2+ with MySQL or MariaDB. Follow these five steps and\nyou'll have a working virtual airline ready to accept your first pilot."}),"\n",(0,a.jsxs)("div",{className:"lp-page",children:[(0,a.jsx)("section",{className:"lp-section",children:(0,a.jsxs)("div",{className:"lp-steps",children:[(0,a.jsxs)("article",{className:"lp-step",children:[(0,a.jsx)("span",{className:"lp-step-num",children:"01"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"lp-step-title",children:"Download phpvms"}),(0,a.jsx)("div",{className:"lp-step-body",children:(0,a.jsx)("p",{children:(0,a.jsxs)(s.p,{children:["Grab the latest release from GitHub or clone the repo. Drop it\ninto your web root and make the ",(0,a.jsx)("code",{children:"storage/"})," and"," ","\n",(0,a.jsx)("code",{children:"bootstrap/cache/"})," directories writable."]})})}),(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"git clone https://github.com/phpvms/phpvms.git\n"})})]})]}),(0,a.jsxs)("article",{className:"lp-step",children:[(0,a.jsx)("span",{className:"lp-step-num",children:"02"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"lp-step-title",children:"Configure your virtual host"}),(0,a.jsx)("div",{className:"lp-step-body",children:(0,a.jsx)("p",{children:(0,a.jsxs)(s.p,{children:["Point your web server at the ",(0,a.jsx)("code",{children:"public/"})," directory.\nCaddy is recommended, but Apache and nginx configs"," ","\n",(0,a.jsx)("a",{href:"./installation/webserver-config",children:"are documented"})," for\nboth shared hosting and bare VPS setups."]})})}),(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-nginx",children:"yourdomain.com {\n root * /path/to/phpvms/public\n php_fastcgi localhost:9000\n file_server\n}\n"})})]})]}),(0,a.jsxs)("article",{className:"lp-step",children:[(0,a.jsx)("span",{className:"lp-step-num",children:"03"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"lp-step-title",children:"Run the install wizard"}),(0,a.jsx)("div",{className:"lp-step-body",children:(0,a.jsx)("p",{children:(0,a.jsx)(s.p,{children:"Visit your domain in a browser. The web installer walks you\nthrough the database connection, admin account, and initial\nconfiguration."})})}),(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-text",children:"https://your-domain.com/install\n"})})]})]}),(0,a.jsxs)("article",{className:"lp-step",children:[(0,a.jsx)("span",{className:"lp-step-num",children:"04"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"lp-step-title",children:"Set up the cron job"}),(0,a.jsx)("div",{className:"lp-step-body",children:(0,a.jsx)("p",{children:(0,a.jsx)(s.p,{children:"phpvms runs scheduled tasks (PIREP processing, backups, etc.)\nvia a single cron entry that triggers Laravel's scheduler every\nminute."})})}),(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"* * * * * php /path/to/phpvms/artisan schedule:run\n"})})]})]}),(0,a.jsxs)("article",{className:"lp-step",children:[(0,a.jsx)("span",{className:"lp-step-num",children:"05"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"lp-step-title",children:"You're flying"}),(0,a.jsx)("div",{className:"lp-step-body",children:(0,a.jsx)("p",{children:(0,a.jsx)(s.p,{children:"Log in to the admin panel and start adding your fleet, airports, and\nroutes. The next steps below cover the most common follow-up tasks."})})})]})]})]})}),(0,a.jsxs)("section",{className:"lp-section",children:[(0,a.jsxs)("header",{className:"lp-section-header",children:[(0,a.jsx)("h2",{className:"lp-section-title",children:"What's next"}),(0,a.jsx)("p",{className:"lp-section-lead",children:(0,a.jsx)(s.p,{children:"Common follow-up tasks once your install is up and running."})})]}),(0,a.jsxs)("div",{className:"lp-whats-next centered",children:[(0,a.jsxs)(r.A,{to:"/8.x/config/email",className:"lp-card lp-browse-card",children:[(0,a.jsx)("span",{className:"lp-card-icon","aria-hidden":!0,
1children:"\u2709\ufe0f"}),(0,a.jsx)("h3",{className:"lp-card-title",children:"Configure email"}),(0,a.jsx)("p",{className:"lp-card-desc",children:"Wire up SMTP so pilots get account and PIREP emails."})]}),(0,a.jsxs)(r.A,{to:"/8.x/guides/basics",className:"lp-card lp-browse-card",children:[(0,a.jsx)("span",{className:"lp-card-icon","aria-hidden":!0,children:"\ud83d\udeeb"}),(0,a.jsx)("h3",{className:"lp-card-title",children:"Add your fleet"}),(0,a.jsx)("p",{className:"lp-card-desc",children:"Create aircraft subfleets and assign them to ranks."})]}),(0,a.jsxs)(r.A,{to:"/8.x/customize/theming",className:"lp-card lp-browse-card",children:[(0,a.jsx)("span",{className:"lp-card-icon","aria-hidden":!0,children:"\ud83c\udfa8"}),(0,a.jsx)("h3",{className:"lp-card-title",children:"Theme it"}),(0,a.jsx)("p",{className:"lp-card-desc",children:"Match your VA branding with a custom theme."})]})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},28453(e,s,t){t.d(s,{R:()=>r,x:()=>i});var n=t(96540);const a={},l=n.createContext(a);function r(e){const s=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),n.createElement(l.Provider,{value:s},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.