Tommi's Scribbles

How To Set Up JetBrains Team Tools

How To Set Up JetBrains Team Tools
  • Published on 2021-12-18

JetBrains is a software developer famous for their amazing Integrated Development Environments (IDE), but the company also makes some nifty team tools. The kicker is that for small teams or solo developers, using these tools is free.

However, the JetBrains documentation doesn't clearly cover the full setup, which can leave some question marks. In this guide I try to fill in the blanks and guide you through the setup of standalone JetBrains Hub, YouTrack, UpSource, and TeamCity servers, and an Apache reverse proxy server in front of them.

NOTE: This setup is for a full Continous Development / Continous Integration (CD/CI) setup. If you only need a single part of the system, you can likely find an easier time using a single cloud service. For example, Youtrack has a cloud version if you only need project management and tasking features, while GitHub might be enough if you just want to do code reviews. JetBrains is offering a TeamCity Cloud beta if you only need the builds, or you can migrate to AWS like I have done.

Few background details

I have done this setup both using Hetzner Cloud and Amazon Web Services (AWS) , using both the standalone installation method and the Docker container method. As the details between the methods and services are minute and to keep things simpler, I will demonstrate the standalone installation method on Debian 10 in Hetzner Cloud. The basic principles remain the same even if using the Docker installation method or utilizing AWS, so the below should be easily adaptable to your needs. For other Virtual Private Server (VPS) or cloud services such as Linode or Azure, this guide should work close to as is as long as the service offers private networking between instances.

NOTE ABOUT PRICING: while the Jetbrains software is free for small teams, running the infrastructure comes with a price tag. On AWS, an always-on setup tallied about $150 a month. You can price optimize it a bit, but probably not much. On Hetzner, the pricing was about $35 a month, but there are trade-offs with the lower cost, so consider your needs and options carefully.

Things to consider before getting started

Having access to your own domain makes life easier. That way you can use subdomains such as hub.yourdomain.com and youtrack.yourdomain.com for pointing to the services. However, getting a domain and setting up Domain Name (DNS) records will not be covered in this article. Those tasks are rather simple and most larger domain services have good tutorials on how to set up things.

NOTE: I will assume that you have your own domain/subdomains to use. You should be able to modify accordingly on your own if you don't own a domain, but that can make things more complex. I also expect you use the same ports I am using, but you can of course change them and use whatever ports you want. Be careful to update the port in all the relevant places in that case.

Also, keep in mind is that this writeup was done on Debian 10 and using 2020.1 and 2019.4 versions of the JetBrains services. Using other versions or Linux distributions might have differences. For example, the url for the wget command to get the installation packages from JetBrains servers, or the directories where configuration files are located, or the commands used can be different (e.g. ufw vs. firewalld, apt vs. yum, apache2 vs. httpd).

The principles remain the same though, and you should be able to search for your particular commands and configuration file locations if working on different distributions easily.

NOTE: I also expect you to know how to spin instances and access the Command Line Interface (CLI) of your instances without instructions. If unfamiliar, you can likely find instructions from your service provider.

Infrastructure

For this basic setup, there will be 6 separate instances. The servers are all placed in the same internal network with only the reverse proxy web server allowing outside public HTTP and HTTPS traffic. I chose to utilize ports from 4444 to 4449 for the internal communications with the instance ip addresses in 10.0.0.X. range. You can choose what ever you want, but take care to update them correctly everywhere. In my non-mission-critical setup, all the servers allowed SSH access with authorized key pairs, including access as the root user. It is recommended as a best practice to disable root user remote access altogether, but since this was a conscious decision I was okay with the compromise as it provided convenience.

NOTE: user management, ssh access setup, using bastion hosts, and other access and security features are not covered in this write-up apart from the simple ufw to demonstrate what you should open to allow the services to work.

The instance setup is the following:

In my personal setup, I also had one server for data (SQL database and a Mercurial server), one server as a centralized log server (Rsyslog, Loki, Graphana), and one server for hosting websites (Jekyll builds deployed by TeamCity). As these instances are not relevant to using the team tools, I left these servers out from this writeup.

NOTE: Depending on your needs, you could also rock multiple TeamCity agents instead of just one. As installing multiple agents is the same process, covering only one should be enough for you to be able to do the other two you get with the free license on your own.

Setting up a reverse proxy web server for the services

Lets start with the reverse proxy web server as that is used to access the JetBrains services. The setup is simple and basic. I chose to use the lowest qualifying instance available for the server. Hetzner, as well as AWS, allow easy upscaling should you need more performance, so starting low and scaling up makes sense.

NOTE: If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get started with the reverse proxy server. The commands install the Apache web server, the ufw firewall management interface, and open the needed ports on the firewall with http/https used for web access and ssh used to manage the server. We disable any other incoming traffic by default.

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

apt install apache2
apt install ufw
ufw deny all
ufw allow http
ufw allow https
ufw allow ssh
ufw default deny incoming
ufw enable

Next, you'll want to enable the necessary mods for apache. This list should cover it all. If any of the mods fail to enable, you will likely need to install them with your package manager.

NOTE: not all distributions have the a2enmod shorthand available. In that case, you need to modify your apache configuration files to enable the mods. Look for your distribution specific instructions online.

a2enmod headers
a2enmod rewrite
a2enmod proxy_http
a2enmod http2
a2enmod ssl
a2enmod proxy_wstunnel

With all the mods active, it is time to install certbot, which allows you to get signed certificates to use HTTPS without your browser going bonkers about it.

apt install certbot

However, before getting your certificates with certbot, you'll want to set up your sites so certbot can update the config files for you. Do note that this automatic update can add the http to https redirection that is already portrayed in some of the below configurations, so you can leave that out. The same goes for adding the location of your SSL certificate files and enabling the SSL engine, so you can omit those too and have certbot add them for you. The reason they are provided below is for you to see what a final site config file can look like.

NOTE: If you have any issues with access down the line, I recommend reviewing your site configuration files to make sure they are close to what is portrayed here; paths, ports, and addresses should be the main sources of differences.

Here are the config files for each site. Remember to enable the sites with a2ensite after finalizing the configs.

Hub site config for Apache


ServerName hub.yourdomain.com
Protocols h2 http/1.1
RequestHeader set X-Forwarded-Proto "https"
DefaultType none
RewriteEngine on
AllowEncodedSlashes on
RewriteCond <>{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://10.0.0.3:4444/$1 [P]
ProxyRequests off
ProxyPass / http://10.0.0.3:4444/
ProxyPassReverse / http://10.0.0.3:4444/
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Youtrack site config for Apache


ServerName youtrack.yourdomain.com
Protocols h2 http/1.1
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine on
AllowEncodedSlashes on
ProxyRequests off
ProxyPass / http://10.0.0.4:4445/
ProxyPassReverse / http://10.0.0.4:4445/
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Upsource site config for Apache


ServerName upsource.yourdomain.com
Redirect permanent / https://upsource.yourdomain.com/
RewriteEngine on
RewriteCond <>{SERVER_NAME} =upsource.yourdomain.com
RewriteRule ^ https://<>{SERVER_NAME}<>{REQUEST_URI} [END,NE,R=permanent]


ServerName upsource.yourdomain.com
Protocols h2 http/1.1
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine on
AllowEncodedSlashes on
RewriteCond <>{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://10.0.0.5:4446/$1 [P]
ProxyRequests off
ProxyPass /<|socket.io/ ws://10.0.0.5:4446/<|socket.io/
ProxyPassReverse /<|socket.io/ ws://10.0.0.5:4446/<|socket.io/
ProxyPass / http://10.0.0.5:4446/
ProxyPassReverse / http://10.0.0.5:4446/
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Teamcity site config for Apache


ServerName teamcity.yourdomain.com
Redirect permanent / https://teamcity.yourdomain.com/
RewriteEngine on
RewriteCond <>{SERVER_NAME} =teamcity.yourdomain.com
RewriteRule ^ https://<>{SERVER_NAME}<>{REQUEST_URI} [END,NE,R=permanent]


ServerName teamcity.yourdomain.com
Protocols h2 http/1.1
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine on
AllowEncodedSlashes on
RewriteCond <>{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://10.0.0.8:4448/$1 [P]
ProxyRequests off
ProxyPreserveHost   On
ProxyPass           /app/subscriptions ws://10.0.0.8:4448/app/subscriptions connectiontimeout=240 timeout=1200
ProxyPassReverse    /app/subscriptions ws://10.0.0.8:4448/app/subscriptions
ProxyPass           / http://10.0.0.8:4448/ connectiontimeout=240 timeout=1200
ProxyPassReverse    / http://10.0.0.8:4448/
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

With the sites setup, you can use certbot to get your certificates. As the setup differs if you are using a wildcard certificate or getting individual ones for each subdomain, and there might be differences between Linux versions, I will not cover getting the certificates here. The certbot website has great guides for that already.

NOTE: You should also point your domains DNS records to the public ip address of this server. As mentioned earlier, that is out of the scope of this article due to the multitude of different services. You should refer to the documentation provided by your DNS provider for guidance how to do that.

After you're done with setting up the proxy server and configuration files, don't forget to restart the apache service.

Setting up the JetBrains Hub server

As the other JetBrains tool can utilize the Hub, it makes sense to start with that service so Hub will be available for the other services to use. My setup makes three assumptions:

NOTE: Feel free to update these details in the commands and configuration files, if your setup differs from these assumptions. Note the proxy server configurations were covered before and made the same assumption.

For the hardware specifications, the JetBrains documentation provides pretty good guidelines for what kind of hardware specs you need for their services. As was the case with the reverse proxy server above, both Hetzner and AWS allow easy upscaling, so I started with the minimum qualifying instance available. This ended up being a 1 vCPU, 2GB RAM, and a 20GB storage instance. I also added an extra 20 GB persistent storage volume to use as a backup for Hub.

NOTE: If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get the JetBrains Hub server started. As with the proxy server, we install ufw to control access. We deny incoming access, but allow ssh access and routing from the proxy server.

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

Next we download the Hub standalone install package (the URL might be different with a newer version), create a directory and unzip the package there. I chose to install to /opt/ but you can use whatever directory structure you want.

We also create some directories that Hub will use. I chose to use the /var/ directory to store these, but you can place the folders pretty much anywhere. We also remove the install zip package, which is optional.

NOTE: Not all distributions come with unzip, so you might need to install it or use an alternative tool instead.

apt install ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from 10.0.0.2 to any port 4444
ufw enable
mkdir /opt/hub
cd /opt
wget https://download.jetbrains.com/hub/hub-2020.1.12182.zip
unzip *.zip -d hub
rm *.zip
mkdir /var/data
mkdir /var/backups
mkdir /var/logs
mkdir /var/confs

Next, we configure Hub. Be sure to replace the location of files if you didn't use the same folder locations. Also, be sure to change the domain you pass to the base-url.

cd hub
cd hub*
cd bin
./hub.sh configure --listen-port 4444
./hub.sh configure --data-dir=/var/data
./hub.sh configure --backups-dir=/var/backups
./hub.sh configure --logs-dir=/var/logs
./hub.sh configure --listen-port 4444 --base-url https://hub.yourdomain.com:443
./hub.sh start

Now, if you navigate your web browser to https://hub.yourdomain.com, you should be greeted by the Hub first launch wizard.

Setting up the JetBrains YouTrack server

After setting up the Hub server, I like to do YouTrack next. As a project management software, getting YouTrack running allows you to have all the follow-up tasks inside an admin project and track their progress, so to me it makes sense to do it next.

My setup makes three assumptions:

NOTE: Feel free to update these details in the commands and configuration files, if your setup differs from these assumptions. Note the proxy server configurations were covered before and made the same assumption.

For the hardware specifications, JetBrains documentation provides pretty good guidelines for what kind of specs you would need for each of their services. As was the case before, both Hetzner and AWS allow easy upscaling, so I started with the least powerful instance that meets the minimum specs.

This ended up being a 2 vCPU, 2GB RAM, and a 40GB storage instance. I also added an extra 40 GB persistent storage volume to use as a backup for YouTrack.

NOTE: If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get the JetBrains YouTrack server started. As before, we install ufw to control access. We deny incoming access, but allow general ssh access and routing from the proxy server.

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

Next we download the YouTrack standalone install package (the URL might be different with a newer version), create a directory and unzip the package there. I chose to install to /opt/ but you can use whatever directory structure you want.

We also create some directories that YouTrack will use. I chose to use the /var/ as a parent directory, but you can place the folders pretty much anywhere you desire. We also remove the install zip package, which is optional.

NOTE: Not all distributions come with unzip, so you might need to install it or use an alternative tool instead.

ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from 10.0.0.2 to any port 4445
ufw enable
mkdir /opt/youtrack
cd /opt
wget https://download.jetbrains.com/charisma/youtrack-2020.2.8873.zip
unzip *.zip -d youtrack
rm *.zip
mkdir /var/youtrack/data /var/youtrack/logs /var/youtrack/conf /var/youtrack/backups

Next, we configure YouTrack. Be sure to change the domain you pass to the base-url. Instead of passing the directories in the command line, you can also configure them using the web-based setup wizard the first time you connect.

cd youtrack
cd youtrack*
cd bin
./youtrack.sh configure --listen-port 4445 --base-url https://youtrack.yourdomain.com:443
./youtrack.sh start

Now, if you navigate your web browser to https://youtrack.yourdomain.com, you should be greeted by the YouTrack first launch wizard.

Setting up the JetBrains UpSource server

Before you start making builds, you should have good code quality. That is why I think UpSource is the logical next step.

My setup makes three assumptions:

NOTE: Feel free to update these details in the commands and configuration files, if your setup differs from these assumptions. Note the proxy server configurations were covered before and made the same assumption.

For the hardware specifications, JetBrains documentation provides pretty good guidelines for what kind of specs you would need for each of their services. As was the case above, both Hetzner and AWS allow easy upscaling, so I started with the least powerful instance that meets the minimum specs.

This ended up being a 4 vCPU, 8 GB RAM, and 160GB storage instance. I also added an extra 40 GB persistent storage volume to use as a backup for UpSource.

NOTE: If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get the JetBrains UpSource server started. As before, we install ufw to control access. We deny incoming access, but allow general ssh access and routing from the proxy server.

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

Next we download the UpSource standalone install package (the URL might be different with a newer version), create a directory and unzip the package there. I chose to install to /opt/ but you can use whatever directory structure you want.

We also create some directories that UpSource will use. I chose to use the /var/ as the parent directory, but you can place the folders pretty much anywhere you like. We also remove the install zip package, which is optional.

NOTE: Not all distributions come with unzip, so you might need to install it or use an alternative tool instead.

apt install ufw
ufw default deny incoming
uft default allow outgoing
ufw allow ssh
ufw allow from 10.0.0.2 to any port 4446
ufw enable
mkdir /opt/upsource
cd /opt
wget https://download.jetbrains.com/upsource/upsource-2019.1.1644.zip
unzip *.zip -d upsource
rm *.zip
mkdir /var/youtrack/data /var/youtrack/logs /var/youtrack/conf /var/youtrack/backups

Next, we configure UpSource. Be sure to change the domain you pass to the base-url. Instead of passing the directories in the command line, you can configure them using the web-based setup wizard the first time you connect.

cd upsource
cd upsource*
cd bin
./upsource.sh configure --listen-port 4446 --base-url https://upsource.yourdomain.com:443
./upsource.sh start

Now, if you navigate your web browser to https://upsource.yourdomain.com, you should be greeted by the YouTrack first launch wizard.

Setting up the JetBrains TeamCity server

With project and code management set up, we can move to building and deploying the commits; time to set up the TeamCity server.

My setup makes three assumptions:

NOTE: Feel free to update these details in the commands and configuration files, if your setup differs from these assumptions. Note the proxy server configurations were covered before and made the same assumption.

For the hardware specifications, JetBrains documentation provides pretty good guidelines for what kind of specs you would need for each of their services. As was the case before, both Hetzner and AWS allow easy upscaling, so I started with the least powerful instance that meets the minimum specs.

This ended up being a 2 vCPU, 2GB RAM with 40GB storage instance. I also added an extra 10 GB persistent storage volume to use as a backup for TeamCity.

NOTE: If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get the JetBrains TeamCity server started. As before, we install ufw to control access. We deny incoming access, but allow general ssh access and routing from the proxy server and access from the TeamCity Agent (which will be installed to 10.0.0.9 in my setup).

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

Next we download the TeamCity standalone install package (the URL might be different with a newer version), create a directory and unzip the package there. I chose to install to /opt/ but you can use whatever directory structure you want.

We also create some directories that TeamCity will use. I chose to use the /var/ as a parent directory, but you can place the folders pretty much anywhere you desire. We also remove the install zip package, which is optional.

NOTE: Not all distributions come with tar, so you might need to install it or use an alternative tool instead.

apt install
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from 10.0.0.2 to any port 4448
ufw allow from 10.0.0.9 to any port 4448
ufw enable
cd /opt
mkdir teamcity
wget https://download.jetbrains.com/teamcity/TeamCity-2020.1.tar.gz
tar -xzf TeamCity-2020.1.tar.gz
mkdir /var/teamcity/data /var/teamcity/logs
rm *.tar.gz
mv TeamCity teamcity
cd teamcity

We also need to install java and make sure the JAVA_HOME variable is properly set. The below commands should take care of that.

apt install default-jdk
update-alternatives --config java
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java

For TeamCity, things are configured in a configuration file. You can refer to TeamCity documentation, but basically you find the Connector node in the server.xml and change the value there. Then you are ready to fire up the TeamCity server.

nano conf/server.xml
cd bin
./teamcity-server.sh start

Now, if you navigate your web browser to https://teamcity.yourdomain.com, you should be greeted by the TeamCity server.

Setting up the JetBrains TeamCity agent

The TeamCity server uses agents for building. While you could set up the agents on the same instance as the TeamCity server, in my mind having the agent as it's own entity makes more sense.

My setup makes three assumptions:

Feel free to update these details in the commands and configuration files, if your setup differs from these assumptions. Note the proxy server configurations were covered before and made the same assumption.

For the hardware specifications, JetBrains documentation provides pretty good guidelines for what kind of specs you would need for each of their services. As was the case with all the services above, both Hetzner and AWS allow easy upscaling, so I started with the least powerful instance that meets the minimum specs.

This ended up being a 1vCPU, 2GB RAM, and a 20GB storage instance. Note that the specs of the agent influence how long the builds will take in addition to having to meet build system requirements. Since I was doing just simple Jekyll deployment, I could get away with the lowest spec. Storage requirements are also affected by how much the agents need to check out for the builds, which in my case was a low amount. You might need a larger volume.

I did not setup any backups for the agent, as the agent should not have a need for persistence and recovery; you just spin them up for building.

If starting with fresh instances, as a best practice you should update and upgrade your system before using the commands in this guide. On Debian 10, that means apt-get update and apt-get upgrade with possibly an apt-get dist-upgrade, depending how old the images your service provider uses are.

Below is the list of commands to get the JetBrains TeamCity agent started. As before, we install ufw to control access. We deny incoming access, but allow general ssh access.

NOTE: Since I used a root user account, if you are using a limited user account you might have to run some commands in this guide with elevated user privileges e.g. sudo.

Next we download the TeamCity standalone agent package from the TeamCity server, create a directory and unzip the package there. I chose to install to /opt/ but you can use whatever directory structure you want. Alternatively, you could push the package from the TeamCity server. We also remove the install zip package, which is optional.

After that, we create the configuration file for the agent by specifying its name and the address of the TeamCity server on the buildAgent.properties file. Finally, we start the agent after which it should show up in you TeamCity server.

NOTE: Not all distributions come with unzip, so you might need to install it or use an alternative tool instead.

ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw enable
cd /opt
wget https://teamcity.yourdomain.com/update/buildAgentFull.zip
mkdir teamcity-agent
unzip *.zip -d teamcity-agent
rm *.zip
cd teamcity-agent
mv conf/buildAgent.dist.properties conf/buildAgent.properties
nano conf/buildAgent.properties
cd bin
./agent.sh start

How to improve the setup

Obviously there are multiple ways to make this setup niftier. You could set up the services to restart automatically should the VPS require restarting or powering down for any reason. You could set up logging and backups. You could make the installation more secure by hardening SSH access, and by creating separate users under which the services run to limit possible damage if security vulnerabilities were discovered in the services. You could add fail2ban to automatically ban would-be offenders looking for holes in your systems.

All of the above are sensible things to do. However, as not everyone wants or needs to do all of it, I opted not to cover any in this writeup. The topics are readily covered online, so you should be able to find the information you need should you wish to make additional improvements.

What to do next

Now that you have all the services running, it is time to learn how they operate. JetBrains has pretty good documentation and the systems are quite well designed, so most things are logical to do.

I usually start by adding my repositories to UpSource. Then, inside Hub, I create the matching YouTrack projects to get started. For the projects I need a CD/CI implementation, setting up TeamCity builds is a natural follow-up step.

You could even consider moving your system to AWS. Migrating there should be good practice and the JetBrains documentation helps guide what you need to move to recover as you already know how to install the systems.

I hope this write-up was of help to you. If you have any questions, feel free to comment below.

DISCLAIMER: I wrote this guide as I found that the official documentation kind of points you in the right direction but leaves in some guesswork. I had the same experience with the Docker installation in the past. As this was my third time setting things up, I decided to do a write up in case I ever do a fourth one. The write-up was done based on my command history, so I hope there aren't too many blanks or oversights as I no longer had access to the config files.