{"id":410,"date":"2024-11-21T23:36:21","date_gmt":"2024-11-21T22:36:21","guid":{"rendered":"https:\/\/www.systemdeveloper.nl\/tech\/?p=410"},"modified":"2024-12-01T14:49:12","modified_gmt":"2024-12-01T13:49:12","slug":"simplify-your-server-deployments-with-a-smart-installation-script","status":"publish","type":"post","link":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/","title":{"rendered":"Simplify Your Server Deployments with a Smart Installation Script"},"content":{"rendered":"<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Server deployments can be tedious, especially when you need to configure each server manually. Tasks like setting up directories, copying scripts, installing dependencies, and scheduling periodic jobs can be repetitive and error-prone.<\/p>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Wouldn&rsquo;t it be great if all of this could be handled with a single command? That&rsquo;s where a robust installation script comes in. In this post, we&rsquo;ll walk through how to create a flexible and secure installation script for your server-side applications. As a bonus, we&rsquo;ll demonstrate how you can execute the installation with a single-line command. It&#8217;s a basic version of an install script that you can use as an template for your own installs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<h3 class=\"wp-block-heading\" id=\"the-power-of-an-installation-script\"><strong>The Power of an Installation Script<\/strong><\/h3>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">A well-designed installation script brings several advantages:<\/p>\n\n\n<ul class=\"wp-block-list wp-block-list\">\n<li>\n<strong>Consistency<\/strong>: Ensures the same setup across multiple servers.<\/li>\n\n\n\n<li>\n<strong>Efficiency<\/strong>: Saves time by automating repetitive tasks.<\/li>\n\n\n\n<li>\n<strong>Flexibility<\/strong>: Allows customization for different environments or configurations.<\/li>\n\n\n\n<li>\n<strong>Ease of Use<\/strong>: Makes it easy for others to install and run your software.<\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">In this guide, we&rsquo;ll focus on a real-world example: deploying a monitoring agent to multiple servers. The same principles can be applied to virtually any server-side application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<h3 class=\"wp-block-heading\" id=\"building-the-script\"><strong>Building the Script<\/strong><\/h3>\n\n\n<h4 class=\"wp-block-heading\" id=\"1-start-with-dependencies\"><strong>1. Start with Dependencies<\/strong><\/h4>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">The script should first check if all required tools are installed, such as <code>curl<\/code> and <code>jq<\/code>. If they&rsquo;re missing, the script installs them automatically.<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>if ! command -v curl &gt;\/dev\/null 2&gt;&amp;1 || ! command -v jq &gt;\/dev\/null 2&gt;&amp;1; then\n    echo \"Installing required tools: curl and jq\"\n    if [ -f \/etc\/debian_version ]; then\n        sudo apt update &amp;&amp; sudo apt install -y curl jq\n    elif [ -f \/etc\/redhat-release ]; then\n        sudo yum install -y curl jq\n    else\n        echo \"Unsupported OS. Please install 'curl' and 'jq' manually.\"\n        exit 1\n    fi\nfi<\/textarea>\n<\/div><code>if ! command -v curl &gt;\/dev\/null 2&gt;&amp;1 || ! command -v jq &gt;\/dev\/null 2&gt;&amp;1; then\n    echo \"Installing required tools: curl and jq\"\n    if [ -f \/etc\/debian_version ]; then\n        sudo apt update &amp;&amp; sudo apt install -y curl jq\n    elif [ -f \/etc\/redhat-release ]; then\n        sudo yum install -y curl jq\n    else\n        echo \"Unsupported OS. Please install 'curl' and 'jq' manually.\"\n        exit 1\n    fi\nfi<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"2-automate-configuration\"><strong>2. Automate Configuration<\/strong><\/h4>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">A configuration file is crucial for storing environment-specific settings like API keys or endpoint URLs. Here&rsquo;s how to create one dynamically:<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>cat &gt; \/opt\/agent\/agent.conf <\/textarea>\n<\/div><code>cat &gt; \/opt\/agent\/agent.conf &lt;&lt;EOL\nAPI_KEY=\"your-api-key\"\nBASE_URL=\"https:\/\/your-api-url\"\nAPI_URL=\"${BASE_URL}\/api\/agent_checks\"\nSUBMIT_URL=\"${BASE_URL}\/api\/submit\"\nDEBUG=true\nLOG_FILE=\"\/var\/log\/agent.log\"\nEOL<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"3-handle-files-and-directories\"><strong>3. Handle Files and Directories<\/strong><\/h4>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">The script creates the necessary directories, copies the main agent script, and ensures proper permissions:<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>mkdir -p \/opt\/agent\ncp agent.sh \/opt\/agent\/\nchmod +x \/opt\/agent\/agent.sh\ntouch \/var\/log\/agent.log\nchmod 644 \/var\/log\/agent.log<\/textarea>\n<\/div><code>mkdir -p \/opt\/agent\ncp agent.sh \/opt\/agent\/\nchmod +x \/opt\/agent\/agent.sh\ntouch \/var\/log\/agent.log\nchmod 644 \/var\/log\/agent.log<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"4-schedule-the-agent\"><strong>4. Schedule the Agent<\/strong><\/h4>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Adding a cronjob ensures the agent runs periodically:<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>CRON_CMD=\"* * * * * root \/opt\/agent\/agent.sh &gt; \/dev\/null 2&gt;&amp;1\"\nif ! grep -q \"$CRON_CMD\" \/etc\/crontab; then\n    echo \"$CRON_CMD\" &gt;&gt; \/etc\/crontab\nfi<\/textarea>\n<\/div><code>CRON_CMD=\"* * * * * root \/opt\/agent\/agent.sh &gt; \/dev\/null 2&gt;&amp;1\"\nif ! grep -q \"$CRON_CMD\" \/etc\/crontab; then\n    echo \"$CRON_CMD\" &gt;&gt; \/etc\/crontab\nfi<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"5-wrap-it-all-up\"><strong>5. Wrap It All Up<\/strong><\/h4>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Finally, combine everything into a single script (<code>install_agent.sh<\/code>) that runs these steps sequentially:<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>#!\/bin\/bash\n\nif [ $# -ne 2 ]; then\n    echo \"Usage: $0 <api_key> <base_url>\"\n    exit 1\nfi\n\nAPI_KEY=$1\nBASE_URL=$2\n\n# Install dependencies\nif ! command -v curl &gt;\/dev\/null 2&gt;&amp;1 || ! command -v jq &gt;\/dev\/null 2&gt;&amp;1; then\n    sudo apt update &amp;&amp; sudo apt install -y curl jq\nfi\n\n# Create directories and files\nmkdir -p \/opt\/agent\ncp agent.sh \/opt\/agent\/\nchmod +x \/opt\/agent\/agent.sh\n\n# Create configuration file\ncat &gt; \/opt\/agent\/agent.conf  \/dev\/null 2&gt;&amp;1\"\nif ! grep -q \"$CRON_CMD\" \/etc\/crontab; then\n    echo \"$CRON_CMD\" &gt;&gt; \/etc\/crontab\nfi\n\necho \"Installation completed successfully!\"<\/base_url><\/api_key><\/textarea>\n<\/div><code>#!\/bin\/bash\n\nif [ $# -ne 2 ]; then\n    echo \"Usage: $0 &lt;API_KEY&gt; &lt;BASE_URL&gt;\"\n    exit 1\nfi\n\nAPI_KEY=$1\nBASE_URL=$2\n\n# Install dependencies\nif ! command -v curl &gt;\/dev\/null 2&gt;&amp;1 || ! command -v jq &gt;\/dev\/null 2&gt;&amp;1; then\n    sudo apt update &amp;&amp; sudo apt install -y curl jq\nfi\n\n# Create directories and files\nmkdir -p \/opt\/agent\ncp agent.sh \/opt\/agent\/\nchmod +x \/opt\/agent\/agent.sh\n\n# Create configuration file\ncat &gt; \/opt\/agent\/agent.conf &lt;&lt;EOL\nAPI_KEY=\"$API_KEY\"\nBASE_URL=\"$BASE_URL\"\nAPI_URL=\"${BASE_URL}\/api\/agent_checks\"\nSUBMIT_URL=\"${BASE_URL}\/api\/submit\"\nDEBUG=true\nLOG_FILE=\"\/var\/log\/agent.log\"\nEOL\n\ntouch \/var\/log\/agent.log\nchmod 644 \/var\/log\/agent.log\n\n# Add cronjob\nCRON_CMD=\"* * * * * root \/opt\/agent\/agent.sh &gt; \/dev\/null 2&gt;&amp;1\"\nif ! grep -q \"$CRON_CMD\" \/etc\/crontab; then\n    echo \"$CRON_CMD\" &gt;&gt; \/etc\/crontab\nfi\n\necho \"Installation completed successfully!\"<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"deploying-the-script-with-a-one-liner\"><strong>Deploying the Script with a One-Liner<\/strong><\/h3>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">To make installation even easier, host your <code>install_agent.sh<\/code> and <code>agent.sh<\/code> files on a GitHub repository or a secure server. Then use a single-line command to download and run the installation script:<\/p>\n\n\n<pre class=\"wp-block-code\"><div class=\"copy-to-clipboard\">\n<span>Copied!<\/span><button class=\"click-to-copy-button\" title=\"Copy to clipboard\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 32 32\" stroke=\"currentcolor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"24\" height=\"24\" fill=\"none\">\n  <path d=\"M12.9975 10.7499L11.7475 10.7499C10.6429 10.7499 9.74747 11.6453 9.74747 12.7499L9.74747 21.2499C9.74747 22.3544 10.6429 23.2499 11.7475 23.2499L20.2475 23.2499C21.352 23.2499 22.2475 22.3544 22.2475 21.2499L22.2475 12.7499C22.2475 11.6453 21.352 10.7499 20.2475 10.7499L18.9975 10.7499Z\"><\/path>\n  <path d=\"M17.9975 12.2499L13.9975 12.2499C13.4452 12.2499 12.9975 11.8022 12.9975 11.2499L12.9975 9.74988C12.9975 9.19759 13.4452 8.74988 13.9975 8.74988L17.9975 8.74988C18.5498 8.74988 18.9975 9.19759 18.9975 9.74988L18.9975 11.2499C18.9975 11.8022 18.5498 12.2499 17.9975 12.2499Z\"><\/path>\n  <path d=\"M13.7475 16.2499L18.2475 16.2499\"><\/path>\n  <path d=\"M13.7475 19.2499L18.2475 19.2499\"><\/path>\n<\/svg><\/button><textarea>curl -sSL https:\/\/raw.githubusercontent.com\/your-repo\/install_agent.sh | bash -s -- your-api-key base_url<\/textarea>\n<\/div><code>curl -sSL https:\/\/raw.githubusercontent.com\/your-repo\/install_agent.sh | bash -s -- your-api-key base_url<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Replace <code>your-repo<\/code> with your repository URL and <code>your-api-key<\/code> with the appropriate key for the server.<\/p>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">An installation script like this simplifies deployments, reduces errors, and ensures consistency across servers. Whether you&rsquo;re deploying a monitoring agent, a web application, or any server-side tool, the principles remain the same.<\/p>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">By combining automation with flexibility, you make life easier not only for yourself but also for anyone else who needs to use your software.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\">Feel free to customize this script and adapt it to your needs.<\/p>\n\n\n<p class=\"wp-block-paragraph wp-block-paragraph\" style=\"\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Server deployments can be tedious, especially when you need to configure each server manually. Tasks like setting up directories, copying scripts, installing dependencies, and scheduling periodic jobs can be repetitive and error-prone. Wouldn&rsquo;t it be great if all of this could be handled with a single command? That&rsquo;s where a robust installation script comes in. &hellip;<\/p>\n","protected":false},"author":1,"featured_media":411,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,52,16],"tags":[],"class_list":["post-410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-howto","category-programming","category-tech-innovation"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL<\/title>\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.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL\" \/>\n<meta property=\"og:description\" content=\"Server deployments can be tedious, especially when you need to configure each server manually. Tasks like setting up directories, copying scripts, installing dependencies, and scheduling periodic jobs can be repetitive and error-prone. Wouldn&rsquo;t it be great if all of this could be handled with a single command? That&rsquo;s where a robust installation script comes in. &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/\" \/>\n<meta property=\"og:site_name\" content=\"SystemDeveloper.NL\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/quan.tora.16\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-21T22:36:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-01T13:49:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"John Timmer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"John Timmer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/\"},\"author\":{\"name\":\"John Timmer\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#\\\/schema\\\/person\\\/5760c2ed5300c56d8ef01dfb00a9763b\"},\"headline\":\"Simplify Your Server Deployments with a Smart Installation Script\",\"datePublished\":\"2024-11-21T22:36:21+00:00\",\"dateModified\":\"2024-12-01T13:49:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/\"},\"wordCount\":416,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp\",\"articleSection\":[\"Howto\",\"Programming\",\"Tech Innovation\"],\"inLanguage\":\"en\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/\",\"name\":\"Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp\",\"datePublished\":\"2024-11-21T22:36:21+00:00\",\"dateModified\":\"2024-12-01T13:49:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#breadcrumb\"},\"inLanguage\":\"en\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp\",\"contentUrl\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp\",\"width\":1024,\"height\":768,\"caption\":\"Simplify Your Server Deployments with a Smart Installation Script\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/simplify-your-server-deployments-with-a-smart-installation-script\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Simplify Your Server Deployments with a Smart Installation Script\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#website\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/\",\"name\":\"www.systemdeveloper.nl\",\"description\":\"NextGen IT\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#organization\",\"name\":\"www.systemdeveloper.nl\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/qt-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/qt-logo.png\",\"width\":1346,\"height\":1230,\"caption\":\"www.systemdeveloper.nl\"},\"image\":{\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/quan.tora.16\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/#\\\/schema\\\/person\\\/5760c2ed5300c56d8ef01dfb00a9763b\",\"name\":\"John Timmer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en\",\"@id\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg\",\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg\",\"caption\":\"John Timmer\"},\"sameAs\":[\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\"],\"url\":\"https:\\\/\\\/www.systemdeveloper.nl\\\/tech\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL","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.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/","og_locale":"en_US","og_type":"article","og_title":"Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL","og_description":"Server deployments can be tedious, especially when you need to configure each server manually. Tasks like setting up directories, copying scripts, installing dependencies, and scheduling periodic jobs can be repetitive and error-prone. Wouldn&rsquo;t it be great if all of this could be handled with a single command? That&rsquo;s where a robust installation script comes in. &hellip;","og_url":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/","og_site_name":"SystemDeveloper.NL","article_publisher":"https:\/\/www.facebook.com\/quan.tora.16","article_published_time":"2024-11-21T22:36:21+00:00","article_modified_time":"2024-12-01T13:49:12+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp","type":"image\/webp"}],"author":"John Timmer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"John Timmer","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#article","isPartOf":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/"},"author":{"name":"John Timmer","@id":"https:\/\/www.systemdeveloper.nl\/tech\/#\/schema\/person\/5760c2ed5300c56d8ef01dfb00a9763b"},"headline":"Simplify Your Server Deployments with a Smart Installation Script","datePublished":"2024-11-21T22:36:21+00:00","dateModified":"2024-12-01T13:49:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/"},"wordCount":416,"commentCount":0,"publisher":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/#organization"},"image":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp","articleSection":["Howto","Programming","Tech Innovation"],"inLanguage":"en","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/","url":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/","name":"Simplify Your Server Deployments with a Smart Installation Script - SystemDeveloper.NL","isPartOf":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#primaryimage"},"image":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp","datePublished":"2024-11-21T22:36:21+00:00","dateModified":"2024-12-01T13:49:12+00:00","breadcrumb":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#breadcrumb"},"inLanguage":"en","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/"]}]},{"@type":"ImageObject","inLanguage":"en","@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#primaryimage","url":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp","contentUrl":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/56105c92-496c-4241-be3a-7bd57f413974-e1732228554972.webp","width":1024,"height":768,"caption":"Simplify Your Server Deployments with a Smart Installation Script"},{"@type":"BreadcrumbList","@id":"https:\/\/www.systemdeveloper.nl\/tech\/simplify-your-server-deployments-with-a-smart-installation-script\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.systemdeveloper.nl\/tech\/"},{"@type":"ListItem","position":2,"name":"Simplify Your Server Deployments with a Smart Installation Script"}]},{"@type":"WebSite","@id":"https:\/\/www.systemdeveloper.nl\/tech\/#website","url":"https:\/\/www.systemdeveloper.nl\/tech\/","name":"www.systemdeveloper.nl","description":"NextGen IT","publisher":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.systemdeveloper.nl\/tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en"},{"@type":"Organization","@id":"https:\/\/www.systemdeveloper.nl\/tech\/#organization","name":"www.systemdeveloper.nl","url":"https:\/\/www.systemdeveloper.nl\/tech\/","logo":{"@type":"ImageObject","inLanguage":"en","@id":"https:\/\/www.systemdeveloper.nl\/tech\/#\/schema\/logo\/image\/","url":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/qt-logo.png","contentUrl":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/qt-logo.png","width":1346,"height":1230,"caption":"www.systemdeveloper.nl"},"image":{"@id":"https:\/\/www.systemdeveloper.nl\/tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/quan.tora.16"]},{"@type":"Person","@id":"https:\/\/www.systemdeveloper.nl\/tech\/#\/schema\/person\/5760c2ed5300c56d8ef01dfb00a9763b","name":"John Timmer","image":{"@type":"ImageObject","inLanguage":"en","@id":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg","url":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg","contentUrl":"https:\/\/www.systemdeveloper.nl\/tech\/wp-content\/uploads\/2024\/11\/cropped-D6E27035-6864-4270-8D72-0D8C0C59F370-96x96.jpeg","caption":"John Timmer"},"sameAs":["https:\/\/www.systemdeveloper.nl\/tech"],"url":"https:\/\/www.systemdeveloper.nl\/tech\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/posts\/410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/comments?post=410"}],"version-history":[{"count":1,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/posts\/410\/revisions"}],"predecessor-version":[{"id":412,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/posts\/410\/revisions\/412"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/media\/411"}],"wp:attachment":[{"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/media?parent=410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/categories?post=410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.systemdeveloper.nl\/tech\/wp-json\/wp\/v2\/tags?post=410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}