
{"id":39,"date":"2025-06-20T23:22:20","date_gmt":"2025-06-20T21:22:20","guid":{"rendered":"https:\/\/stayno.com\/?p=39"},"modified":"2025-06-21T10:40:55","modified_gmt":"2025-06-21T08:40:55","slug":"vagrant-for-web-dev-environment","status":"publish","type":"post","link":"https:\/\/stayno.com\/index.php\/2025\/06\/20\/vagrant-for-web-dev-environment\/","title":{"rendered":"Vagrant for web dev environment"},"content":{"rendered":"\n<p>This all started by surfing around the internet when I saw something about spinning developer environments on VMs. Just a quick look around lead me to Vagramt and yes in that quick search I also saw that a lot of people asked the question &#8220;is it really useful in the age of containers?&#8221;. Well you have to answer that question for yourself I can just offer you, hopefully ,some code and comments that will help you create a quick virtual machine running Ubuntu 24.04 desktop with Apache 2, MySQL, php, phpmyadmin, composer, Google Chrome, VS Code. A very basic staging web development environment.<\/p>\n\n\n\n<p>I must say that while playing around with this project the host machine was a laptop with Windows and I for the guest machine I chose Ubuntu mainly because Vagrant seemed not to like Windows as a guest machine as much and also Ubuntu has plenty of documentation and tutorials online. Nevertheless the vagrant file, ideas and concept of the code should be transferable to other operating systems for the better part of it.<\/p>\n\n\n\n<p>First we start by download and installing the requirements<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.hashicorp.com\/vagrant\/install\" data-type=\"link\" data-id=\"https:\/\/developer.hashicorp.com\/vagrant\/install\">Vagrant<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.virtualbox.org\/wiki\/Downloads\" data-type=\"link\" data-id=\"https:\/\/www.virtualbox.org\/wiki\/Downloads\">VirtualBox<\/a><\/li>\n<\/ul>\n\n\n\n<p>Create a directory holding you Vagrant project files somewhere of your choice<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir vagrant_project<\/code><\/pre>\n\n\n\n<p>Change to that directory and initialize the vagrant project<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant init<\/code><\/pre>\n\n\n\n<p>This will create a file name &#8220;Vagrantfile&#8221;. Open it with any editor and change its contents.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/Stayno-Cheffr\/vagrant_project\/blob\/main\/Vagrantfile\" data-type=\"link\" data-id=\"https:\/\/github.com\/Stayno-Cheffr\/vagrant_project\/blob\/main\/Vagrantfile\">GitHub Vagrant file code<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# function to get the VirtualBox installation path\ndef virtualbox_install_path()\n  vboxinst_path = ENV&#91;\"VBOX_INSTALL_PATH\"] || ENV&#91;\"VBOX_MSI_INSTALL_PATH\"] || ENV&#91;\"VBOX_INSTALLER_PATH\"]\n  if vboxinst_path != nil\n      return vboxinst_path\n   else\n      return nil\n   end\nend\n\n# function to get the VirtualBox version not used in this Vagrantfile but nice to have for inspiration\ndef virtualbox_version()\n  vbox_manage_path = virtualbox_install_path() + \"VBoxManage\"\n  vbox_version = `\"#{vbox_manage_path}\" --version`\n  clean_version = \/&#91;0-9]+\\.&#91;0-9]+\\.&#91;0-9]+\/.match(vbox_version)\n  puts(clean_version)\n  if vbox_version != nil\n      return clean_version&#91;0]\n   else\n      return nil\n   end\nend\n\n# Variables used in the setup of MySQL database and phpMyAdmin\nDBHOST='localhost'\nDBNAME='vmdevagrant'\nDBUSER='vagrantuser'\nDBPASSWD='vagrantpass'\n\n# All Vagrant configuration is done below. The \"2\" in Vagrant.configure\n# configures the configuration version (we support older styles for\n# backwards compatibility). Please don't change it unless you know what\n# you're doing.\nVagrant.configure(\"2\") do |config|\n  # The most common configuration options are documented and commented below.\n  # For a complete reference, please see the online documentation at\n  # https:\/\/docs.vagrantup.com.\n\n  # Every Vagrant development environment requires a box. You can search for\n  # boxes at https:\/\/vagrantcloud.com\/search.\n\n  # Vagrant uses so called boxes that are essentially an image of the Operating System you can discover more at the link above.\n  # This box is based on Ubuntu 24.04 LTS Desktop and has the following features: Mozilla Firefox, App Center, LibreOffice and is pretty stabe in my experience.\n  config.vm.box = \"gusztavvargadr\/ubuntu-desktop-2404-lts\"\n  config.vm.box_version = \"2404.0.2505\"\n\n  # Set the hostname of the VM to \"WebDevEnv\"\n  config.vm.hostname = \"WebDevEnv\"\n  config.vm.define \"staging\"\n  config.vm.provider :virtualbox do |vb|\n    vb.name = \"WebDevEnv\"\n  end\n\n  # Set the maximum boot timeout to 1200 seconds ( 20 minutes ) to allow the VM to boot up completely.\n  # This is useful for slower machines or when the VM takes longer to start.\n  config.vm.boot_timeout = 120\n  \n  # This line ensures that Vagrant checks for updates to the base box\n  # every time you run 'vagrant up'. If a newer version of the box is\n  # available, Vagrant will notify you so you can choose to update.\n  config.vm.box_check_update = true\n\n  # Create a forwarded port mapping which allows access to a specific port\n  # within the machine from a port on the host machine. In the example below,\n  # accessing \"localhost:8080\" will access port 80 on the guest machine.\n  # NOTE: This will enable public access to the opened port\n  # config.vm.network \"forwarded_port\", guest: 80, host: 8080\n\n  # Create a forwarded port mapping which allows access to a specific port\n  # within the machine from a port on the host machine and only allow access\n  # via 127.0.0.1 to disable public access\n  #config.vm.network \"forwarded_port\", guest: 3389, host: 3389, host_ip: \"127.0.0.1\"\n\n  # Create a private network, which allows host-only access to the machine\n  # using a specific IP.\n  # You can find mask dhcp ip lower and upper values in the VirtualBox network settings on the host machine.\n  config.vm.network \"private_network\", type: \"dhcp\", netmask: \"255.255.255.0\", dhcp_ip:\"192.168.56.100\", dhcp_lower: \"192.168.56.101\", dhcp_upper:\"192.168.56.254\"\n\n  # Create a public network, which generally matched to bridged network.\n  # Bridged networks make the machine appear as another physical device on\n  # your network.\n  # config.vm.network \"public_network\"\n\n  # Share an additional folder to the guest VM. The first argument is\n  # the path on the host to the actual folder. The second argument is\n  # the path on the guest to mount the folder. And the optional third\n  # argument is a set of non-required options.\n  # config.vm.synced_folder \"..\/data\", \"\/vagrant_data\"\n\n  # Disable the default share of the current code directory. Doing this\n  # provides improved isolation between the vagrant box and your host\n  # by making sure your Vagrantfile isn't accessible to the vagrant box.\n  # If you use this you may want to enable additional shared subfolders as\n  # shown above.\n  # config.vm.synced_folder \".\", \"\/vagrant\", disabled: true\n\n\n  # customize the configuration of VM - see https:\/\/www.virtualbox.org\/manual\/ch08.html\n  # virtual hardware configuration\n  config.vm.provider \"virtualbox\" do |vb|\n    # true = GUI, false = headless\n    vb.gui = true\n    # number of cpu used                                                          \n    vb.customize &#91;\"modifyvm\", :id, \"--cpus\", 2]\n    # memory used                          \n    vb.customize &#91;\"modifyvm\", :id, \"--memory\", 4096]\n    # add video ram for gui\n    vb.customize &#91;\"modifyvm\", :id, \"--vram\", 256]\n\n    # clipboard, drag &amp; drop, notifications support\n    # clipboard shared between host \/ guest\n    vb.customize &#91;\"modifyvm\", :id, \"--clipboard\", \"bidirectional\"]\n    # drag &amp; drop between host \/ guest\n    vb.customize &#91;\"modifyvm\", :id, \"--draganddrop\", \"bidirectional\"]\n    \n    # disable notification mouse\/keyboard capture\n    vb.customize &#91;\"setextradata\", \"global\", \"GUI\/SuppressMessages\", \"all\"]\n\n    # startup gui screen resolution (3\/4 monitor size)\n    vb.customize &#91;'setextradata', :id, 'GUI\/LastGuestSizeHint','1440,900']\n\n    # enable USB and add a filter based on the desired device manufacturer \/ product\n    #vb.customize &#91;\"modifyvm\", :id, \"--usb\", \"on\"]           # usb 1.1 (CHCI) controller\n    vb.customize &#91;\"modifyvm\", :id, \"--usbehci\", \"on\"]       # usb 2.0 (EHCI) controller\n    vb.customize &#91;\"modifyvm\", :id, \"--usbxhci\", \"on\"]       # usb 3.0 (xHCI) controller\n    vb.customize &#91;'usbfilter', 'add', '0', '--target', :id,\n        '--name', 'QuickCam Orbit\/Sphere AF',\n        '--vendorid', '0x046d',\n        '--productid', '0x0994']\n    vb.customize &#91;'usbfilter', 'add', '0', '--target', :id,\n        '--name', 'Adafruit Console Cable',\n        '--vendorid', '0x10c4',\n        '--productid', '0xea60']\n    # Enable optical drive and insert the VBoxGuestAdditions.iso which should be located in the VirtualBox installation path\n    vb.customize &#91;\"storageattach\", :id, \"--storagectl\", \"IDE Controller\", \"--port\", \"0\", \"--device\", \"0\", \"--type\", \"dvddrive\", \"--medium\", virtualbox_install_path()+\"\\\\VBoxGuestAdditions.iso\"]\n  end\n\n  # Create an output log file so we can see the output of the provisioning\n  config.vm.provision :shell, name: \"Creating commands output file\", run: \"once\", inline: \"sudo touch \/vagrant\/provision_output.txt\"\n\n  # Update the system\n  config.vm.provision :shell, name: \"Run apt-get update\", run: \"once\", inline: \"sudo apt-get -y update &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Upgrade the system\n  config.vm.provision :shell, name: \"Run apt-get upgrade\", run: \"once\", inline: \"sudo DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --assume-yes --no-install-recommends &amp;&gt;&gt; \/vagrant\/provision_output.txt\", reboot: true\n\n   # Create system environment timer\n  config.vm.provision \"shell\", name: \"Install ntp and set timezone to Europe\/Berlin\", run: \"once\", inline: &lt;&lt;-SHELL\n    # install NTP and set your time zone\n    apt-get -y install ntp\n    timedatectl set-timezone Europe\/Berlin\nSHELL\n\n  # Install linux headers\n  config.vm.provision :shell, name: \"Install linux headers\", run: \"once\", inline: \"sudo apt-get -y install linux-headers-$(uname -r) &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install build tools\n  config.vm.provision :shell, name: \"Install build tools\", run: \"once\", inline: \"sudo apt-get -y install gcc make perl &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install your common tools\n  config.vm.provision \"shell\", name: \"install common tools\", run: \"once\", inline: &lt;&lt;-SHELL\n    # tools for viewing and manipulating image\n    apt-get -y install imagemagick\n\n    # load your favorate browser\n    wget -q -O - https:\/\/dl.google.com\/linux\/linux_signing_key.pub | gpg --dearmor | sudo tee \/etc\/apt\/keyrings\/google-chrome.gpg &gt; \/dev\/null\n    echo \"deb &#91;arch=amd64 signed-by=\/etc\/apt\/keyrings\/google-chrome.gpg] http:\/\/dl.google.com\/linux\/chrome\/deb\/ stable main\" | sudo tee \/etc\/apt\/sources.list.d\/google-chrome.list\n\n    # load microsoft visual studio code\n    wget -q -O - https:\/\/packages.microsoft.com\/keys\/microsoft.asc | gpg --dearmor | sudo tee \/etc\/apt\/keyrings\/microsoft.gpg &gt; \/dev\/null\n    echo \"deb &#91;signed-by=\/etc\/apt\/keyrings\/microsoft.gpg] https:\/\/packages.microsoft.com\/repos\/code stable main\" | sudo tee \/etc\/apt\/sources.list.d\/vscode.list\n\n    #run update\n    sudo apt-get update\n\n    #Instal Google chrome\n    apt-get -y install google-chrome-stable\n\n    #Install VS Code\n    apt-get -y install code\nSHELL\n\n  # Install git\n  config.vm.provision :shell, name: \"Install git\", run: \"once\", inline: \"sudo apt-get -y install git &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Instal apache2 web server\n  config.vm.provision :shell, name: \"Install apache2 web server\", run: \"once\", inline: \"sudo apt-get -y install apache2 &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Allow apache to run on port 80\n  config.vm.provision :shell, name: \"Allow apache to run on port 80\", run: \"once\", inline: \"sudo ufw allow in 'Apache' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig mysql server root password (ABSOLUTELY NOT FOR PRODUCTION USE)\n  config.vm.provision :shell, name: \"Set root password\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'mysql-server mysql-server\/root_password password \"+DBPASSWD+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig mysql server root password  again (ABSOLUTELY NOT FOR PRODUCTION USE)\n  config.vm.provision :shell, name: \"Set root password again\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'mysql-server mysql-server\/root_password_again password \"+DBPASSWD+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install mysql server\n  config.vm.provision :shell, name: \"Install mysql server\", run: \"once\", inline: \"sudo apt-get -y install mysql-server &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Start mysql server service\n  config.vm.provision :shell, name: \"Start mysql server service\", run: \"once\", inline: \"sudo systemctl start mysql.service &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Create sample database\n  config.vm.provision :shell, name: \"Create sample database\", run: \"once\", inline: \"sudo mysql -uroot -p\"+DBPASSWD+\" -e 'CREATE DATABASE \"+DBNAME+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Create user for the sample database\n  config.vm.provision :shell, name: \"Create user for sample database\", run: \"once\", inline: \"sudo mysql -uroot -p\"+DBPASSWD+\" -e \\\"CREATE USER '\"+DBUSER+\"'@'\"+DBHOST+\"' IDENTIFIED WITH mysql_native_password BY '\"+DBPASSWD+\"'\\\" &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Grant all privileges to the sample database for the user\n  config.vm.provision :shell, name: \"Grant all priveleges\", run: \"once\", inline: \"sudo mysql -uroot -p\"+DBPASSWD+\" -e 'GRANT ALL PRIVILEGES ON \"+DBNAME+\".* TO \"+DBUSER+\"@\"+DBHOST+\" WITH GRANT OPTION' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Flush privileges to ensure the changes take effect\n  config.vm.provision :shell, name: \"Flush privileges\", run: \"once\", inline: \"sudo mysql -uroot -p\"+DBPASSWD+\" -e 'FLUSH PRIVILEGES' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install php\n  config.vm.provision :shell, name: \"Install php\", run: \"once\", inline: \"sudo apt-get -y install php libapache2-mod-php php-mysql &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install php extensions\n  config.vm.provision :shell, name: \"Install php extensions\", run: \"once\", inline: \"sudo apt-get -y install php-curl php-gd php-mbstring php-xml php-zip &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig phpmyadmin\n  config.vm.provision :shell, name: \"Debconfig phpmyadmin\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'phpmyadmin phpmyadmin\/dbconfig-install boolean true' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig phpmyadmin app password confirm\n  config.vm.provision :shell, name: \"phpmyadmin app password\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'phpmyadmin phpmyadmin\/app-password-confirm password \"+DBPASSWD+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig phpmyadmin admin password\n  config.vm.provision :shell, name: \"phpmyadmin admin password\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'phpmyadmin phpmyadmin\/mysql\/admin-pass password \"+DBPASSWD+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig phpmyadmin app pass\n  config.vm.provision :shell, name: \"phpmyadmin app password\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'phpmyadmin phpmyadmin\/mysql\/app-pass password \"+DBPASSWD+\"' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Debconfig phpmyadmin reconfigure webserver\n  config.vm.provision :shell, name: \"Debconfig phpmyadmin\", run: \"once\", inline: \"sudo debconf-set-selections &lt;&lt;&lt; 'phpmyadmin phpmyadmin\/reconfigure-webserver multiselect none' &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install phpmyadmin\n  config.vm.provision :shell, name: \"Install phpmyadmin\", run: \"once\", inline: \"sudo apt-get -y install phpmyadmin &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Enable mod rewrite for apache2\n  config.vm.provision :shell, name: \"Enable mod rewrite for apache2\", run: \"once\", inline: \"sudo a2enmod rewrite &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Allow apache override\n  config.vm.provision :shell, name: \"Allow apache override\", run: \"once\", inline: \"sudo sed -i 's\/AllowOverride None\/AllowOverride All\/g' \/etc\/apache2\/apache2.conf &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Enable php error reporting\n  config.vm.provision :shell, name: \"Enable php error reporting\", run: \"once\", inline: \"PHPVER=$(ls \/etc\/php | sort -V | tail -n1); sudo sed -i 's\/error_reporting = .*\/error_reporting = E_ALL\/' \/etc\/php\/$PHPVER\/apache2\/php.ini &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Enable display errors\n  config.vm.provision :shell, name: \"Enable display errors\", run: \"once\", inline: \"PHPVER=$(ls \/etc\/php | sort -V | tail -n1); sudo sed -i 's\/display_errors = .*\/display_errors = On\/' \/etc\/php\/$PHPVER\/apache2\/php.ini &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Download composer for php management\n  config.vm.provision :shell, name: \"Download composer for php management\", run: \"once\", inline: \"sudo curl --silent https:\/\/getcomposer.org\/installer | php &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install composer\n  config.vm.provision :shell, name: \"Install composer\", run: \"once\", inline: \"sudo mv composer.phar \/usr\/local\/bin\/composer &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Reload apache2 to load php module\n  config.vm.provision :shell, name: \"Reload apache2 to load php module\", run: \"once\", inline: \"sudo systemctl restart apache2 &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  #install vbox guest additions\n  config.vm.provision :shell, name: \"Creating optical drive mount dir\", run: \"once\",\n    inline: \"sudo mkdir \/media\/cdrom &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Mount the optical drive to the created directory\n  config.vm.provision :shell, name: \"Mount optical drive to dir\", run: \"once\",\n    inline: \"sudo mount \/dev\/sr0 \/media\/cdrom &amp;&gt;&gt; \/vagrant\/provision_output.txt\"\n\n  # Install vbox guest additions\n  # seems we cant log that in the shared file because it will create a conflict\n  # exit code of the  installation script is very unreliable, so we ignore if there is an error\n  # Dont worry you can initially manage without the guest additions and when you run the VM it will notify you that you better install them\n  config.vm.provision :shell, name: \"Install vbox guest additions\", run: \"once\",\n    inline: \"sudo \/bin\/sh \/media\/cdrom\/VBoxLinuxAdditions.run || :\" \n\n  # Finally unmount the optical drive from the created directory and reboot the VM for everything to take effect\n  config.vm.provision :shell, name: \"Unmount optical drive from dir\", run: \"once\",inline: \"sudo umount \/media\/cdrom\", reboot: true\nend\n<\/code><\/pre>\n\n\n\n<p>Save the file and spin up a VM created from that file by executing command<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant up<\/code><\/pre>\n\n\n\n<p>Watch the interface for any errors or wait for vagrant to complete its job.<\/p>\n\n\n\n<p>Other useful vagrant commands are<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stop Virtual Machine<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant halt<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Destroy and delete virtual machine<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant destroy<\/code><\/pre>\n\n\n\n<p>Username for the guest machine is vagrant and password is vagrant<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This all started by surfing around the internet when I saw something about spinning developer environments on VMs. Just a quick look around lead me to Vagramt and yes in that quick search I also saw that a lot of people asked the question &#8220;is it really useful in the age of containers?&#8221;. Well you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,3],"tags":[8,7,9,5,11,6,10],"class_list":["post-39","post","type-post","status-publish","format-standard","hentry","category-infrastructure-as-code-iac","category-staynonotes","tag-code","tag-development","tag-ubuntu","tag-vagrant","tag-virtual-machine","tag-web","tag-windows"],"_links":{"self":[{"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/comments?post=39"}],"version-history":[{"count":5,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/posts\/39\/revisions"}],"predecessor-version":[{"id":47,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/posts\/39\/revisions\/47"}],"wp:attachment":[{"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/media?parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/categories?post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stayno.com\/index.php\/wp-json\/wp\/v2\/tags?post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}