{"id":1620,"date":"2025-07-21T20:05:21","date_gmt":"2025-07-21T17:05:21","guid":{"rendered":"https:\/\/rx-name.net\/blog\/?p=1620"},"modified":"2025-10-07T12:45:37","modified_gmt":"2025-10-07T09:45:37","slug":"server-automation-with-cloud-init-and-deploying-a-svelte-app","status":"publish","type":"post","link":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app","title":{"rendered":"Server Automation with cloud-init and Deploying a Svelte App"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" data-attachment-id=\"2547\" data-permalink=\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\/server-automation-with-cloud-init-and-deploying-a-svelte-app-2\" data-orig-file=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App.png\" data-orig-size=\"1536,1024\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-300x200.png\" data-large-file=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1024x683.png\" src=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1024x683.png\" alt=\"A person works at a laptop with the Svelte logo, next to which are depicted servers, cloud storage, and automation icons.\" class=\"wp-image-2547\" srcset=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1024x683.png 1024w, https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-300x200.png 300w, https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-768x512.png 768w, https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-900x600.png 900w, https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1280x853.png 1280w, https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Infrastructure automation makes it easier to deploy modern web applications<\/figcaption><\/figure>\n\n\n\n<p>Imagine launching a new server, and within minutes it&#8217;s fully configured and ready to work \u2014 without a single manual action. Sounds unbelievable? But it&#8217;s a reality thanks to the cloud-init tool. This technology allows you to automatically configure a server right after launch by passing all the required parameters through a special configuration file. As a result, the system itself installs the necessary packages, sets up the web server, updates the OS, and even starts your app \u2014 all without administrator involvement.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>In the <a href=\"https:\/\/rx-name.net\">RX-NAME<\/a> service, cloud-init capabilities are available right from the control panel. You can use them in just a few clicks, making server deployment as fast, reliable, and convenient as possible for developers and businesses.<\/p>\n\n\n\n<p><strong>User-data usage examples<\/strong><\/p>\n\n\n\n<p>Many IT resources provide examples of how to pass configuration data (user-data) during virtual machine launch for automatic server setup. Such cases often use scripts that install and configure the NGINX web server, install Node.js, and launch web applications. This approach allows you to define all security settings, reverse proxy configuration, and auto-start parameters for the application from the start. As a result, time-to-market is significantly reduced.<\/p>\n\n\n\n<p><strong>What is cloud-init and why is it important?<\/strong><\/p>\n\n\n\n<p>Cloud-init is a universal tool for automatic initialization of cloud servers. It enables a wide range of tasks:<\/p>\n\n\n\n<ul>\n<li><strong>Package installation and updates.<\/strong> With cloud-init, the server immediately gets all necessary tools (e.g., curl, git, apt-transport-https) to prepare the system for further operation.<br><\/li>\n\n\n\n<li><strong>NGINX web server setup.<\/strong> Configuration files are automatically created to ensure secure operation of NGINX and proper proxying of requests to the application.<br><\/li>\n\n\n\n<li><strong>Installing Node.js and dependencies.<\/strong> The script checks for the required versions of Node.js and npm, updates them if needed, and installs project dependencies.<br><\/li>\n\n\n\n<li><strong>Automatic application launch.<\/strong> Using systemd, you can add a unit file to launch your app as a service. This ensures it runs continuously and restarts automatically if it crashes.<br><\/li>\n<\/ul>\n\n\n\n<p>Thanks to these features, cloud-init eliminates human error, reduces misconfiguration risks, and significantly speeds up server deployment. For more details on the functions and advantages of cloud-init, visit our blog \u2014 we\u2019ve prepared a separate article on this topic.<\/p>\n\n\n\n<p><strong>Cloud-init script example for deploying a Svelte app<\/strong><\/p>\n\n\n\n<p>Let\u2019s take a real example: the configuration file below performs automatic deployment and setup of the web server, Node.js, and the Svelte application itself. Here\u2019s what happens, step by step:<\/p>\n\n\n\n<ol>\n<li><strong>Installing base packages.<\/strong> The packages section lists utilities (curl, git, apt-transport-https) that need to be installed at launch. This ensures the server has all tools to fetch keys, add repositories, and clone projects.<br><\/li>\n\n\n\n<li><strong>Creating configuration files.<\/strong> With the write_files directive, the script creates several config files:<br>\n<ul>\n<li>Security headers snippet for NGINX: adds a set of rules to protect the server from XSS, clickjacking, etc.<br><\/li>\n\n\n\n<li>Default site config: sets a basic page for testing NGINX without proxying.<br><\/li>\n\n\n\n<li>Reverse proxy config for the Svelte app: redirects requests to the app running on port 8080.<br><\/li>\n\n\n\n<li>Test HTML page: confirms proper operation of the web server.<br><\/li>\n\n\n\n<li>systemd unit file: defines a service for running and restarting the app automatically.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Executing commands (<\/strong><strong>runcmd<\/strong><strong>).<\/strong> This block lists the commands executed to configure the server step by step:<br>\n<ul>\n<li>Verifying presence of NGINX and Node.js: checks for existing installations and logs version info.<br><\/li>\n\n\n\n<li>Adding repository and installing NGINX: connects the official repo, installs the latest version, and verifies its operation.<br><\/li>\n\n\n\n<li>Installing Node.js v20: if missing or outdated, installs the latest version with npm.<br><\/li>\n\n\n\n<li>Cloning and building the Svelte app: downloads the example project from GitHub, installs dependencies, and assigns directory permissions.<br><\/li>\n\n\n\n<li>Starting via systemd: launches the service, checks availability on port 8080.<br><\/li>\n\n\n\n<li>Enabling Svelte app proxy config in NGINX: enables svelte_app_proxy, disables the default config, and restarts the server after checking syntax.<br><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>#cloud-config\npackages:\n- curl\n- git\n- apt-transport-https\n\nwrite_files:\n# Security headers snippet for nginx\n- path: \/etc\/nginx\/snippets\/security-headers.conf\n  permissions: '0644'\n  content: |\n    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n    add_header X-Frame-Options \"SAMEORIGIN\" always;\n    add_header X-XSS-Protection \"1; mode=block\" always;\n    add_header Referrer-Policy \"no-referrer\" always;\n    add_header Cache-Control \"no-cache, no-store, max-age=0, must-revalidate\" always;\n    add_header Pragma \"no-cache\" always;\n\n# Default nginx site configuration (without proxying)\n- path: \/etc\/nginx\/sites-available\/default\n  permissions: '0644'\n  content: |\n    server {\n        listen 80 default_server;\n        listen &#91;::]:80 default_server;\n        server_name localhost;\n        root \/var\/www\/html;\n        index index.html index.htm;\n        location \/ {\n            try_files $uri $uri\/ =404;\n            include \/etc\/nginx\/snippets\/security-headers.conf;\n        }\n    }\n\n# Nginx configuration for proxying requests to the Svelte app\n- path: \/etc\/nginx\/sites-available\/svelte_app_proxy\n  permissions: '0644'\n  content: |\n    server {\n        listen 80;\n        server_name localhost;\n        location \/ {\n            proxy_pass http:\/\/127.0.0.1:8080;\n            proxy_http_version 1.1;\n            proxy_set_header Upgrade $http_upgrade;\n            proxy_set_header Connection 'upgrade';\n            proxy_set_header Host $host;\n            proxy_cache_bypass $http_upgrade;\n            include \/etc\/nginx\/snippets\/security-headers.conf;\n        }\n    }\n\n# Simple default HTML page for nginx test\n- path: \/var\/www\/html\/index.html\n  permissions: '0644'\n  content: |\n    &lt;!DOCTYPE html&gt;\n    &lt;html&gt;\n      &lt;head&gt;\n        &lt;meta charset=\"UTF-8\"&gt;\n        &lt;title&gt;NGINX Test&lt;\/title&gt;\n      &lt;\/head&gt;\n      &lt;body&gt;\n        &lt;h1&gt;Welcome to NGINX!&lt;\/h1&gt;\n        &lt;p&gt;NGINX is running correctly!&lt;\/p&gt;\n      &lt;\/body&gt;\n    &lt;\/html&gt;\n\n# systemd unit file to run the Svelte app\n- path: \/etc\/systemd\/system\/svelte-app.service\n  permissions: '0644'\n  content: |\n    &#91;Unit]\n    Description=Svelte Application Service\n    After=network.target\n\n    &#91;Service]\n    WorkingDirectory=\/var\/www\/svelte-app\n    ExecStart=\/usr\/bin\/npx sirv public --no-clear --dev --host 127.0.0.1 --port 8080\n    Restart=always\n    User=www-data\n    Environment=NODE_ENV=production\n\n    &#91;Install]\n    WantedBy=multi-user.target\n\nruncmd:\n- |\n    LOG_FILE=\"\/var\/log\/cloud-init-custom.log\"\n    echo \"&#91;$(date)] *** Starting cloud-init script ***\" &gt;&gt; ${LOG_FILE}\n\n    # Check for nginx and Node.js\/npm\n    if command -v nginx &gt;\/dev\/null 2&gt;&amp;1; then\n        INSTALLED_NGINX=$(nginx -v 2&gt;&amp;1)\n        echo \"&#91;$(date)] NGINX is already installed: ${INSTALLED_NGINX}\" &gt;&gt; ${LOG_FILE}\n    else\n        echo \"&#91;$(date)] NGINX not found\" &gt;&gt; ${LOG_FILE}\n    fi\n\n    if command -v node &gt;\/dev\/null 2&gt;&amp;1; then\n        NODE_VER=$(node -v)\n        echo \"&#91;$(date)] Node.js is already installed: ${NODE_VER}\" &gt;&gt; ${LOG_FILE}\n    else\n        echo \"&#91;$(date)] Node.js not found\" &gt;&gt; ${LOG_FILE}\n    fi\n\n    if command -v npm &gt;\/dev\/null 2&gt;&amp;1; then\n        NPM_VER=$(npm -v)\n        echo \"&#91;$(date)] npm is already installed: ${NPM_VER}\" &gt;&gt; ${LOG_FILE}\n    else\n        echo \"&#91;$(date)] npm not found\" &gt;&gt; ${LOG_FILE}\n    fi\n\n    # Add official nginx repository and install the latest version\n    echo \"deb http:\/\/nginx.org\/packages\/ubuntu\/ ${UBUNTU_CODENAME:-jammy} nginx\" | sudo tee \/etc\/apt\/sources.list.d\/nginx.list\n    echo \"deb-src http:\/\/nginx.org\/packages\/ubuntu\/ ${UBUNTU_CODENAME:-jammy} nginx\" | sudo tee -a \/etc\/apt\/sources.list.d\/nginx.list\n    curl -fsSL https:\/\/nginx.org\/keys\/nginx_signing.key | sudo apt-key add -\n    sudo apt-get update &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n    sudo apt-get install -y nginx &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n    echo \"&#91;$(date)] NGINX installed: $(nginx -v 2&gt;&amp;1)\" &gt;&gt; ${LOG_FILE}\n\n    # Install Node.js v20\n    if command -v node &gt;\/dev\/null 2&gt;&amp;1; then\n        CURRENT_NODE=$(node -v | sed 's\/v\/\/')\n        if &#91; \"$(printf '%s\\n' \"20.0.0\" \"$CURRENT_NODE\" | sort -V | head -n1)\" = \"20.0.0\" ]; then\n            echo \"&#91;$(date)] Node.js is up to date ($CURRENT_NODE)\" &gt;&gt; ${LOG_FILE}\n        else\n            curl -fsSL https:\/\/deb.nodesource.com\/setup_20.x | sudo -E bash - &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n            sudo apt-get install -y nodejs &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n        fi\n    else\n        curl -fsSL https:\/\/deb.nodesource.com\/setup_20.x | sudo -E bash - &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n        sudo apt-get install -y nodejs &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n    fi\n\n    # Check npm installation\n    if ! command -v npm &gt;\/dev\/null 2&gt;&amp;1; then\n        echo \"&#91;$(date)] Error: npm is not installed\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    # Test nginx default config\n    sudo systemctl restart nginx\n    if ! sudo systemctl is-active --quiet nginx; then\n        echo \"&#91;$(date)] Failed to start nginx\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    HTTP_CODE=$(curl -s -o \/dev\/null -w \"%{http_code}\" http:\/\/127.0.0.1)\n    if &#91; \"$HTTP_CODE\" -ne 200 ]; then\n        echo \"&#91;$(date)] Default page did not return HTTP 200\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    # Clone and set up the Svelte app\n    SVELTE_DIR=\"\/var\/www\/svelte-app\"\n    if &#91; ! -d \"${SVELTE_DIR}\" ]; then\n        sudo git clone https:\/\/github.com\/sveltejs\/template ${SVELTE_DIR} &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n        sudo chown -R www-data:www-data ${SVELTE_DIR}\n    fi\n\n    cd ${SVELTE_DIR}\n    if &#91; -f package.json ]; then\n        npm install &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n    else\n        echo \"&#91;$(date)] package.json not found\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    # Start Svelte with systemd\n    sudo systemctl daemon-reload\n    sudo systemctl enable svelte-app.service &gt;&gt; ${LOG_FILE} 2&gt;&amp;1\n    sudo systemctl start svelte-app.service\n    sleep 5\n\n    if ! sudo systemctl is-active --quiet svelte-app.service; then\n        echo \"&#91;$(date)] Failed to start Svelte app\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    SVELTE_CODE=$(curl -s -o \/dev\/null -w \"%{http_code}\" http:\/\/127.0.0.1:8080)\n    if &#91; \"$SVELTE_CODE\" -ne 200 ]; then\n        echo \"&#91;$(date)] Svelte app did not return HTTP 200\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    # Enable nginx proxy config for Svelte\n    sudo mkdir -p \/etc\/nginx\/sites-enabled\n    sudo ln -sf \/etc\/nginx\/sites-available\/svelte_app_proxy \/etc\/nginx\/sites-enabled\/svelte_app_proxy\n    sudo rm -f \/etc\/nginx\/sites-enabled\/default\n\n    if ! grep -q \"include \/etc\/nginx\/sites-enabled\/*;\" \/etc\/nginx\/nginx.conf; then\n        sudo sed -i '\/include \\\/etc\\\/nginx\\\/conf.d\\\/\\*.conf;\/a include \/etc\/nginx\/sites-enabled\/*;' \/etc\/nginx\/nginx.conf\n    fi\n\n    sudo systemctl restart nginx\n\n    PROXY_CODE=$(curl -s -o \/dev\/null -w \"%{http_code}\" http:\/\/127.0.0.1)\n    if &#91; \"$PROXY_CODE\" -ne 200 ]; then\n        echo \"&#91;$(date)] Proxy via nginx failed\" &gt;&gt; ${LOG_FILE}\n        exit 1\n    fi\n\n    echo \"&#91;$(date)] *** Svelte app setup and configuration completed successfully ***\" &gt;&gt; ${LOG_FILE}\n\nfinal_message: \"Cloud-init completed. Check the log at \/var\/log\/cloud-init-custom.log for details.\"\n<\/code><\/pre>\n\n\n\n<p><strong>Svelte vs Nuxt vs Next: Framework comparison<\/strong><\/p>\n\n\n\n<p>When choosing a frontend framework, developers often consider Svelte, Nuxt, or Next. Each has its strengths and limitations.<\/p>\n\n\n\n<p><strong>Svelte<\/strong><\/p>\n\n\n\n<p>Pros:<\/p>\n\n\n\n<ul>\n<li>Compiles into pure JavaScript without a virtual DOM, making apps extremely lightweight and fast.<br><\/li>\n\n\n\n<li>Minimal code and high readability simplify development and maintenance.<br><\/li>\n\n\n\n<li>Intuitive syntax and low learning curve.<br><\/li>\n<\/ul>\n\n\n\n<p>Cons:<\/p>\n\n\n\n<ul>\n<li>Smaller ecosystem and fewer ready-made solutions compared to major frameworks.<br><\/li>\n\n\n\n<li>Fewer learning resources and examples for complex tasks compared to Nuxt and Next.<br><\/li>\n<\/ul>\n\n\n\n<p><strong>Nuxt<\/strong><\/p>\n\n\n\n<p>Pros:<\/p>\n\n\n\n<ul>\n<li>Built on Vue.js, making it appealing to those familiar with the Vue ecosystem.<br><\/li>\n\n\n\n<li>Has built-in server-side rendering (SSR) and static site generation features.<br><\/li>\n\n\n\n<li>Large, active community and well-developed plugin\/module ecosystem.<br><\/li>\n<\/ul>\n\n\n\n<p>Cons:<\/p>\n\n\n\n<ul>\n<li>More complex configuration and optimization than Svelte.<br><\/li>\n\n\n\n<li>Can require more resources for development and maintenance.<br><\/li>\n<\/ul>\n\n\n\n<p><strong>Next<\/strong><\/p>\n\n\n\n<p>Pros:<\/p>\n\n\n\n<ul>\n<li>Built on React, ensuring broad support and many ready-to-use components.<br><\/li>\n\n\n\n<li>Excellent support for SSR and static page generation.<br><\/li>\n\n\n\n<li>Mature ecosystem and proven usage in large projects.<br><\/li>\n<\/ul>\n\n\n\n<p>Cons:<\/p>\n\n\n\n<ul>\n<li>Might be too &#8220;heavy&#8221; for small projects where simplicity and development speed are more critical than scalability.<br><\/li>\n\n\n\n<li>More complex setup compared to Svelte.<br><\/li>\n<\/ul>\n\n\n\n<p><strong>Conclusions<\/strong><\/p>\n\n\n\n<p>Automated server configuration with cloud-init significantly reduces infrastructure deployment and setup time. It enables not only package installation and NGINX setup, but also the deployment of a modern Svelte-based application.<\/p>\n\n\n\n<p>Compared to Nuxt and Next, Svelte stands out for its simplicity, minimal code output, and high performance. However, for larger projects, Nuxt or Next is often preferred due to their richer ecosystems and additional capabilities.<\/p>\n\n\n\n<p>Thanks to the integration of cloud-init in the <a href=\"https:\/\/rx-name.net\">RX-NAME<\/a> user panel, you get a powerful automation tool to help you quickly and securely launch your projects. Try this approach and see for yourself how it simplifies the development and deployment process. For more details about cloud-init and other automation solutions, check out our blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine launching a new server, and within minutes it&#8217;s fully configured and ready to work \u2014 without a single manual action. Sounds unbelievable? But it&#8217;s a reality thanks to the cloud-init tool. This technology allows you to automatically configure a server right after launch by passing all the required parameters through a special configuration file. [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76],"tags":[220,221,222,223],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Server Automation with cloud-init and Deploying a Svelte App | Servers<\/title>\n<meta name=\"description\" content=\"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Server Automation with cloud-init and Deploying a Svelte App | Servers\" \/>\n<meta property=\"og:description\" content=\"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\" \/>\n<meta property=\"og:site_name\" content=\"Blog RX-NAME\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-21T17:05:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-07T09:45:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1024x683.png\" \/>\n<meta name=\"author\" content=\"Kateryna\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kateryna\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\",\"url\":\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\",\"name\":\"Server Automation with cloud-init and Deploying a Svelte App | Servers\",\"isPartOf\":{\"@id\":\"https:\/\/rx-name.net\/blog\/#website\"},\"datePublished\":\"2025-07-21T17:05:21+00:00\",\"dateModified\":\"2025-10-07T09:45:37+00:00\",\"author\":{\"@id\":\"https:\/\/rx-name.net\/blog\/#\/schema\/person\/a2f9a5b9038e887cc0714972a8a84b30\"},\"description\":\"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.\",\"breadcrumb\":{\"@id\":\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\",\"item\":\"https:\/\/rx-name.net\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Server Automation with cloud-init and Deploying a Svelte App\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rx-name.net\/blog\/#website\",\"url\":\"https:\/\/rx-name.net\/blog\/\",\"name\":\"Blog RX-NAME\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rx-name.net\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/rx-name.net\/blog\/#\/schema\/person\/a2f9a5b9038e887cc0714972a8a84b30\",\"name\":\"Kateryna\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/rx-name.net\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/890b52838125737d7c640df90b98615b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/890b52838125737d7c640df90b98615b?s=96&d=mm&r=g\",\"caption\":\"Kateryna\"},\"url\":\"https:\/\/rx-name.net\/blog\/author\/ekaterina\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Server Automation with cloud-init and Deploying a Svelte App | Servers","description":"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.","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:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app","og_locale":"en_US","og_type":"article","og_title":"Server Automation with cloud-init and Deploying a Svelte App | Servers","og_description":"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.","og_url":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app","og_site_name":"Blog RX-NAME","article_published_time":"2025-07-21T17:05:21+00:00","article_modified_time":"2025-10-07T09:45:37+00:00","og_image":[{"url":"https:\/\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Server-Automation-with-cloud-init-and-Deploying-a-Svelte-App-1024x683.png"}],"author":"Kateryna","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kateryna","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app","url":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app","name":"Server Automation with cloud-init and Deploying a Svelte App | Servers","isPartOf":{"@id":"https:\/\/rx-name.net\/blog\/#website"},"datePublished":"2025-07-21T17:05:21+00:00","dateModified":"2025-10-07T09:45:37+00:00","author":{"@id":"https:\/\/rx-name.net\/blog\/#\/schema\/person\/a2f9a5b9038e887cc0714972a8a84b30"},"description":"\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0442 21.07.2025 \u23e9 Server Automation with cloud-init and Deploying a Svelte App \u26a1 \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abServers\u00bb. \u2b50 RX-NAME - \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0443\u0441\u043b\u0443\u0433.","breadcrumb":{"@id":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rx-name.net\/blog\/server-automation-with-cloud-init-and-deploying-a-svelte-app#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/rx-name.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Server Automation with cloud-init and Deploying a Svelte App"}]},{"@type":"WebSite","@id":"https:\/\/rx-name.net\/blog\/#website","url":"https:\/\/rx-name.net\/blog\/","name":"Blog RX-NAME","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rx-name.net\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/rx-name.net\/blog\/#\/schema\/person\/a2f9a5b9038e887cc0714972a8a84b30","name":"Kateryna","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rx-name.net\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/890b52838125737d7c640df90b98615b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/890b52838125737d7c640df90b98615b?s=96&d=mm&r=g","caption":"Kateryna"},"url":"https:\/\/rx-name.net\/blog\/author\/ekaterina"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8q4Vv-q8","jetpack-related-posts":[{"id":1639,"url":"https:\/\/rx-name.net\/blog\/how-to-set-up-kubernetes-on-a-vps","url_meta":{"origin":1620,"position":0},"title":"How to Set Up Kubernetes on a VPS","date":"30.07.2025","format":false,"excerpt":"Setting up Kubernetes on a VPS for a quick project start Containerization is the modern standard for deploying and managing applications. And Kubernetes (K8s) is the leading platform for automating the deployment, scaling, and management of containerized workloads. If you're already using VPS infrastructure or planning to rent a server\u2026","rel":"","context":"In &quot;Servers&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/How-to-Set-Up-Kubernetes-on-a-VPS.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1430,"url":"https:\/\/rx-name.net\/blog\/top-5-free-control-panels-for-vps-servers","url_meta":{"origin":1620,"position":1},"title":"Top 5 Free Control Panels for VPS Servers","date":"06.11.2024","format":false,"excerpt":"Best free control panels for VPS servers Managing a VPS server is not always easy, especially if you are new to this field. However, even experienced users appreciate when routine tasks are automated, and server management becomes as convenient as possible. That\u2019s exactly what control panels are designed for. In\u2026","rel":"","context":"In &quot;Servers&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Top-5-Free-Control-Panels-for-VPS-Servers.webp?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":869,"url":"https:\/\/rx-name.net\/blog\/devops-engineer-a-profession-that-bridges-programmers-and-system-administrators","url_meta":{"origin":1620,"position":2},"title":"DevOps Engineer: a profession that bridges programmers and system administrators","date":"08.08.2023","format":false,"excerpt":"A DevOps engineer combines the skills of a programmer and a system administrator The modern technological landscape creates new opportunities for the functioning of various industries, which in turn requires constant refinement and optimization of their work. In this context, the profession of a DevOps Engineer (Development and Operations Engineer)\u2026","rel":"","context":"In &quot;Other&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/DevOps-Engineer-a-profession-that-bridges-programmers-and-system-administrators.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":2891,"url":"https:\/\/rx-name.net\/blog\/why-virtual-hosting-handles-the-human-factor-better","url_meta":{"origin":1620,"position":3},"title":"Why Virtual Hosting Handles the Human Factor Better","date":"16.01.2026","format":false,"excerpt":"Automation as a key factor in the stability of online projects In any technical system, the human factor remains one of the main causes of failures. Even the most experienced specialists can make mistakes, and haste or fatigue can lead to incorrect settings, file deletion, or faulty updates. For website\u2026","rel":"","context":"In &quot;Servers&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2026\/01\/Why-Virtual-Hosting-Handles-the-Human-Factor-Better.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1626,"url":"https:\/\/rx-name.net\/blog\/24-7-server-monitoring-review-of-free-and-paid-tools","url_meta":{"origin":1620,"position":4},"title":"24\/7 Server Monitoring. Review of Free and Paid Tools","date":"24.07.2025","format":false,"excerpt":"24\/7 server monitoring ensures system stability and security Continuous uptime is the backbone of trust for any online project. A server that crashes overnight or throws critical errors without alerts can cost you not only customers but your reputation as well. To avoid this, implementing 24\/7 server monitoring is a\u2026","rel":"","context":"In &quot;Services&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/247-Server-Monitoring.-Review-of-Free-and-Paid-Tools.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1651,"url":"https:\/\/rx-name.net\/blog\/cloud-technologies-and-vps-management-via-the-rx-name-suo-panel","url_meta":{"origin":1620,"position":5},"title":"Cloud Technologies and VPS Management via the RX\u2011NAME SU\u041e Panel","date":"05.08.2025","format":false,"excerpt":"A modern approach to working with VPS and online services In recent years, cloud technologies have become the foundation for most modern IT services. For businesses and developers, this means not only high-speed access to resources but also the convenience of managing them from anywhere in the world. One of\u2026","rel":"","context":"In &quot;Company&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rx-name.net\/blog\/wp-content\/uploads\/2025\/09\/Cloud-Technologies-and-VPS-Management-via-the-RX-NAME-SUO-Panel.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/posts\/1620"}],"collection":[{"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/comments?post=1620"}],"version-history":[{"count":2,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/posts\/1620\/revisions"}],"predecessor-version":[{"id":2548,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/posts\/1620\/revisions\/2548"}],"wp:attachment":[{"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/media?parent=1620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/categories?post=1620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rx-name.net\/blog\/wp-json\/wp\/v2\/tags?post=1620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}