{"id":68,"date":"2026-09-27T06:55:00","date_gmt":"2026-09-27T06:55:00","guid":{"rendered":"https:\/\/newsmagazinexpro.kinsta.cloud\/demo\/?p=68"},"modified":"2026-10-02T09:56:34","modified_gmt":"2026-10-02T09:56:34","slug":"deploy-laravel-app-shared-web-hosting","status":"publish","type":"post","link":"https:\/\/www.firevm.com\/blog\/deploy-laravel-app-shared-web-hosting\/","title":{"rendered":"Deploy a Laravel App on Shared Web Hosting"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>TL;DR:<\/strong> Most shared hosts make Laravel painful or impossible without SSH. Here is how to deploy a full Laravel app with a Filament admin dashboard on FireVM shared hosting, entirely through the browser, start to finish.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This walkthrough uses <a href=\"https:\/\/filamentphp.com\/\" target=\"_blank\" rel=\"noopener\">Filament<\/a>, a popular admin panel framework for Laravel, as the example app. We picked it because its demo ships with a real admin dashboard, a real database, sample products, and images already wired up, so the moment the install finishes, you can see everything working, no blank starter page in sight.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Why Laravel is usually a pain on shared hosting<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Most shared hosting plans weren&#8217;t built with Laravel in mind. Composer usually isn&#8217;t exposed in the panel, there&#8217;s no clean way to point the document root at Laravel&#8217;s <code>public<\/code> folder, and the moment you need to run an artisan command, you&#8217;re told to drop into SSH, something a lot of shared hosting plans don&#8217;t even give you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what that typically looks like, compared to running Laravel on FireVM:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">On most shared hosts (what usually goes wrong)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No Composer access through the panel, install manually or not at all<\/li>\n\n\n\n<li>Document root has to be manually repointed to <code>public<\/code>, if the panel allows it at all<\/li>\n\n\n\n<li>Running migrations or seeders means SSH, which many shared plans don&#8217;t include<\/li>\n\n\n\n<li>Deploying updates means re-uploading files via FTP or SSH each time<\/li>\n\n\n\n<li>Environment variables are edited by hand in a <code>.env<\/code> file over FTP<\/li>\n\n\n\n<li>Queue workers and scheduled jobs either don&#8217;t run at all, or depend on unreliable cron setups, since there&#8217;s no way to keep a persistent process alive<\/li>\n\n\n\n<li>Laravel support, where it exists at all, usually means jumping to a VPS, at several times the cost of shared hosting<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">On FireVM shared web hosting (everything else, taken care of)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel apps install directly from a Git repository with one click, Composer runs automatically<\/li>\n\n\n\n<li>Document root and app structure are set up correctly from the start<\/li>\n\n\n\n<li>Migrations, seeders, and any artisan command run from a UI tab, no terminal needed<\/li>\n\n\n\n<li>SSH terminal access is included too, so it&#8217;s there if you ever want it, just not required<\/li>\n\n\n\n<li>Git-based deploys mean pushing an update is a redeploy, not a re-upload<\/li>\n\n\n\n<li>Environment variables are edited from a dashboard, saved and applied without touching a file<\/li>\n\n\n\n<li>Queue workers run as actual persistent processes, and scheduled tasks run reliably, so background jobs and the scheduler just work<\/li>\n\n\n\n<li>Laravel runs on the Business plan and above, no need to move to a VPS just to get a working setup<\/li>\n\n\n\n<li>A WordPress site can run on the main domain. A Laravel app can run on a subdomain. Another Laravel or WordPress site can run on a completely separate domain. All on the same account, at the same time.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Watch it happen, then do it yourself<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a full walkthrough deploying the Filament demo app, a real Laravel app with an admin dashboard, sample products, and images, done entirely in the browser.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Deploy Laravel in 10 Minutes on FireVM Shared Hosting (No SSH, Just Web UI)\" width=\"960\" height=\"540\" src=\"https:\/\/www.youtube.com\/embed\/h6nzGRIm8aI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The steps below follow the exact same sequence shown in the video above, so you can follow along side by side if you&#8217;d rather watch than read.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Installing Filament, step by step<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create a subdomain and enable SSL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a subdomain in FireVM&#8217;s control panel for your Laravel app, something like <code>laravel-demo<\/code>. Then head to <strong>Hosting &amp; DNS \u2192 SSL\/TLS support<\/strong> and issue a free Let&#8217;s Encrypt certificate. This secures your site with HTTPS before we install anything.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Install Filament via Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go to <strong>Get Started<\/strong>, click <strong>Laravel<\/strong>, and choose <strong>Install from remote repository<\/strong>. Paste in the GitHub URL for the Filament demo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;github.com\/filamentphp\/demo.git<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Click <strong>Install<\/strong>. This one click handles cloning the code and setting up the base configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Build the frontend<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <strong>Node.js<\/strong> tab, type <code>install<\/code>, and run it. Once that finishes, type <code>run-script build<\/code> and run that too. This compiles the styling and JavaScript the app needs to actually look right.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Set up the database<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In <strong>Files<\/strong>, check that <code>database.sqlite<\/code> exists inside the <code>database<\/code> folder. If it&#8217;s missing, create an empty file with that name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, in the <strong>Artisan<\/strong> tab, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>migrate --force<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This builds out the tables. After that, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>db:seed --force<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This fills the app with demo data. It takes a few minutes, counts climbing in the output as it works, so there&#8217;s nothing to do but let it run. You may see a flash of &#8220;Request failed with status code 504&#8221; near the top of the page partway through. Ignore it, that&#8217;s just FireVM&#8217;s control panel timing out on a long request, not the seeder failing. The seeder is actually done when the command box becomes editable again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>storage:link<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This makes sure product images display correctly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Fix the app URL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <strong>Dashboard<\/strong> tab, click <strong>Environment Variables<\/strong>, and edit the file. Change the <code>APP_URL<\/code> line to your actual subdomain address, for example <code>https:\/\/laravel-demo.inspirevilla.com<\/code>, then save.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Head back to the <strong>Artisan<\/strong> tab and run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>config:clear<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">to apply the change.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation complete<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Visit <code>\/login<\/code> on your subdomain and sign in with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>URL:<\/strong> <a href=\"https:\/\/laravel-demo.inspirevilla.com\" target=\"_blank\" rel=\"noopener\">https:\/\/laravel-demo.inspirevilla.com<\/a><\/li>\n\n\n\n<li><strong>Email:<\/strong> admin@filamentphp.com<\/li>\n\n\n\n<li><strong>Password:<\/strong> password (this comes from the Filament demo&#8217;s own seeder, in a real app you&#8217;d set your own password during setup)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Products, images, and dashboard totals should all display correctly. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo.png\" target=\"_blank\" rel=\" noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo-1024x531.png\" alt=\"\" class=\"wp-image-551\" style=\"box-shadow:var(--wp--preset--shadow--natural)\" srcset=\"https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo-1024x531.png 1024w, https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo-300x156.png 300w, https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo-768x398.png 768w, https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo-1536x796.png 1536w, https:\/\/www.firevm.com\/blog\/wp-content\/uploads\/2025\/01\/filament-demo.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">From subdomain to a working admin panel, the whole build happened in the browser, no SSH, no terminal.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Prefer the terminal? Here&#8217;s the SSH version<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Everything above runs through FireVM&#8217;s control panel UI, but Business and above plans include full SSH access too. If you&#8217;d rather work from the terminal, here&#8217;s the same install as a command sequence. The UI version handles a few things automatically behind the scenes, like restarting the app after environment changes, so the SSH version adds one extra step to cover that manually.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Navigate to your subdomain's document root\ncd ~\/laravel-demo.yourdomain.com\n\n# 2. Clone the Filament demo repo directly into this folder\ngit clone https:\/\/github.com\/filamentphp\/demo.git .\n\n# 3. Install PHP dependencies via Composer\ncomposer install --no-dev --optimize-autoloader\n\n# 4. Copy the example env file and generate an app key\ncp .env.example .env\nphp artisan key:generate\n\n# 5. Install Node dependencies and build the frontend\nnpm install\nnpm run build\n\n# 6. Create the SQLite database file if it doesn't exist\ntouch database\/database.sqlite\n\n# 7. Run migrations\nphp artisan migrate --force\n\n# 8. Seed demo data (takes a few minutes, same as the UI version)\nphp artisan db:seed --force\n\n# 9. Link storage so images display correctly\nphp artisan storage:link\n\n# 10. Set the correct APP_URL in .env, then clear config cache\nsed -i 's|^APP_URL=.*|APP_URL=https:\/\/laravel-demo.yourdomain.com|' .env\nphp artisan config:clear\n\n# 11. Tell Passenger to reload the app\nmkdir -p tmp\ntouch tmp\/restart.txt\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Double-check your document root path and active PHP version before running this, both are specific to your setup.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">What&#8217;s next<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">FireVM&#8217;s <a href=\"https:\/\/www.firevm.com\/web-hosting\/\" target=\"_blank\" rel=\"noopener\">Business plan<\/a> or above runs Laravel. Anything below that won&#8217;t give you Composer, Git deploys, or queue worker support for Laravel apps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re running client sites rather than just your own, the <a href=\"https:\/\/www.firevm.com\/web-hosting\/\" target=\"_blank\" rel=\"noopener\">Agency plan<\/a> is the better fit. It gives each client their own isolated account with a separate login, so you can hand off access without exposing anything else on your hosting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your app genuinely needs more than shared web hosting can offer, heavier traffic, custom server-level configuration, or full root access, <a href=\"https:\/\/www.firevm.com\/vps-hosting\/\" target=\"_blank\" rel=\"noopener\">FireVM&#8217;s VPS hosting<\/a> is there too. And if you ever outgrow VPS as well, <a href=\"https:\/\/www.firevm.com\/dedicated-servers\/\" target=\"_blank\" rel=\"noopener\">FireVM&#8217;s dedicated servers<\/a> are there for when you need a machine entirely to yourself.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Most shared hosts make Laravel painful or impossible without SSH. Here&#8217;s how to deploy a full Laravel app on FireVM shared hosting, no terminal needed.<\/p>\n","protected":false},"author":1,"featured_media":546,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[26],"class_list":["post-68","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guides","tag-web-hosting"],"_links":{"self":[{"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/posts\/68","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/comments?post=68"}],"version-history":[{"count":6,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/posts\/68\/revisions"}],"predecessor-version":[{"id":552,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/posts\/68\/revisions\/552"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/media\/546"}],"wp:attachment":[{"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/media?parent=68"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/categories?post=68"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.firevm.com\/blog\/wp-json\/wp\/v2\/tags?post=68"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}