{"id":172,"date":"2016-04-26T10:01:27","date_gmt":"2016-04-26T10:01:27","guid":{"rendered":"http:\/\/vandebilt.co\/?p=172"},"modified":"2016-04-26T13:00:04","modified_gmt":"2016-04-26T13:00:04","slug":"setting-up-raspbian-virtual-desktop","status":"publish","type":"post","link":"https:\/\/joe.nkode.uk\/index.php\/2016\/setting-up-raspbian-virtual-desktop\/","title":{"rendered":"Setting up Raspbian Virtual Desktop with VNC, SSH and Samba"},"content":{"rendered":"<p>A few months ago while having some issues updating Openelec on my RPi I decided to blitz the SD card and go FULL Openelec with a fresh install of version 6. However this had some problems, namely that it no longer functioned as a file server &#8211; or rather it could, but the lack of options to configure ports, passwords and other configs generally make file hosting through Openelec a huge security risk, and even if you hack your way around the read-only filesystem, it just gets overwritten when it next updates.<\/p>\n<p>I decided to buy another Raspberry Pi. With the model 3 out now, model 2&#8217;s became a lot cheaper. I picked up one <a href=\"https:\/\/www.amazon.co.uk\/gp\/product\/B00T52NCCC\/\">here <\/a>for \u00a325. I decided early on it was just going to be a fileserver, so after it was set up I wasn&#8217;t going to need a keyboard\/Mouse\/HDMI plugged in. Just power, hard drive and network &#8211; with the aim to control everything via VNC and SSH.<\/p>\n<p>The Pi arrived, and I installed Raspbian on the SD card and plugged it in, I&#8217;d gone for a direct install of Raspbian so didn&#8217;t get the setup I had seen before when using NOOBS, however you can trigger this yourself from the terminal. So open up the terminal and type<\/p>\n<pre>sudo raspi-config<\/pre>\n<p>Then you can go through the setup process. After I had set that stuff up the way I wanted I had the following to-do list:<\/p>\n<ul>\n<li>Configure SSH to be more secure.<\/li>\n<li>Mount my external HDD locally.<\/li>\n<li>Install samba and configure it to share the hard drive over the network<\/li>\n<li>Install VNC and set it to launch on startup as a virtual desktop<\/li>\n<\/ul>\n<h6><strong>Configure SSH to be more secure<\/strong><\/h6>\n<p>SSH can be brute forced, that shouldn&#8217;t be a surprise. Raspbian by default will give you a default username and password. If you haven&#8217;t changed it already, change your password, you can do this by opening up the terminal and entering the command <code>passwd<\/code><br \/>\nI also find that you can avoid most bot attacks if you simply change the default port that SSH runs on, so I recommend opening up the config file located at <code>\/etc\/ssh\/sshd_config<\/code> and changing the value for <code>Port<\/code>, the default is 22 &#8211; change it to something memorable, then either restart the Pi or use <code>sudo service sshd restart<\/code><\/p>\n<p>You should now be able to access your raspberry pi from any given SSH client with <code>ssh pi@192.168.0.X -p 1234<\/code> Where X is the IP address and 1234 is the secret port you set up.<\/p>\n<h6><strong>Mount my external HDD locally<\/strong><\/h6>\n<p>Linux can pretty much mount anything (phrasing) it will prefer stuff formatted for EXT3\/4 but can also read from NTFS, FAT and HFS file systems. When you plug in a hard drive it will by default mount itself in the folder <code>\/media\/<\/code>. I wanted to mount my hard drive in another location just for the sake of ease. To do this you need to create a folder as a mount point and then configure the fstab to mount the device in that location.<\/p>\n<p>So first of all, figure out what your device is called, to do this plug the device in, open up the terminal and use the command <code>sudo blkid<\/code> if your device has a name (My device is called &#8220;JOES-SLAB&#8221;) then you should be able to pick it out of the list of results.<\/p>\n<pre>~$ sudo blkid\r\n\/dev\/sda1: LABEL=\"JOES-SLAB\" UUID=\"82AA5C66AA5C58AD\" TYPE=\"ntfs\" PARTUUID=\"7dd7743f-01\"\r\n<\/pre>\n<p>So I can see that my external NTFS HDD is mounted on \/dev\/sda1. <strong>Copy and paste the UUID as you will need that later.<\/strong> At this point you should unmount the drive, leave it plugged in but use the command<\/p>\n<pre>umount \/dev\/sda1<\/pre>\n<p>Where \/dev\/sda1 is the mount point of your device. If it successfully unmounts then you need to open up and edit <code>\/etc\/fstab<\/code> This file will be root protected so you&#8217;ll need to open with elevated permissions.<br \/>\nThe fstab is a table which gives the system information on how to mount certain devices. It may already have information in it, this is fine, just got to the bottom of the file and start a new row. The fstab takes 6 fields<\/p>\n<ul>\n<li>Device<\/li>\n<li>Mount Point<\/li>\n<li>Filesystem<\/li>\n<li>Options<\/li>\n<li>Dump<\/li>\n<li>Pass<\/li>\n<\/ul>\n<p>So, using the UUID you recorded earlier you can add your device to the fstab. An example of mine is below, then an explantion of what each field means.<\/p>\n<pre>UUID=82AA5C66AA5C58AD   \/home\/pi\/Documents      ntfs-3g         uid=1000,gid=1000,umask=022     0       0<\/pre>\n<p><strong>Device:<\/strong> <em>UUID=82AA5C66AA5C58AD<\/em> &#8211; Each storage device will have a UUID, this lets the operating system know how to mount this device<br \/>\n<strong>Mount Point:<\/strong> <em>\/home\/pi\/Documents<\/em> &#8211; When I open this folder the contents of the hard drive will be displayed. This file path needs to exist in order for this to work so you need to create this directory if its not already there.<br \/>\n<strong>Filesystem:<\/strong> <em>ntfs-3g<\/em> &#8211; my hard drive uses NTFS, the 3g options is an external package which helps with the read\/write stuff. In all fairness I&#8217;m not all that clued up, this is just what works. If your hard drive is FAT or HFS(+) have a google as to what you need to put in here.<br \/>\n<strong>Options:<\/strong> <em>uid=1000,gid=1000,umask=022<\/em> &#8211; NTFS hard drives don&#8217;t let you change read\/write\/execute permissions after they&#8217;re mounted so you need to set them up here. This setup will give you ownership and set the hard drive permissions to 755, so only user pi has the ability to write to the HDD but others can read and execute.<br \/>\n<strong>Dump &amp; Pass:<\/strong> <em>0<\/em> &#8211; No idea, that&#8217;s just what you need to put<\/p>\n<p>Save the fstab, then in the terminal run <code>sudo mount -a<\/code> this will reload everything in the fstab. If everything went to plan, you should find the contents of your HDD listed under <code>\/home\/pi\/Documents<\/code> (or whatever mount point you specified)<\/p>\n<h6><strong>Install samba and configure it to share the hard drive over the network<\/strong><\/h6>\n<p>Samba is a package in unix\/linux that allows for file and printer sharing across a local area network, I used this mainly so I could map the hard drive on my raspberry pi on other devices, like my windows laptop and PC.<\/p>\n<p>Samba is probably already installed, but run <code>sudo apt-get install samba<\/code> just in case. Once installed you can find the main configuration file at <code>\/etc\/samba\/smb.conf<\/code> open that up with elevated permissions. The file will already contain a lot of configurations, some of them are contained within a parent configuration which is denoted by the [] brackets. For instance at the top level is [global].<\/p>\n<p>Under [homes] I added my own custom configuration, as before I&#8217;ll show the code then explain each option.<\/p>\n<pre>[Public Documents]\r\n   comment = Public Documents\r\n   path = \/home\/pi\/Documents\r\n   guest ok = no\r\n   browseable = yes\r\n   read only = no\r\n   create mask = 0755\r\n   directory mask = 0755\r\n<\/pre>\n<p><strong>[Public Documents]<\/strong> &#8211; this lets samba know that its reading a new configuration section, this is also how the folder will appear when viewing from another device, for example if I logged into my pi from my PC I would see <code>\\\\raspberrypi\\Public Documents<\/code><br \/>\n<strong>Comment:<\/strong> A description of the drive, usually I give the same value as above<br \/>\n<strong>path<\/strong> &#8211; this is the local path to the location you wish to share across the network (it matches our HDD mount point)<br \/>\n<strong>guest ok<\/strong> &#8211; No, I want people to log in before they access my hard drive! If you&#8217;re not bothered you can set this to &#8216;yes&#8217;<br \/>\n<strong>browseable<\/strong> &#8211; Yes, I want to be able to browse the drive<br \/>\n<strong>read only<\/strong> &#8211; No, I want to be able to write to the drive<br \/>\n<strong>create\/directory mask<\/strong> &#8211; The permissions applied to the network drive<\/p>\n<p>Save and quit. Now since I specified that guests were not okay, the final thing to do is to set up your user as a valid login. To do this, in the console use the command <code>smbpasswd pi<\/code>. This will allow you to set a password with samba for your login, you are allowed to set the same password as when you were configuring SSH, which means when accessing the drive remotely you can login with your usual username and password. You can always specify a different user than &#8220;pi&#8221; but I&#8217;m not sure how that would conflict with the fstab permissions on the drive. Also remember that in future if you change your password to update both.<\/p>\n<p>Restart samba with the command <code>sudo \/etc\/init.d\/samba restart<\/code> after which you should be able to access your hard drive\u00a0from\u00a0another device across the network. On windows I can map the drive using the map network drive wizard, and connecting using different credentials, where I enter the Pi&#8217;s username and password. Sometimes you may need to specify the domain of the user account, as windows will sometimes try to log you in as a local user rather than a remote one (i.e &#8220;WindowsPc\\pi&#8221; rather than &#8220;raspberrypi\\pi&#8221;) So just be sure to specify the domain name of your pi, if you don&#8217;t know what this is use the command <code>hostname<\/code> on your pi and it should tell you. As in the screenshots below.<\/p>\n<p><a href=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-177 alignright\" src=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-1-300x42.png\" alt=\"Map Network 1\" width=\"300\" height=\"42\" srcset=\"https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-1-300x42.png 300w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-1-768x108.png 768w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-1.png 924w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>If all has gone according to plan, your remote drive should show under the z:\\ on your windows device (or phone, or tablet)<\/p>\n<p><a href=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-178 alignnone\" src=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-2-300x218.png\" alt=\"Map Network 2\" width=\"300\" height=\"218\" srcset=\"https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-2-300x218.png 300w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-2.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-179 alignnone\" src=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Map-Network-3-300x188.png\" alt=\"Map Network 3\" width=\"300\" height=\"188\" srcset=\"https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-3-300x188.png 300w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Map-Network-3.png 431w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h6><strong>Can I access my files from outside my local network?<\/strong><\/h6>\n<p>Yes you can actually, not through Samba though. If you&#8217;ve configured SSH properly you should be able to port forward the secret port you specified to your device externally, for this you&#8217;ll need to give your device a static IP on your network and set up the port forward rule &#8211; these are usually done through your router\/gateway.<\/p>\n<p>Once you have port forwarding setup you can actually use SFTP to access your files. SFTP is like FTP but uses an SSH connection to secure and tunnel the connection so you don&#8217;t need to install anything new. With any file transfer program that can handle SFTP you can connect using <code>sftp pi@X.X.X.X -p 1234<\/code> again where X.X.X.X is your <a href=\"https:\/\/www.google.co.uk\/webhp?q=what%20is%20my%20ip\">public external IP address<\/a> and 1234 is the secret SSH port you set up.<a href=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-197 alignright\" src=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354-169x300.png\" alt=\"Screenshot_20160426-133354\" width=\"169\" height=\"300\" srcset=\"https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354-169x300.png 169w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354-768x1365.png 768w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354-576x1024.png 576w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354-281x500.png 281w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Screenshot_20160426-133354.png 1080w\" sizes=\"auto, (max-width: 169px) 100vw, 169px\" \/><\/a><\/p>\n<p>Linux has SFTP support built in, for windows devices and android I recommend<\/p>\n<ul>\n<li><a href=\"https:\/\/filezilla-project.org\/\">FileZilla<\/a> (Windows, Mac, Linux)<\/li>\n<li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.estrongs.android.pop&amp;hl=en_GB\">ES File Explorer<\/a> (Android)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h6><strong>Install VNC and set it to launch on startup as a virtual desktop<\/strong><\/h6>\n<p>The final step is to install and setup VNC, VNC is a server application which will allow you to connect to a device and view the desktop and optionally use the keyboard and mouse as a means of remote desktop control. It&#8217;s old tech but I prefer that as it can be used with almost any device, and you can still secure it (although the method we&#8217;re going to use only uses 8 character passwords for some god awful reason)<\/p>\n<p>In my experience Raspbian has 2 main VNC packages, Tight-VNC and Vino-VNC. Vino works by allowing the VNC server to assume direct control of XSession in progress, if you had a monitor connected you would see the mouse cursor moving, opening files and typing. Tight-VNC creates virtual XSessions which are identical to your normal desktop, but you don&#8217;t need a monitor and even if you did have one plugged in, the session you control through VNC would not be the same.<\/p>\n<p>I opted for TightVNC in this case, as I did not need my RPi to be plugged into a monitor, keyboard or mouse after it was setup. Install TightVNC by opening the terminal and typing <code>sudo apt-get install tightvncserver<\/code> once installed you can run the application, on first run you will be asked to set up a password. As a mentioned earlier you can only set up an 8 character password, you can enter more text &#8211; so if you can only remember a longer password you can still type it in, the program will just truncate it. Run TightVNC with the command <code>vncserver<\/code> You will be asked to enter a password and then verify, then you&#8217;ll be offered to setup a view-only password. This you can give out to people so they can view your desktop but have no control.<\/p>\n<p>Once the server is running you will likely see a message like <code>New 'X' desktop is running on raspberrypi:1<\/code>. This means your VNC server is now running on virtual desktop 1. The virtual desktop ports correspond to actual TCP ports too. By default VNC servers start at port 5900, so when TightVNC says it&#8217;s running on raspberrypi:1 what it means is &#8220;Locally I&#8217;m running on desktop 1, externally I&#8217;m running on port 5901&#8221;. TightVNC cannot run on port :0 as this is the REAL desktop environment, so when you just run vnc without any extra parameters it will default to run on port 5901. If you have a VNC client on another machine on your local are network you can connect to your VNC server with X.X.X.X:5901, and entering the password you created in the setup. If you want to run on a different virtual desktop port, just remember that any other devices on your network will need to access it via the TCP port 5900 + the value you set as the virtual desktop, I&#8217;ll explain more on that as we go.<\/p>\n<p>End the VNC server session with the command <code>vncserver -kill :1<\/code>. This will terminate any VNC servers running on virtual desktop 1. Since we want our VNC server to start on system load, and we want to customize the setup the easiest thing to do is figure out what options we want to run the server with, and then automatically run that setup on system startup. You have a few options but I only want to set resolution and colour depth. So, create your new script and enter the following. I&#8217;ll explain what it does after<\/p>\n<pre>vncserver :101 -geometry 1366x768 -depth 24\r\n<\/pre>\n<p><strong>:101<\/strong> this is the virtual desktop, this directly affects the TCP port which your VNC server runs on, so my server would run on port 6001 (starting at 5900 + 101), again changing the port is a good way to avoid most bot attacks.<br \/>\n<strong>-depth 24<\/strong> Sets the colour depth, if you have a particularly slow connection you can<br \/>\n<strong>-geometry 1366&#215;768<\/strong> this sets the resolution of your virtual desktop. It can be as big or small as you like, I set it to this because it will fit onto the smallest device in my house without much scaling, but you can set to anything you see fit.<\/p>\n<p>Now you have a command which will run the VNC server, on the port and resolution you want, you just need to make this command run automatically. I found that sometimes the server booted up before the desktop environment. You&#8217;ve got free reign here to chose your own method, but I found the one below works best &#8211; <a href=\"http:\/\/www.penguintutor.com\/linux\/tightvnc\">originally from this post<\/a><\/p>\n<p>Open up a new text file and enter the following text<\/p>\n<pre>[Unit]\r\nDescription=TightVNC remote desktop server\r\nAfter=sshd.service\r\n\r\n[Service]\r\nType=dbus\r\nExecStart=\/usr\/bin\/tightvncserver :101 -geometry 1366x768 -depth 24\r\nUser=pi\r\nType=forking\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n<\/pre>\n<p>Save it under the directory <code>\/etc\/systemd\/system\/tightvncserver.service<\/code> The only thing you may need to alter is the line starting <code>ExecStart<\/code>, where you can see our command to start the server. You may notice that <code>vncserver<\/code> has been replaced by <code>\/usr\/bin\/tightvncserver<\/code> don&#8217;t worry about this too much as its essentially the same command, you&#8217;re just providing an absolute path to the binaries to execute it, you can also alter the user running the service if you wish.<\/p>\n<p>Once the file is in place you need to make it owned by the root user and then install it as a system service. Open terminal and run the following commands.<\/p>\n<pre>#Configure the script to run at startup\r\nsudo chown root:root \/etc\/systemd\/system\/tightvncserver.service\r\nsudo chmod 755 \/etc\/systemd\/system\/tightvncserver.service\r\nsudo systemctl enable tightvncserver.service\r\n<\/pre>\n<p>If you want to test that your script is running, run the following command and you should see either the vnc startup message, or an error if its already running.<\/p>\n<pre>#To test the script is working\r\nsudo systemctl start tightvncserver.service<\/pre>\n<p>To test it&#8217;s working, restart your device and see if you can connect to the VNC Server.<\/p>\n<p>Once it&#8217;s working the way you want, you can disconnect your keyboard, mouse and monitor as your Raspberry Pi is now running as a virtual environment.<\/p>\n<p>To connect to your VNC server I recommend the following clients (sorry I don&#8217;t have any Mac devices)<\/p>\n<ul>\n<li>Windows Desktop (also has a java client for linux): <a href=\"http:\/\/www.tightvnc.com\/download.php\">TightVNC Viewer<\/a><\/li>\n<li>Android:\u00a0<a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.iiordanov.freebVNC&amp;hl=en_GB\">bVNC: Secure VNC Viewer<\/a><\/li>\n<\/ul>\n<p><strong>Can I access my VNC server outside of my network?<\/strong><br \/>\nYes, you can, but you shouldn&#8217;t, having your VNC exposed makes you vulnerable to a few attacks, and once they break your VNC server they can actually control your device without needing your password so it&#8217;s not wise to simply port forward your VNC port. I recommend using SSH tunnelling, which the android app I suggested will support. I discussed this in more depth in one of my <a href=\"http:\/\/vandebilt.co\/index.php\/2015\/57\/\">previous articles here<\/a>. It depends on how secure you want things to be, but yes, there&#8217;s no reason why you can&#8217;t remote control your device over the internet.<\/p>\n<p><strong>A strange bug with VNC having no taskbar<\/strong><br \/>\nWhen I was connecting to my desktop session, I found that all I saw was my desktop wallpaper. This was because the Xsession desktop environment was not actually being loaded in the virtual desktop. You home directory contains a hidden folder called <code>\/home\/pi\/.config\/lxpanel\/<\/code> in this folder you have the potential to have a copy of the LXPanel config files, you just need to copy them from the system directory.<\/p>\n<pre>cp -r \/etc\/xdg\/lxpanel\/profile\/LXDE \/home\/pi\/.config\/lxpanel\r\ncp -r \/etc\/xdg\/lxpanel\/profile\/LXDE-pi \/home\/pi\/.config\/lxpanel    #This command might fail if you're on an older RPi model\r\n<\/pre>\n<p>This should fix the LXPanel issues on your virtual desktop and you should be able to use VNC to control<a href=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Vnc-View1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-184 alignright\" src=\"http:\/\/vandebilt.co\/wp-content\/uploads\/2016\/04\/Vnc-View1-300x148.png\" alt=\"Vnc View1\" width=\"300\" height=\"148\" srcset=\"https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Vnc-View1-300x148.png 300w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Vnc-View1-768x380.png 768w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Vnc-View1-1024x507.png 1024w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Vnc-View1-1011x500.png 1011w, https:\/\/joe.nkode.uk\/wp-content\/uploads\/2016\/04\/Vnc-View1.png 1920w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> your virtual desktop now.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few months ago while having some issues updating Openelec on my RPi I decided to blitz the SD card and go FULL Openelec with a fresh install of version 6. However this had some problems, namely that it no longer functioned as a file server &#8211; or rather it could, but the lack of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[75,76,58,74,60,61,19,73,18],"class_list":["post-172","post","type-post","status-publish","format-standard","hentry","category-article","tag-file-server","tag-file-sharing","tag-raspberry-pi","tag-remote-access","tag-samba","tag-sftp","tag-ssh","tag-virtual-desktop","tag-vnc","post-preview"],"_links":{"self":[{"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/posts\/172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/comments?post=172"}],"version-history":[{"count":26,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/posts\/172\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/posts\/172\/revisions\/204"}],"wp:attachment":[{"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/media?parent=172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/categories?post=172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joe.nkode.uk\/index.php\/wp-json\/wp\/v2\/tags?post=172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}