{"id":130676,"date":"2025-07-10T18:08:07","date_gmt":"2025-07-10T22:08:07","guid":{"rendered":"https:\/\/www.inmotionhosting.com\/support\/?p=130676"},"modified":"2025-07-11T10:11:43","modified_gmt":"2025-07-11T14:11:43","slug":"publish-lovable-webapp-to-ultrastack-one-for-react","status":"publish","type":"post","link":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/","title":{"rendered":"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React"},"content":{"rendered":"<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png\" alt=\"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React\" class=\"wp-image-130678\" srcset=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png 1024w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-300x158.png 300w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-768x403.png 768w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png 1200w\" sizes=\"auto, (min-width: 1360px) 876px, (min-width: 960px) calc(61.58vw + 51px), calc(100vw - 80px)\" \/><\/figure>\n\n\n\n<p>InMotion Hosting\u2019s UltraStack ONE for React provides a streamlined path for deploying React applications built with AI-powered development tools like Lovable. This guide will walk you through the complete process of connecting your Lovable project to GitHub and deploying it to your UltraStack ONE for React VPS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Before You Get Started (Prerequisites and Considerations)<\/h2>\n\n\n\n<p>Before beginning this deployment process, ensure you have the following resources ready.  For UltraStack ONE for React, you must contact us for the Beta prior to September:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A completed React application built in <a href=\"https:\/\/lovable.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">Lovable<\/a><\/li>\n\n\n\n<li>A GitHub account with repository access<\/li>\n\n\n\n<li>An active UltraStack ONE for React VPS (2GB\/2vCPU minimum for development, 4GB\/4vCPU recommended for production)<\/li>\n\n\n\n<li>SSH access to your UltraStack ONE VPS<\/li>\n\n\n\n<li>Basic familiarity with command line operations<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Important Note About UltraStack ONE for React Release<\/h3>\n\n\n\n<p>UltraStack ONE for React is scheduled to release in September 2025. This specialized VPS solution is purpose-built for React applications and includes pre-configured server software tailored specifically for React deployment workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding UltraStack ONE for React<\/h2>\n\n\n\n<p>UltraStack ONE for React is InMotion Hosting\u2019s purpose-built Virtual Private Server running on our Highly Available NVMe-based <a href=\"https:\/\/www.inmotionhosting.com\/cloud-vps\">cloud infrastructure<\/a>. This VPS comes pre-configured with all the essential server software needed for React applications, including <code>npm<\/code> for building applications and NGINX with optimized <code>max_connections<\/code> settings to serve your application efficiently.<\/p>\n\n\n\n<p>The server configuration includes proper URL routing to work seamlessly with React Router, eliminating common URL link headaches. Additionally, your VPS includes a stateful backend data storage solution powered by PostgreSQL, configured for high performance with connection pooling optimized for Node.js server applications handling inbound API calls from your frontend.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">VPS Resource Recommendations<\/h3>\n\n\n\n<p>Your UltraStack ONE for React VPS capabilities scale with the allocated RAM and vCPUs. A 2GB\/2vCPU VPS can support pretty serious traffic levels and provides an excellent starting point for development and testing environments. However, for production deployments, we recommend a 4GB\/4vCPU configuration to ensure good performance under real-world traffic conditions.<\/p>\n\n\n\n<p>Unlike traditional hosting solutions, UltraStack ONE for React excludes unnecessary software like Apache, focusing exclusively on the tools and services your React application needs. This approach reduces overhead and potential security vulnerabilities while maintaining top performance per dollar spent.  Larger VPSes are still very reasonable so if it is a large scale use case, just get something in the 8GB\/8vCPU or 12GB\/12vCPU to start.<\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"626\" src=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector-1024x626.png\" alt=\"UltraStack ONE VPS Plan Selector\" class=\"imh-box-shadow wp-image-130685\" style=\"width:566px;height:auto\" srcset=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector-1024x626.png 1024w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector-300x183.png 300w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector-768x469.png 768w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector-1536x938.png 1536w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-UltraStack-One-VPS-Selector.png 1568w\" sizes=\"auto, (min-width: 1360px) 876px, (min-width: 960px) calc(61.58vw + 51px), calc(100vw - 80px)\" \/><\/p>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Connecting Lovable to GitHub<\/h2>\n\n\n\n<p>The first step in your deployment journey involves establishing a connection between your Lovable project and GitHub. This integration provides version control, backup capabilities, and enables automated deployment workflows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Initiating the GitHub Connection<\/h3>\n\n\n\n<p>In the Lovable editor, click on GitHub \u2192 Connect to GitHub (usually found in the top-right corner of the project editor). This will begin the authorization process.<\/p>\n\n\n\n<p>You\u2019ll be redirected to GitHub to authorize the Lovable GitHub App. Sign in to GitHub if prompted. When asked to grant access, choose either <strong>All repositories<\/strong> or <strong>Only select repositories<\/strong>. For security purposes, you may prefer to grant access only to specific repositories, though allowing all repositories provides more flexibility for future projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Selecting Your GitHub Account<\/h3>\n\n\n\n<p>If your GitHub user belongs to organizations, you may need to confirm which GitHub account or organization to install the Lovable app to. You can create the project\u2019s repo under your personal GitHub or any organization where you have permission.<\/p>\n\n\n\n<p>Remember that you can only connect one GitHub account per Lovable account at a time. If you need to use an organization\u2019s GitHub account, ensure you have admin access to allow repository creation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/image-1024x548.png\" alt=\"\" class=\"wp-image-130699\" srcset=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/image-1024x548.png 1024w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/image-300x160.png 300w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/image-768x411.png 768w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/image.png 1290w\" sizes=\"auto, (min-width: 1360px) 876px, (min-width: 960px) calc(61.58vw + 51px), calc(100vw - 80px)\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Creating the Repository<\/h3>\n\n\n\n<p>Once GitHub is connected, return to your Lovable project. Click the Create Repository button (located in the top-right of the Lovable editor interface). Lovable will then create a new GitHub repository for this project and push the current project code to that repo.<\/p>\n\n\n\n<p>This initial push may take a few seconds to complete. After this step, your Lovable project\u2019s code will be accessible on GitHub, providing the foundation for your deployment workflow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verifying the Connection<\/h3>\n\n\n\n<p>Navigate to GitHub and go to your account (or org) \u2013 you should see the new repository with your project\u2019s name. It will contain all the code of your Lovable app. In the Lovable editor, you should also see confirmation that the repository has been linked successfully.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Understanding GitHub and Lovable Synchronization<\/h2>\n\n\n\n<p>Once connected, your Lovable project and GitHub repository maintain real-time synchronization. When you commit and push code to the default branch on GitHub, those commits will show up in Lovable almost automatically. Lovable\u2019s integration listens for changes \u2013 whenever you push to GitHub, Lovable pulls the latest commit into the project.<\/p>\n\n\n\n<p>Similarly, if you make changes in Lovable (for example, editing code via Lovable\u2019s Dev Mode or having the AI generate new code), those changes are also saved to the Git repository backing your project. Lovable will push these commits to GitHub automatically, updating the repository.<\/p>\n\n\n\n<p>This bidirectional synchronization ensures that your code remains consistent across both platforms without manual intervention.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Accessing Your UltraStack ONE VPS via SSH<\/h2>\n\n\n\n<p>To deploy your React application, you\u2019ll need SSH access to your UltraStack ONE VPS. When running a website or server, SSH can save you time by allowing you to view, manage, and edit files from the command line interface (CLI).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Generating and Adding SSH Keys<\/h3>\n\n\n\n<p>Generate and add the SSH Key to your server through InMotion Central. This process creates a secure authentication method that eliminates the need for password-based logins.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"897\" src=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Add-SSH-Key-1024x897.png\" alt=\"Add SSH Key to InMotion Central\" class=\"wp-image-130683\" style=\"width:485px;height:auto\" srcset=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Add-SSH-Key-1024x897.png 1024w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Add-SSH-Key-300x263.png 300w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Add-SSH-Key-768x673.png 768w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Add-SSH-Key.png 1336w\" sizes=\"auto, (min-width: 1360px) 876px, (min-width: 960px) calc(61.58vw + 51px), calc(100vw - 80px)\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Connecting to Your Server<\/h3>\n\n\n\n<p><a href=\"https:\/\/central.inmotionhosting.com\/login\" target=\"_blank\" rel=\"noreferrer noopener\">Log into InMotion Central<\/a>, open your Project, then click <strong>Manage Environment<\/strong>. You can then copy your hostname or IP address to use to connect.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"106\" src=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Manage-Environment-CTA.png\" alt=\"InMotion Central Manage Environment Button\" class=\"wp-image-130681\" style=\"width:340px;height:auto\" srcset=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Manage-Environment-CTA.png 466w, https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/InMotion-Central-Manage-Environment-CTA-300x68.png 300w\" sizes=\"auto, (min-width: 1360px) 876px, (min-width: 960px) calc(61.58vw + 51px), calc(100vw - 80px)\" \/><\/figure>\n\n\n\n<p>Here\u2019s what it would look like to connect using either the hostname or IP address:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Connect with hostname\nssh root@vps####.inmotionhosting.com\n\n# Connect with IP address\u00a0\u00a0\nssh root@192.168.1.100<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># Connect with hostname<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">ssh<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">root@vps####.inmotionhosting.com<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Connect with IP address\u00a0\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">ssh<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">root@192.168.1.100<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Replace the placeholder values with your actual server details provided in InMotion Central.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Preparing Your UltraStack ONE VPS for React Deployment<\/h2>\n\n\n\n<p>Your UltraStack ONE for React VPS comes pre-configured with the necessary software stack, but you\u2019ll need to prepare it for your specific application deployment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Understanding the Pre-configured Environment<\/h3>\n\n\n\n<p>Your VPS includes <code>npm<\/code> for building React applications and NGINX configured specifically for React applications. The NGINX configuration includes proper URL routing that works seamlessly with React Router, eliminating common single-page application deployment issues.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configuring NGINX for High API Connections<\/h3>\n\n\n\n<p>UltraStack ONE for React includes NGINX configured with high <code>max_connections<\/code> settings to handle substantial API traffic. The default configuration is optimized for React applications that make frequent API calls to backend services.<\/p>\n\n\n\n<p>The NGINX configuration includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Optimized worker processes and connections<\/li>\n\n\n\n<li>Proper proxy settings for API endpoints<\/li>\n\n\n\n<li>Static file serving optimization for React build assets<\/li>\n\n\n\n<li>Compression settings for improved performance<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Accessing NGINX Configuration<\/h3>\n\n\n\n<p>Below is the location of your site\u2019s NGINX configuration file. Be sure to replace vps#### with your actual VPS server number: <code>\/etc\/nginx\/conf.d\/vps####.inmotionhosting.com.conf<\/code><\/p>\n\n\n\n<p>You can view and modify this configuration file as needed for your specific application requirements.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Understanding PostgreSQL and Node.js Connection Pooling<\/h2>\n\n\n\n<p>Your UltraStack ONE for React VPS includes PostgreSQL and a Node.js install configured with connection pooling for optimal performance. Understanding why connection pooling is crucial will help you build more efficient applications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why Connection Pooling Matters<\/h3>\n\n\n\n<p>Connecting a new client to the PostgreSQL server requires a handshake which can take 20-30 milliseconds. During this time passwords are negotiated, SSL may be established, and configuration information is shared with the client and server. Incurring this time delay every time we want to execute a query would substantially slow down our application.<\/p>\n\n\n\n<p>Additionally, the PostgreSQL server can only handle a limited number of clients at a time. Depending on resources like available memory of your PostgreSQL server you may even crash the server if you connect too many clients.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementing Connection Pooling in Your Node.js Backend<\/h3>\n\n\n\n<p>Your UltraStack ONE for React VPS includes a recommended <code>node-postgres<\/code> (<a href=\"https:\/\/node-postgres.com\/apis\/pool\">thanks node-postgres!<\/a>) implemented pre-configured connection pool. When building your backend API endpoints, use the pool pattern for database connections:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import pg from 'pg'\nconst { Pool } = pg\nconst pool = new Pool({\n\u00a0\u00a0user: 'your_database_user',\n\u00a0\u00a0host: 'localhost',\n\u00a0\u00a0database: 'your_database_name',\n\u00a0\u00a0password: 'your_database_password',\n\u00a0\u00a0port: 5432,\n\u00a0\u00a0max: 20, \/\/ Maximum number of connections\n\u00a0\u00a0idleTimeoutMillis: 30000,\n\u00a0\u00a0connectionTimeoutMillis: 2000,\n})\n\n\/\/ Single query method (preferred for most cases)\nconst getUserById = async (id) =&gt; {\n\u00a0\u00a0const res = await pool.query('SELECT * FROM users WHERE id = $1', [id])\n\u00a0\u00a0return res.rows[0]\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">import<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">pg<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">from<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'pg'<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">{<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">Pool<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">}<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">pg<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">pool<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">new<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">Pool<\/span><span style=\"color: #E1E4E8\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0user:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'your_database_user',<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0host:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'localhost',<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0database:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'your_database_name',<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0password:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'your_database_password',<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0port:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">5432<\/span><span style=\"color: #9ECBFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0max:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">20<\/span><span style=\"color: #9ECBFF\">,<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/\/<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">Maximum<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">number<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">of<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">connections<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0idleTimeoutMillis:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">30000<\/span><span style=\"color: #9ECBFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0connectionTimeoutMillis:<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">2000<\/span><span style=\"color: #9ECBFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\/\/<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">Single<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">query<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">method<\/span><span style=\"color: #E1E4E8\"> (preferred <\/span><span style=\"color: #9ECBFF\">for<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">most<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">cases<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">getUserById<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">async<\/span><span style=\"color: #E1E4E8\"> (id) =<\/span><span style=\"color: #F97583\">&gt;<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">res<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">await<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">pool.query<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #B392F0\">'SELECT * FROM users WHERE id = $1'<\/span><span style=\"color: #B392F0\">,<\/span><span style=\"color: #E1E4E8\"> [id])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">\u00a0\u00a0return<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">res.rows[<\/span><span style=\"color: #79B8FF\">0<\/span><span style=\"color: #9ECBFF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>If you don\u2019t need a transaction or you just need to run a single query, the pool has a convenience method to run a query on any available client in the pool. This is the preferred way to query with <code>node-postgres<\/code> if you can as it removes the risk of leaking a client.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Setting Up GitHub Actions for Automated Deployment<\/h2>\n\n\n\n<p>UltraStack ONE for React specifically supports GitHub Actions for easy CI\/CD pipelines. This automation will deploy your React application whenever you push changes to your main branch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating the GitHub Actions Workflow<\/h3>\n\n\n\n<p>In your GitHub repository, create a <code>.github\/workflows\/deploy.yml<\/code> file:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>name: Deploy to UltraStack ONE for React\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    \n    steps:\n    - uses: actions\/checkout@v2\n    \n    - name: Setup Node.js\n      uses: actions\/setup-node@v2\n      with:\n        node-version: '18'\n        \n    - name: Install dependencies\n      run: npm ci\n      \n    - name: Build React application\n      run: npm run build\n      \n    - name: Deploy to UltraStack ONE VPS\n      uses: appleboy\/scp-action@master\n      with:\n        host: ${{ secrets.HOST }}\n        username: ${{ secrets.USERNAME }}\n        key: ${{ secrets.SSH_KEY }}\n        port: 22\n        source: \"build\/*\"\n        target: \"\/var\/www\/html\"\n        rm: true<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #85E89D\">name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Deploy to UltraStack ONE for React<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">on<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">  <\/span><span style=\"color: #85E89D\">push<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #85E89D\">branches<\/span><span style=\"color: #E1E4E8\">: [ <\/span><span style=\"color: #9ECBFF\">main<\/span><span style=\"color: #E1E4E8\"> ]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">jobs<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">  <\/span><span style=\"color: #85E89D\">deploy<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #85E89D\">runs-on<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #85E89D\">steps<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    - <\/span><span style=\"color: #85E89D\">uses<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">actions\/checkout@v2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    - <\/span><span style=\"color: #85E89D\">name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Setup Node.js<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">uses<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">actions\/setup-node@v2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">with<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">node-version<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">'18'<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    - <\/span><span style=\"color: #85E89D\">name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Install dependencies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">run<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">npm ci<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    - <\/span><span style=\"color: #85E89D\">name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Build React application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">run<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">npm run build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    - <\/span><span style=\"color: #85E89D\">name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Deploy to UltraStack ONE VPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">uses<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">appleboy\/scp-action@master<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      <\/span><span style=\"color: #85E89D\">with<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">host<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">${{ secrets.HOST }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">username<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">${{ secrets.USERNAME }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">key<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">${{ secrets.SSH_KEY }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">port<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">source<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">\"build\/*\"<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">target<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">\"\/var\/www\/html\"<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #85E89D\">rm<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">true<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Configuring GitHub Secrets<\/h3>\n\n\n\n<p>In your GitHub repository settings, add the following secrets:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>HOST<\/strong>: Your UltraStack ONE VPS hostname or IP address<\/li>\n\n\n\n<li><strong>USERNAME<\/strong>: <code>root<\/code> (or your configured user)<\/li>\n\n\n\n<li><strong>SSH_KEY<\/strong>: Your private SSH key content<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Deploying Your React Application<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Manual Deployment Process<\/h3>\n\n\n\n<p>For your initial deployment or when you need direct control, you can deploy manually:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Clone your repository on the VPS:<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>cd \/var\/www\ngit clone https:\/\/github.com\/yourusername\/your-repo.git\ncd your-repo<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #79B8FF\">cd<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/var\/www<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">git<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">clone<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">https:\/\/github.com\/yourusername\/your-repo.git<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">cd<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">your-repo<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Install dependencies:<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>npm install<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">npm<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">install<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Build your React application:<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>npm run build<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">npm<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">run<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">build<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Copy build files to web directory:<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>cp -r build\/* \/var\/www\/html\/<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">cp<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">-r<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">build\/<\/span><span style=\"color: #79B8FF\">*<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/var\/www\/html\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Restart NGINX:<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>systemctl restart nginx<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">systemctl<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">restart<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">nginx<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Automated Deployment via GitHub Actions<\/h3>\n\n\n\n<p>Once you\u2019ve configured GitHub Actions, deployment becomes automatic. Simply push changes to your main branch, and the workflow will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build your React application<\/li>\n\n\n\n<li>Transfer the build files to your VPS<\/li>\n\n\n\n<li>Update the web directory with new content<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8: Configuring Your Backend API<\/h2>\n\n\n\n<p>Your UltraStack ONE for React VPS includes Node.js and is configured to handle API requests. Create your backend API endpoints to serve your React application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sample API Structure<\/h3>\n\n\n\n<p>Create an <code>api<\/code> directory in your project:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ api\/server.js\nimport express from 'express'\nimport pg from 'pg'\nconst { Pool } = pg\nconst app = express()\nconst port = 3001\n\n\/\/ Database connection pool\nconst pool = new Pool({\n\u00a0\u00a0user: 'postgres',\n\u00a0\u00a0host: 'localhost',\n\u00a0\u00a0database: 'your_app_db',\n\u00a0\u00a0password: 'your_password',\n\u00a0\u00a0port: 5432,\n})\n\napp.use(express.json())\n\n\/\/ Sample API endpoint\napp.get('\/api\/users', async (req, res) =&gt; {\n\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0const result = await pool.query('SELECT * FROM users')\n\u00a0\u00a0\u00a0\u00a0res.json(result.rows)\n\u00a0\u00a0} catch (err) {\n\u00a0\u00a0\u00a0\u00a0console.error(err)\n\u00a0\u00a0\u00a0\u00a0res.status(500).json({ error: 'Internal server error' })\n\u00a0\u00a0}\n})\n\napp.listen(port, () =&gt; {\n\u00a0\u00a0console.log(`API server running on port ${port}`)\n})<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\">\/\/ api\/server.js<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">import<\/span><span style=\"color: #E1E4E8\"> express <\/span><span style=\"color: #F97583\">from<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'express'<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">import<\/span><span style=\"color: #E1E4E8\"> pg <\/span><span style=\"color: #F97583\">from<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">'pg'<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">const<\/span><span style=\"color: #E1E4E8\"> { <\/span><span style=\"color: #79B8FF\">Pool<\/span><span style=\"color: #E1E4E8\"> } <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> pg<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">app<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #B392F0\">express<\/span><span style=\"color: #E1E4E8\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">port<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">3001<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">\/\/ Database connection pool<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">pool<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">new<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #B392F0\">Pool<\/span><span style=\"color: #E1E4E8\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0user: <\/span><span style=\"color: #9ECBFF\">'postgres'<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0host: <\/span><span style=\"color: #9ECBFF\">'localhost'<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0database: <\/span><span style=\"color: #9ECBFF\">'your_app_db'<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0password: <\/span><span style=\"color: #9ECBFF\">'your_password'<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0port: <\/span><span style=\"color: #79B8FF\">5432<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">app.<\/span><span style=\"color: #B392F0\">use<\/span><span style=\"color: #E1E4E8\">(express.<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #E1E4E8\">())<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">\/\/ Sample API endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">app.<\/span><span style=\"color: #B392F0\">get<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">'\/api\/users'<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #F97583\">async<\/span><span style=\"color: #E1E4E8\"> (<\/span><span style=\"color: #FFAB70\">req<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #FFAB70\">res<\/span><span style=\"color: #E1E4E8\">) <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0<\/span><span style=\"color: #F97583\">try<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"color: #F97583\">const<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">result<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">await<\/span><span style=\"color: #E1E4E8\"> pool.<\/span><span style=\"color: #B392F0\">query<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">'SELECT * FROM users'<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0\u00a0\u00a0res.<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #E1E4E8\">(result.rows)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0} <\/span><span style=\"color: #F97583\">catch<\/span><span style=\"color: #E1E4E8\"> (err) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0\u00a0\u00a0console.<\/span><span style=\"color: #B392F0\">error<\/span><span style=\"color: #E1E4E8\">(err)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0\u00a0\u00a0res.<\/span><span style=\"color: #B392F0\">status<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #79B8FF\">500<\/span><span style=\"color: #E1E4E8\">).<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #E1E4E8\">({ error: <\/span><span style=\"color: #9ECBFF\">'Internal server error'<\/span><span style=\"color: #E1E4E8\"> })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">app.<\/span><span style=\"color: #B392F0\">listen<\/span><span style=\"color: #E1E4E8\">(port, () <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">\u00a0\u00a0console.<\/span><span style=\"color: #B392F0\">log<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">`API server running on port ${<\/span><span style=\"color: #E1E4E8\">port<\/span><span style=\"color: #9ECBFF\">}`<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">})<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Managing Your Node.js API Service<\/h3>\n\n\n\n<p>Note the below may change prior to release!<\/p>\n\n\n\n<p>You can manage your Node.js API service using <code>systemctl<\/code> commands:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Start your API service\nsystemctl start your-api-service\n\n# Stop your API service\nsystemctl stop your-api-service\n\n# Restart your API service\nsystemctl restart your-api-service\n\n# Check service status\nsystemctl status your-api-service<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># Start your API service<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">systemctl<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">start<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">your-api-service<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Stop your API service<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">systemctl<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">stop<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">your-api-service<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Restart your API service<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">systemctl<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">restart<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">your-api-service<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Check service status<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">systemctl<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">status<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">your-api-service<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 9: Testing Your Deployment<\/h2>\n\n\n\n<p>After deployment, verify your React application is working correctly:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Access your application<\/strong> via your VPS hostname or IP address<\/li>\n\n\n\n<li><strong>Test React Router functionality<\/strong> by navigating to different routes<\/li>\n\n\n\n<li><strong>Verify API connectivity<\/strong> by checking that your frontend can communicate with your backend<\/li>\n\n\n\n<li><strong>Monitor server logs<\/strong> to ensure no errors are occurring<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Monitoring Application Performance<\/h3>\n\n\n\n<p>We expect to add more visual monitoring during the release or just after.<\/p>\n\n\n\n<p>You can view various log files to monitor your application:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(26px, 1.625rem, 39px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># View NGINX access logs\ntail -f \/var\/log\/nginx\/access.log\n\n# View NGINX error logs\ntail -f \/var\/log\/nginx\/error.log\n\n# View your application logs\ntail -f \/var\/log\/your-app\/app.log<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># View NGINX access logs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">tail<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">-f<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/var\/log\/nginx\/access.log<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># View NGINX error logs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">tail<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">-f<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/var\/log\/nginx\/error.log<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># View your application logs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">tail<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">-f<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">\/var\/log\/your-app\/app.log<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 10: Ongoing Maintenance and Updates<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Updating Your Application<\/h3>\n\n\n\n<p>With GitHub Actions configured, updates are streamlined:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Make changes in Lovable or directly in your GitHub repository<\/li>\n\n\n\n<li>Push changes to the main branch<\/li>\n\n\n\n<li>GitHub Actions automatically builds and deploys the updated version<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Database Management<\/h3>\n\n\n\n<p>Your PostgreSQL database requires periodic maintenance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor connection pool usage<\/li>\n\n\n\n<li>Optimize queries for better performance<\/li>\n\n\n\n<li>Regular backup procedures<\/li>\n\n\n\n<li>Update database schema as your application evolves<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security Considerations<\/h3>\n\n\n\n<p>Maintain security best practices:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep your SSH keys secure<\/li>\n\n\n\n<li>Regularly update your GitHub secrets<\/li>\n\n\n\n<li>Monitor access logs for suspicious activity<\/li>\n\n\n\n<li>Keep your VPS software updated<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting Common Issues<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Build Failures<\/h3>\n\n\n\n<p>If your React build fails:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Check that all dependencies are properly listed in package.json<\/li>\n\n\n\n<li>Verify that your build scripts are correctly configured<\/li>\n\n\n\n<li>Review GitHub Actions logs for specific error messages<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Connection Issues<\/h3>\n\n\n\n<p>If you experience database connection problems:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify your connection pool configuration<\/li>\n\n\n\n<li>Check that PostgreSQL is running: systemctl status postgresql<\/li>\n\n\n\n<li>Review database logs for connection errors<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">NGINX Configuration Problems<\/h3>\n\n\n\n<p>If your React Router isn\u2019t working properly:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify that your NGINX configuration includes proper fallback rules<\/li>\n\n\n\n<li>Check that your build files are in the correct directory<\/li>\n\n\n\n<li>Restart NGINX after configuration changes<\/li>\n<\/ol>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Deploying your Lovable-created React application to UltraStack ONE for React provides a powerful, scalable foundation for your web application. The combination of Lovable\u2019s AI-powered development capabilities, GitHub\u2019s version control and automation features, and InMotion Hosting\u2019s optimized React hosting environment creates an efficient development and deployment workflow.<\/p>\n\n\n\n<p>Your UltraStack ONE for React VPS provides all the necessary infrastructure components, from the optimized NGINX configuration to the PostgreSQL database with connection pooling. This specialized hosting solution eliminates common deployment challenges while providing the performance and scalability your React application needs.<\/p>\n\n\n\n<p>By following this guide, you\u2019ve established a professional deployment pipeline that supports both rapid development through Lovable and reliable production hosting through UltraStack ONE for React. This foundation will serve your project well as it grows and evolves.<\/p>\n\n\n\n<p>Remember that UltraStack ONE for React is specifically designed to support React applications, providing the exact server configuration and software stack your application needs without unnecessary overhead. This focused approach delivers optimal performance while simplifying the deployment and maintenance process.<\/p>\n\n\n\n<p>With your deployment pipeline in place, you can focus on building great user experiences with Lovable while having confidence in your application\u2019s hosting foundation. The automated deployment process ensures that your latest changes are always reflected in your production environment, enabling rapid iteration and continuous improvement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>InMotion Hosting\u2019s UltraStack ONE for React provides a streamlined path for deploying React applications built with AI-powered development tools like Lovable. This guide will walk you through the complete process of connecting your Lovable project to GitHub and deploying it to your UltraStack ONE for React VPS. Before You Get Started (Prerequisites and Considerations) Before<a class=\"moretag\" href=\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\"> Read More ><\/a><\/p>\n","protected":false},"author":28953,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4611,4309],"tags":[],"class_list":["post-130676","post","type-post","status-publish","format-standard","hentry","category-ai-tools","category-git"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Publish Lovable App to UltraStack ONE for React<\/title>\n<meta name=\"description\" content=\"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Publish Lovable App to UltraStack ONE for React\" \/>\n<meta property=\"og:description\" content=\"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\" \/>\n<meta property=\"og:site_name\" content=\"InMotion Hosting Support Center\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inmotionhosting\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-10T22:08:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-11T14:11:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Todd Robinson\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@InMotionHosting\" \/>\n<meta name=\"twitter:site\" content=\"@InMotionHosting\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Todd Robinson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\"},\"author\":{\"name\":\"Todd Robinson\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/person\/87423443495bb1e33c4cbc0acd6d2c5d\"},\"headline\":\"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React\",\"datePublished\":\"2025-07-10T22:08:07+00:00\",\"dateModified\":\"2025-07-11T14:11:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\"},\"wordCount\":2101,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png\",\"articleSection\":[\"AI Tools\",\"Git\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\",\"url\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\",\"name\":\"How to Publish Lovable App to UltraStack ONE for React\",\"isPartOf\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png\",\"datePublished\":\"2025-07-10T22:08:07+00:00\",\"dateModified\":\"2025-07-11T14:11:43+00:00\",\"description\":\"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage\",\"url\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png\",\"contentUrl\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inmotionhosting.com\/support\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#website\",\"url\":\"https:\/\/www.inmotionhosting.com\/support\/\",\"name\":\"InMotion Hosting Support Center\",\"description\":\"Web Hosting Support &amp; Tutorials\",\"publisher\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inmotionhosting.com\/support\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#organization\",\"name\":\"InMotion Hosting\",\"url\":\"https:\/\/www.inmotionhosting.com\/support\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2023\/02\/inmotion-hosting-logo-yoast.jpg\",\"contentUrl\":\"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2023\/02\/inmotion-hosting-logo-yoast.jpg\",\"width\":696,\"height\":696,\"caption\":\"InMotion Hosting\"},\"image\":{\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inmotionhosting\/\",\"https:\/\/x.com\/InMotionHosting\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/person\/87423443495bb1e33c4cbc0acd6d2c5d\",\"name\":\"Todd Robinson\",\"description\":\"I would really appreciate any thoughts and guidance you might want to share. Please connect with me on LinkedIn or leave a comment below with requests or questions \u2014 even corrections if I managed to mess up something!\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/toddrobinson2\/\"],\"url\":\"https:\/\/www.inmotionhosting.com\/support\/author\/todd_r\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Publish Lovable App to UltraStack ONE for React","description":"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/","og_locale":"en_US","og_type":"article","og_title":"How to Publish Lovable App to UltraStack ONE for React","og_description":"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.","og_url":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/","og_site_name":"InMotion Hosting Support Center","article_publisher":"https:\/\/www.facebook.com\/inmotionhosting\/","article_published_time":"2025-07-10T22:08:07+00:00","article_modified_time":"2025-07-11T14:11:43+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png","type":"image\/png"}],"author":"Todd Robinson","twitter_card":"summary_large_image","twitter_creator":"@InMotionHosting","twitter_site":"@InMotionHosting","twitter_misc":{"Written by":"Todd Robinson","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#article","isPartOf":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/"},"author":{"name":"Todd Robinson","@id":"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/person\/87423443495bb1e33c4cbc0acd6d2c5d"},"headline":"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React","datePublished":"2025-07-10T22:08:07+00:00","dateModified":"2025-07-11T14:11:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/"},"wordCount":2101,"commentCount":0,"publisher":{"@id":"https:\/\/www.inmotionhosting.com\/support\/#organization"},"image":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png","articleSection":["AI Tools","Git"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/","url":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/","name":"How to Publish Lovable App to UltraStack ONE for React","isPartOf":{"@id":"https:\/\/www.inmotionhosting.com\/support\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage"},"image":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One-1024x538.png","datePublished":"2025-07-10T22:08:07+00:00","dateModified":"2025-07-11T14:11:43+00:00","description":"Learn how to publish your Lovable React web app to your UltraStack ONE for React VPS using GitHub.","breadcrumb":{"@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#primaryimage","url":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png","contentUrl":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2025\/07\/Publish-Lovable-App-to-UltraStack-One.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/publish-lovable-webapp-to-ultrastack-one-for-react\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inmotionhosting.com\/support\/"},{"@type":"ListItem","position":2,"name":"How to Publish Your Lovable Created React WebApp to UltraStack ONE for React"}]},{"@type":"WebSite","@id":"https:\/\/www.inmotionhosting.com\/support\/#website","url":"https:\/\/www.inmotionhosting.com\/support\/","name":"InMotion Hosting Support Center","description":"Web Hosting Support &amp; Tutorials","publisher":{"@id":"https:\/\/www.inmotionhosting.com\/support\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inmotionhosting.com\/support\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.inmotionhosting.com\/support\/#organization","name":"InMotion Hosting","url":"https:\/\/www.inmotionhosting.com\/support\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/logo\/image\/","url":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2023\/02\/inmotion-hosting-logo-yoast.jpg","contentUrl":"https:\/\/www.inmotionhosting.com\/support\/wp-content\/uploads\/2023\/02\/inmotion-hosting-logo-yoast.jpg","width":696,"height":696,"caption":"InMotion Hosting"},"image":{"@id":"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inmotionhosting\/","https:\/\/x.com\/InMotionHosting"]},{"@type":"Person","@id":"https:\/\/www.inmotionhosting.com\/support\/#\/schema\/person\/87423443495bb1e33c4cbc0acd6d2c5d","name":"Todd Robinson","description":"I would really appreciate any thoughts and guidance you might want to share. Please connect with me on LinkedIn or leave a comment below with requests or questions \u2014 even corrections if I managed to mess up something!","sameAs":["https:\/\/www.linkedin.com\/in\/toddrobinson2\/"],"url":"https:\/\/www.inmotionhosting.com\/support\/author\/todd_r\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"primary_category":{"id":4309,"name":"Git","slug":"git","link":"https:\/\/www.inmotionhosting.com\/support\/website\/git\/"},"_links":{"self":[{"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/posts\/130676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/users\/28953"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/comments?post=130676"}],"version-history":[{"count":9,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/posts\/130676\/revisions"}],"predecessor-version":[{"id":130700,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/posts\/130676\/revisions\/130700"}],"wp:attachment":[{"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/media?parent=130676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/categories?post=130676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inmotionhosting.com\/support\/wp-json\/wp\/v2\/tags?post=130676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}