Introduction

VNC (Virtual Network Computing) is a system that enables users to connect and interact with graphical desktops of remote computers. It can transmit screen updates, and keyboard and mouse events, over the network.
VNC is useful when you need a graphical desktop environment for your server.
XFCE is a lightweight desktop environment. Because it has low system resource requirements, and because many VNC users are familiar with it, we will use XFCE in this tutorial. However, you can also use your favorite desktop environment, such as Gnome or KDE, instead.
In this tutorial we will set up a Debian 8 server, install the XFCE desktop environment on it, and connect it to via VNC. Additionally, we will create a startup script for VNC Server and secure it over SSH.

Prerequisities

Please complete the following prerequisites.

Debian 8 (or 8.1) Droplet with root access. 512 MB of RAM is enough to run VNC and XFCE, but you might need a bigger Droplet depending on what you plan to do with the graphical interface
VNC viewer (client) on your computer to connect to your server. In this tutorial, we will use UltraVNC on Windows, but you can use other VNC clients. You can download UltraVNC here. OS X comes with a built in VNC client called Screen Sharing
SSH client to establish a secure connection over SSH. We will use PuTTY for Windows. You can download PuTTY here. On OS X, just use the built in Terminal application

Step 1 — Installing VNC and XFCE

In this step, we will install VNC Server and the XFCE desktop environment, with additional software and an icon pack.
Update your server’s package lists:

apt-get update

Upgrade the packages themselves:

apt-get -y upgrade

Then, we will install tightvncserver and XFCE4 with some useful add-ons, and an icon theme:

apt-get install xfce4 xfce4-goodies gnome-icon-theme tightvncserver

By default there is no browser installed. You can install iceweasel (which is a rebranded version of Mozilla Firefox for Debian) if you want to access the web from your VNC connection:

apt-get install iceweasel

Step 2 — Creating a VNC User

We will create a separate user for VNC connections, to keep things secure and tidy. Using sudo is highly recommended, instead of using the root user directly for your VNC server.
You can add a user named vnc to your Debian Droplet by using this command:

adduser vnc

Give a password to your new user. You can skip all other questions by simply pressing ENTER.
Install sudo by executing this command:

apt-get install sudo

Add your new vnc user to the sudo group, which will give permissions to that user to execute root commands.

gpasswd -a vnc sudo

Let’s switch to the vnc user:

su - vnc

Step 3 — Starting and Stopping Your VNC Server

As our newly created vnc user, we can start VNC Server and test our connection.
Start VNC Server:

vncserver

As it is your first time running the server, you will be asked to set a password that clients will use to connect. Keep this password in mind for later! You can also set a view-only password, which will allow users to see the screen but not interact with it. Passwords should be 6-8 characters.
You will get a notice about your display number when the server is started.

xauth:  file /home/vnc/.Xauthority does not exist

New 'X' desktop is vnc:1

Creating default startup script /home/vnc/.vnc/xstartup
Starting applications specified in /home/vnc/.vnc/xstartup
Log file is /home/vnc/.vnc/vnc:1.log

By default, VNC connections are served on ports starting at 5901 for the first display. Your second display will be served on port 5902, etc.
Don’t stop the server now, but we’re including the stop command for reference.

Use this command to stop your VNC server on Display 1 (and port 5901):

vncserver -kill :1

:1 is the display number you want to kill.
You can start VNC Server manually when you want to connect again. We’ll create a service for VNC Server in a later step.

Step 4 — Connecting from a VNC Client

You can now connect to your VNC server. Open your local VNC client, which will vary depending on your operating system.
On Windows, you can use UltraVNC here.
On OS X, you can use the built-in Screen Sharing app or access this app through Safari. In Safari, you can enter vnc://your_server_ip:5901
For your VNC Server address, enter your_server_ip:5901 and use the password you just set for your VNC connection.
You can select the Use default config button on the XFCE welcome screen to get started easily:

Now you can use your remote desktop!

Step 5 — Creating a systemd Service to Start VNC Server Automatically

In this section we’ll add VNC Server to systemd. Using a service can be useful to start and stop your VNC server, and also to start it automatically when your Droplet is rebooted.
First, let’s kill the current instance:

vncserver -kill :1

Create a simple script to manage and configure our VNC server easily:
As the vnc or other sudo user, create a script file by using your favorite text editor.

sudo nano /usr/local/bin/myvncserver

Add these contents exactly. This script provides VNC with a few parameters for startup.
/usr/local/bin/myvncserver

#!/bin/bash
PATH="$PATH:/usr/bin/"
DISPLAY="1"
DEPTH="16"
GEOMETRY="1024x768"
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

case "$1" in
start)
/usr/bin/vncserver ${OPTIONS}
;;

stop)
/usr/bin/vncserver -kill :${DISPLAY}
;;

restart)
$0 stop
$0 start
;;
esac
exit 0

You can modify the script to change the color depth or resolution of your VNC connection.
If you are using nano, you can save the file via CTRL+O and exit via CTRL+X.
Make the file executable:

sudo chmod +x /usr/local/bin/myvncserver

Our script will help us to modify settings and start/stop VNC Server easily.

If you’d like, you can call the script manually to start/stop VNC Server on port 5901 with your desired configuration.

sudo /usr/local/bin/myvncserver start
sudo /usr/local/bin/myvncserver stop
sudo /usr/local/bin/myvncserver restart

We can now create a unit file for our service. Unit files are used to describe services and tell the computer what to do to start/stop or restart the service.

sudo nano /lib/systemd/system/myvncserver.service

Copy these commands to the service file. Our service will simply call the startup script above with the user vnc.
/lib/systemd/system/myvncserver.service

[Unit]
Description=Manage VNC Server on this droplet

[Service]
Type=forking
ExecStart=/usr/local/bin/myvncserver start
ExecStop=/usr/local/bin/myvncserver stop
ExecReload=/usr/local/bin/myvncserver restart
User=vnc

[Install]
WantedBy=multi-user.target

Now we can reload systemctl and enable our service:

sudo systemctl daemon-reload
sudo systemctl enable myvncserver.service

You’ve enabled your new service now. Use these commands to start, stop or restart the service using the systemctl command:

sudo systemctl start myvncserver.service
sudo systemctl stop myvncserver.service
sudo systemctl restart myvncserver.service

Now you can run VNC Server as a service on your Droplet.

Step 6 — Securing Your VNC Server with SSH Tunneling

By default VNC connections don’t use encryption, so it is recommended to use an SSH Tunnel to secure your session.
To do that, we will only let our VNC server serve on localhost.
You can do that by adding -localhost to the OPTIONS line in the startup script created in the previous step.
First, stop the VNC server:

sudo systemctl stop myvncserver.service

Edit your configuration script:

sudo nano /usr/local/bin/myvncserver

Change this line:
/usr/local/bin/myvncserver

. . .

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

. . .

Replace it with:
/usr/local/bin/myvncserver

. . .

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"

. . .

Restart the VNC server:

sudo systemctl start myvncserver.service

Now you can’t directly connect to your VNC server from your remote computer.
Windows:
We will use PuTTY to create an SSH Tunnel and then connect through the tunnel we have created.
Open PuTTY.
From the left menu, go to the Connection->SSH->Tunnels section.
In the Add New Forwarded Port section, enter 5901 as Source port and localhost:5901 as Destination.
Click the Add button.

You can now go to the Session section in the left menu.
Enter your Droplet’s IP address in the Host Name (or IP address) field.
Click the Open button to connect. You can also save these options for later use.

Log in with your vnc user.
Keep the PuTTY window open while you make your VNC connection.
Now you can use your VNC viewer as usual. Just enter localhost::5901 as the address, and keep your SSH connection live in the background.

OS X:
To establish an SSH tunnel, use the following line in Terminal:

ssh vnc@your_server_ip -L 5901:localhost:5901

Authenticate as normal for the vnc user for SSH. Then, in the Screen Sharing app, use localhost:5901.

Conclusion

Now you can use a shared remote desktop on your Debian 8 server.
Use it to configure your server, or share your screen with others.