There are a myriad of cool hacks and services you can run on a personal server. For the purposes of this article, I'm assuming you are running a Linux server. There's probably a way to do all of this with a Windows server as well, but that's not something I've explored. I'll keep the format as a list of bullet points in various categories. If you're looking for a more detailed tutorial check out the embedded links and use Google.
The most common use for a server is to host various sites. Some ideas on what sort of sites to host:
- A local stage of your personal site or other work. In short, a stage is an environment that is the same as your production (public release) server, so that you can test and break things without taking down your main site.
- A personal wiki, for home use. You can keep recipes, guides, information for guests, and other useful info such as packing lists on it.
- A local portal that has links to all your resources. Many of the services I describe below have web front-ends, but it's a pain to memorize all the various port numbers. On my local server, I have a simple bootstrap site hacked together with some links to my services. Since I set up internal DNS (using dnsmasqd), I simply type
p/into my browser and get sent to my server, and then all of my music portals and other interfaces are just a click away.
You can also hook up various server monitoring tools and web apps. I have the following pages set up:
- phpSysInfo - Neat page with various plugins that can display SMART info, RAID status, system update status, and more.
- Deluge Web UI - Awesome portal to manage downloads, allows you to connect from your phone or laptop.
- Glances - ncurses based system monitoring tool
- Linux Dash - Very modern web dashboard with key stats.
- Monit - Full fledged monitoring solution that tracks uptime for my public facing sites and servers, checks logs, and more.
- Jupyter (iPython) Notebook - If you don't know about iPython Notebooks yet, go set one up now. This article can wait. It is the single most useful tool for creating quick scripts, web scrapers, and other simple projects in python. It also supports LaTeX, Markdown, and can generate glorious PDF's and graphs for any project you desire to do.
Disk space is cheap, and getting cheaper every year. You can buy a 4tb drive for around $130 at the time of this writing. To buy the equivalent amount of storage online, you'd have to pay about a hundred times more. A great use case for your server is to buy some drives, set them up in RAID, and use this to store all of your data and various backups.
If you want to do more than just have files on a network drive, you can also set up a suite that will function as a Dropbox alternative, in addition to user accounts, bookmarks sync, online galleries, and more. The most popular ones are Owncloud and Cozy. There are also some cool programs that allow you to launch downloads onto your server through a web interface and browse your drive.
There are a myriad of musical services out there these days - Spotify, Soundcloud, Pandora, etc. However, some people still prefer to keep music locally. If you are one of those, the following programs may be useful to you.
- Subsonic allows you to set up an in-house streaming service, a-la Spotify/Pandora. The upside is that there are no ads, you can play any music you have, and there's no bandwidth limits. The downside is of course that this your access is limited if you can't reach your server. You'll need to configure a VPN or set up port forwarding.
- Mopidy allows you to control music playback on your server. This is a program for when the server sound audio output is piped into speakers, and you wish to remotely control playback. It's useful both for controlling your own music from anywhere in the home via the companion app, as well as having multiple people collaborate on the current playlist for a party or event.
- Even if you do not wish to have fancy services around music, it is generally a good idea to store all local your music on the server, so as to save space on your main computer, and ultimately increase its performance and ease of maintenance.
Most people use Netflix and other online streaming services, but some films are old enough or obscure enough that they are not available on those platforms. My family and I have a sizable collection of old Soviet films which we keep locally. One way to access them is through the network file share, but I also set up Plex so we can have easy access through any tablet, laptop, or TV. Another viable solution is to set up a SAMBA share coupled with a Chromecast. This makes it easy to send any video files to your local TV. For quick sharing, minidlna is a quick solution that works great as well.
As with music and movies, most people subscribe to some online platform like iBooks, Google Play Books, or Amazon's cloud. For those of you who prefer to keep local collections, there are several options available to you. If you keep your eBooks just in various folders, a simple network file share using Samba or NFS will suffice. However, if you have a more elaborate setup using calibre, you can export your library over the network using the built in content server or COPS. You can also use the Calibre2OPDS generator to create a static html/xml catalog that can be put on any web server. Aldiko and Apple's iBooks will be able to access it as a native catalog through the OPDS protocol.
- Dynamic DNS — By default, you probably just have one public IP for your home connection, and your ISP often changes it. This will force you to constantly be updating your DNS records on your hosting providers or memorizing new numbers every few weeks. Dynamic DNS allows you to set a human readable name (such as myserver.ddns.org), and the software takes care of keeping your IP up to date.
- VPN — If you're loathe to open up any ports, you can set up a private VPN. I came up with a working way to have both the server and client tunnel in to an external server, thus allowing you to keep your firewall sealed off. At the time of this writing I'm exploring ways to build a mesh VPN using Tinc.
- If you hate to sleep to the sound of whirring fans and blinking lights, you probably turn off your desktop at night. This can be a problem if you want to download some large files or mirror a website. Luckily, if your server is sound proofed, you can launch long running processes in a tmux session and come back to them later.
- Virtual Machines — Many good developers are OS agnostic, running whatever tool is best. I myself cycle though OSX and linux multiple times a day, even firing up Windows on occasion. One way to do this is to have several computers or servers laying around, but sometimes it's better to run everything locally. This is where virtual machines come in. VMware Workstation allows you to set up a cluster of machines, and if you enable VNC/RDP/SSH, you can easily log in and do what you need to do. If you prefer a free alternative, VirtualBox is a solid choice.
- Compiling — If your projects are large and take a while to compile, it's worth investing in a powerful server and using it as a build machine. I've compiled Android on mine before, as well as some larger C libraries (using DistCC).
- Personal Git Server — GitHub and Bitbucket are fantastic tools, but there are certain situations when a personal git server can be very convenient. I recently set up a public facing server using gogs, which is a close clone of the GitHub UI. GitLab and Gitorious are also worth checking out.
- Home Backup — Your server likely has the most space of any system in your home. You can use it as the destination for any backups of your various phones, tablets, laptops, and desktops. You never know if you'll drop your phone in the toilet or get your laptop stolen. Always have backups! In general, you'll want to keep an archive of downloaded software, various images of your operating systems, and phone backups. For OSX devices, you can set up time machine on an ubuntu server. It's much cheaper and better than paying for a huge Time Capsule.
- URL Shortener — Since my server is always on, I decided to set up a URL shortener using YOURLS. This is very convenient for accessing both internal services such as Plex (http://p/lex --> http://puma:32400/web/index.html) and external services with long URLs. I liked this set up so much I actually set up a public one as well, on https://smirnov.link.
- Write a custom API — This is for the uber geeks out there. Once you have enough services running on your server, managing them will become a substantial challenge. One solution is to write an API for scripts and other common tasks. I did this with Panda.
tl;dr / Go Build One
The benefits of a personal server are too numerous to list, so I'll just share a few highlights.
- You are enabling yourself to lead a more efficient life. This is a tool built to perfectly suit your needs, a tool that can enhance your productivity and enable you to work faster and more creatively. As your system grows you will add on various tweaks, tools, and other magical elements that will eventually transform your server into the ultimate powerhouse.
- You pick up many skills that you would not normally acquire. I learned about system administration, linux networking, and learned the ins and outs of keeping a system healthy and running. I can honestly say that the knowledge I acquired tinkering with my setup was crucial to getting me hired into my first few jobs in the industry.
- The barrier to launching a project becomes extremely low. If you already have a web server running you can simply copy paste a config and launch a new site. If you already have the full NodeJS stack ready to go you can go from idea to running a prototype app in minutes. With the Jupyter Notebook you can perform an incredible data analysis within half an hour and generate a beautiful PDF write-up. It's a tool that just gains more value the more you use it.