Installing Rocket.Chat on Ubuntu Xenial 16.04 via Snap

This is a simple tutorial to get Rocket.Chat running on a Ubuntu Xenial 16.04 server (You’ll likely be perfectly fine to run through the same process on a different Ubuntu version such as 18.04 if you’d prefer) In this case we’re installing this on a fresh server and we’ll be installing Rocket.Chat as a Snap and using Caddy as a reverse proxy. Caddy will also deal with issuing SSL certificates via Let’s Encrypt. With this you’ll be able to get Rocket.Chat up and running within ~10 minutes, from there you can go on and make further server configuration changes for security and so on, as well as configure Rocket.Chat in more depth – which won’t be covered within the scope of this tutorial.


Let’s first start with some updates.

sudo apt-get upgrade
sudo apt-get update


Basic UFW setup

Let’s setup a basic firewall using UFW. First install UFW if it’s not installed –

sudo apt-get install ufw


Setup the default access rules –

sudo ufw default deny incoming
sudo ufw default allow outgoing


Setup the firewall rules that we’ll want –

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp


Enable the firewall –

sudo ufw enable


You can check the status of ufw with –

sudo ufw status


If you add or remove rules you should reload ufw with –

sudo ufw reload


If you need to disable ufw you can do so with –

sudo ufw disable


Install Fail2Ban

sudo apt-get install fail2ban


Install Rocket.Chat as a Snap

Install Snap if it’s not already installed –

sudo apt-get install snapd


Install Rocket.Chat –

sudo snap install rocketchat-server


At this point the Rocket.Chat service will have automatically started, you can check if it’s running with –

sudo service snap.rocketchat-server.rocketchat-server status


Configure Caddy and SSL

Initial configuration-

sudo snap set rocketchat-server caddy-url=https://<your-domain-name>
sudo snap set rocketchat-server caddy=enable
sudo snap set rocketchat-server https=enable
sudo rocketchat-server.initcaddy


Assuming you didn’t have any errors, restart Rocket.Chat and Caddy –

sudo systemctl restart snap.rocketchat-server.rocketchat-server.service
sudo systemctl restart snap.rocketchat-server.rocketchat-caddy.service


You can check Caddy’s logs with the following command

journalctl -r | grep caddy | less


Redirect HTTP to HTTPS

Redirecting HTTP to HTTPS is handled in the Caddy configuration by ommitting the http or https prefix. For instance you should have something like this inside /var/snap/rocketchat-server/current/Caddyfile –

your-domain-name.com {
  proxy / localhost:3000 {
    websocket
    transparent
  }
}


Restart Caddy once again after saving your changes –

sudo systemctl restart snap.rocketchat-server.rocketchat-caddy


Onto Rocket.Chat itself!

At this point you’ll have a working Rocket.Chat installation running. You can browse to https://yourserver.com and you should be presented with the Setup Wizard screen to create the first user whom will by the Admin by default.

Once logged in, you may get a pop-up stating something along the lines of – The setting Site URL is configured to http://localhost and you are accessing from https://yourserver.com - Do you want to change to https://yourserver.com ? – You’ll want to click YES.

At this stage you’ll want to setup Rocket.Chat itself, so please refer to their documentation here – https://rocket.chat/docs


~Extra~

You can install a Discord style dark theme using this here! https://github.com/0x0049/Rocket.Chat.Dark


Backup and restore or migrate a Snap based installation of Rocket.Chat

This is a simple tutorial to backup and restore, or backup and migrate a Snap based installation of Rocket.Chat.


Stop the Rocket.Chat server

First you’ll need to stop the Rocket.Chat server.

sudo service snap.rocketchat-server.rocketchat-server stop

Note that we’re only stopping the rocketchat-server service, not the MongoDB service, which should still be running. Check with –

sudo service snap.rocketchat-server.rocketchat-mongo status | grep Active
Active: active (running) (…)


Create a backup.

sudo snap run rocketchat-server.backupdb

You should see output similar to this –

[+] A backup of your data can be found at /var/snap/rocketchat-server/common/backup/rocketchat_backup_<timestamp>.tar.gz

Download that backup file over SFTP for instance, or transfer it to the server you’re migrating your Rocket.Chat installation to.

Your Rocket.Chat server will still be stopped at this point, so if you just wanted to create a backup for your existing installation, you can start the server back up with –

sudo service snap.rocketchat-server.rocketchat-server start


Migrate (or restore) from backup

Now if we’re going to migrate our Rocket.Chat installation, on the server we’re migrating the installation to, you’ll want to have already installed Rocket.Chat as a Snap. Once done upload the *.tar.gz backup file from earlier to /var/snap/rocketchat-server/common/ on the destination server.

Once again, stop the rocketchat-server service, but not the MongoDB service –

sudo service snap.rocketchat-server.rocketchat-server stop

sudo service snap.rocketchat-server.rocketchat-mongo status | grep Active
Active: active (running) (…)

Restore using the *.tar.gz backup that we created –

sudo snap run rocketchat-server.restoredb /var/snap/rocketchat-server/common/rocketchat_backup.tgz

*** ATTENTION ***
* Your current database WILL BE DROPPED prior to the restore!
* Would you like to make a backup of the current database before proceeding?
* (y/n/Q)>

Y

[*] Extracting backup file...
[*] Restoring data...
[*] Preparing database...
[+] Restore completed! Please restart the snap.rocketchat services to verify.

Start the Rocket.Chat server at this point, and your installation will now be running based on the Rocket.Chat Snap backup that was performed!

sudo service snap.rocketchat-server.rocketchat-server start

Installing Rocket.Chat on Ubuntu Xenial 16.04 via Snap with an NGINX reverse proxy

Please note that Rocket.Chat Snap’s now come with Caddy to deal with the reverse proxy and free SSL certificate’s via Let’s Encrypt – so you may wish to refer to my newer post here. NGINX won’t have websockets configured if you use this guide – which are required if you intend to use the mobile Rocket.Chat apps.

This is a simple tutorial to get Rocket.Chat running on a Ubuntu Xenial 16.04 server (You’ll likely be perfectly fine to run through the same process on a different Ubuntu version such as 18.04 if you’d prefer) In this case we’re installing this on a fresh server and we’ll be installing Rocket.Chat as a Snap and using NGINX as a reverse proxy, as well as setting up an SSL certificate via Let’s Encrypt. With this you’ll be able to get Rocket.Chat up and running within ~10 minutes, from there you can go on and make further server configuration changes for security and so on, as well as configure Rocket.Chat in more depth – which won’t be covered within the scope of this tutorial.


Let’s first start with some updates.

sudo apt-get upgrade
sudo apt-get update


Basic UFW setup

Let’s setup a basic firewall using UFW. First install UFW if it’s not installed –

sudo apt-get install ufw


Setup the default access rules –

sudo ufw default deny incoming
sudo ufw default allow outgoing


Setup the firewall rules that we’ll want –

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp


Enable the firewall –

sudo ufw enable


You can check the status of ufw with –

sudo ufw status


If you add or remove rules you should reload ufw with –

sudo ufw reload


If you need to disable ufw you can do so with –

sudo ufw disable


Install Fail2Ban

sudo apt-get install fail2ban


Install Rocket.Chat as a Snap

Install Snap if it’s not already installed –

sudo apt-get install snapd


Install Rocket.Chat –

sudo snap install rocketchat-server


At this point the Rocket.Chat service will have automatically started, you can check if it’s running with –

sudo service snap.rocketchat-server.rocketchat-server status


Install and configure NGINX to use as a reverse proxy + SSL setup

Install NGINX –

sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx


Remove the default NGINX site –

sudo rm /etc/nginx/sites-enabled/default


Create the NGINX config for Rocket.Chat

sudo vim /etc/nginx/sites-available/rocketchat.conf


Once inside vim, you should have the following (edit “yourserver.com” to be your actual domain that you’re going to use for this server) –

server {
     listen 80;
 
     server_name yourserver.com; 

     location / {
     proxy_pass http://localhost:3000/; 
     }
 }


Enable the new configuration by creating a link to it from /etc/nginx/sites-available/ –

sudo ln -s /etc/nginx/sites-available/rocketchat.conf /etc/nginx/sites-enabled/


Test the configuration –

sudo nginx -t


Assuming no errors are reported, reload the NGINX config with –

sudo nginx -s reload


SSL Setup using Let’s Encrypt + Certbot

Install Certbot and run it –

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx


Follow the prompts on screen and you should be issued a valid Let’s Encrypt SSL certificate. Make sure you do choose to force a HTTPS redirect when prompted.

Certbot will automatically deal with SSL certificate renewal, a cron will automatically be created under /etc/cron.d/certbot. You can test the renewal process as a dry run via –

sudo certbot renew --dry-run


Certbot will have updated the NGINX configuration, test that the config is valid with –

sudo certbot renew --dry-run


Assuming no errors are reported, reload the NGINX config with –

sudo nginx -s reload


Onto Rocket.Chat itself!

At this point you’ll have a working Rocket.Chat installation running. You can browse to https://yourserver.com and you should be presented with the Setup Wizard screen to create the first user whom will by the Admin by default.

Once logged in, you should get a pop-up stating something along the lines of – The setting Site URL is configured to http://localhost and you are accessing from https://yourserver.com - Do you want to change to https://yourserver.com ? – You’ll want to click YES.

At this stage you’ll want to setup Rocket.Chat itself, so please refer to their documentation here – https://rocket.chat/docs


~Extra~

You can install a Discord style dark theme using this here! https://github.com/0x0049/Rocket.Chat.Dark


Updating Slack status to reflect Zoiper5 call state using Slack API.

Github page – https://github.com/james-reed/zoiper-slack-status

I wanted a simple way of having my Slack status automatically update when I take a phone call using Zoiper. The majority of VoIP handsets or softphones support the opening of a URL during a certain event such as picking up or ending a call – which can be leveraged for various uses as you can imagine. Zoiper supports this method, but also has ability to execute files/applications on such events. In this particular project, when a phone call is answered Zoiper will launch set-status-in-call.pyw and pass the incoming caller ID using {number} which is one of a few supported Zoiper variables.

Full list of Zoiper variables here

If an incoming call from 0212345678 is answered, then the Slack status will change to Currently in a call with 0212345678 with the telephone_reciever emoji set.

Once the call is hung up, Zoiper will launch set-status-clear.pyw on that particular event which then clears the Slack status out.

The use of the .pyw extension will make the code execute in the background instead of popping up a command window or similar – as you’ll see if running this on Windows.

Setup

  1. You’ll want to install Python on your device. This has been tested using Python v3.6.x but should be fine with ~v2 if you’re using that.
  2. You will need the Python “requests” module which can be installed with pip install requests
  3. You will need your Slack API token. At the time of writing it’s possible to grab this by logging into the Slack via your web browser and then using the developer tools in your web browser to perform inspections when making a change such as updating your status. You should be able to comb through and grab your API token – further information on doing this is outside of the scope of this documentation. Once you have your API token, replace the YOUR_SLACK_TOKEN_GOES_HERE variable with your actual token.
  4. Setup your Zoiper client as per the following screenshots. In Zoiper5 you can add Event Rules under Settings > Features > Automation > Edit Open URL Rule

Create a rule for when the call state changes to Answered and point it to set-status-in-call.pyw {number}

Create a rule for when the call state changes to Hang Up and point it to set-status-clear.pyw {number}

Set Slack status phone BLF with Zoiper5 – without API access.

I’m sharing in this post an older and not really ideal at all method to automatically change your Slack status when taking a call using Zoiper5. The ideal way to achieve this is to have some integration between your PBX and Slack so that user statuses can be changed based on the extension BLF status. The other ideal way would be to use the Slack API. If you find yourself in a situation where you don’t have permissions to work in either of these realms – this is a janky but working solution!

In this guide we’re using a Windows OS environment, and AutoHotKey.

For this I’m just placing these files on the desktop but you can put them anywhere you’d like, just make sure inside the “slack-set*” scripts you update the Include path for “TrayIcon.ahk” to the location you’ve placed that file.

Download “TrayIcon.ahk”

Download “slack-set-in-call.ahk”

Download “slack-set-call-finished.ahk”

Inside Zoiper5 (you will need a licensed copy to do this)

Create two rules as below –

Go to Settings > Automation > Event Rules > Add Rule

OnCall status change
Call State changes toAnswered
And call direction isBoth Incoming and Outgoing
Do action Open/Execute Application
Open URL/RUNC:\Users\james\Desktop\slack-set-in-call.ahk

On – Call status change
Call State changes toHangup
And call direction isBoth Incoming and Outgoing
Do actionOpen/Execute Application
Open URL/RUNC:\Users\james\Desktop\slack-set-in-call.ahk

Your Slack status will now automatically change when you take a call and when you hangup that call. This all happens very quickly but obviously due to how this method works, if you focus onto a different app the moment this script runs then it’ll mess up. All this method does is bring the Slack window into focus and slam in a “/status” command. I always have my Slack window open on one of my monitors and haven’t had any issues myself using this crude method.

Magedok 11.6 inch 1080P FHD IPS USB-C capacitive touch portable monitor (T116C)

I’d been searching for a portable external monitor and was mostly seeing AOC’s offerings and the Asus Zenscreen, then eventually I’d been turned onto the brand “Magedok”. Magedok have some incredibly good value offerings however there isn’t a whole ton of information available online as far as reviews go. This isn’t a proper review as it were, but I’ll note my experience with the Magedok monitor that I ended up purchasing – Magedok 11.6 inch 1080P FHD IPS USB-C capacitive touch portable monitor (T116C)

 

The monitor’s packaging – very well packed and protected, no worries there.

Included along with the monitor is a stand which is actually fairly reasonable, a mini HDMI to HDMI cable, a USB-C to USB-A cable, two Magedok velcro cable ties, an instruction manual and screws for VESA mounting.

Unfortunately I don’t have a great camera (or cameraman skills) to show off the monitor’s panel, however in person it looks amazing with deep blacks and great viewing angles as you’d expect from an IPS panel.

My final monitor arrangement with the Magedok screen on the bottom left.

Note that this monitor doesn’t come with a USB-C to USB-C cable, so you’ll need to source one separately. I’ve currently got this plugged in using both the USB-C port and mini HDMI port – I did try using a USB-C to USB-C cable directly to my motherboard which is an Asus x99-Deluxe II – however this didn’t give me any video signal, only power. I’ll need to look further into how this element of the monitor is supposed to work. I’d imagine if you’re plugging this directly into something like a newer laptop with USB-C it should just work fine with the single cable as indicated in the manual. The panel quality far exceeded my expectations and looks amazing. It’s certainly portable as it’s rather light and thin but still solid feeling – no complaints at all about the build quality. The rear has a nice rubberized feel which is soft and grippy enough, and the menu buttons on the back + OSD are good enough. If you have decent vision then I think you could probably get away with using the monitor at full 1080p without changing the scaling settings – otherwise 125% scaling is fine. This shipped out from HK to Australia within ~3 business days from purchase to arrival which is awesome. At a later stage I’d like to test two of these with a laptop to see how viable they are for extending a laptop to have 2x additional monitors using only USB-C cables.

So in summary – Fast shipping with decent packaging, great 1080p IPS touchscreen panel, solid build quality and certainly light enough to be portable – $159 USD shipped at my date of purchase. Highly recommended!

Unlimited prepaid 4G data sim for Taiwan – Chunghwa Telecom

Are you traveling to Taiwan sometime soon and would like a data sim for internet access? I can recommend Chunghwa Telecom’s offerings – this was the provider I ended up choosing during my travels. You can purchase a card with unlimited data on a time basis anywhere from 3 days to 30 days. You’ll get some voice credit included for making calls too, it’s a pretty good deal and certainly better than the options I’d come across nearby in Japan and Korea. For a 30 day SIM it’s ~1000NTD or roughly $45 AUD at the current moment. Another great inclusion is that Chunghwa operate WiFi hotspots in various locations so you can connect to these using your SIM card and unlike other providers you might have run into you don’t need to enter in login details each time you connect. The SIM card provides authentication so you can seamlessly jump between hotspots and 4G.

Current pricing directly through Chunghwa

You can purchase a SIM either directly through Chunghwa here.

Or via one of their resellers such as kkday here.

Both options offer airport pickup – simply choose the date you intend to arrive and then you can pickup the SIM at the airport. You will need to book your SIM ~3 or more days before the date you intend to pick it up. Personally I bought my SIM through kkday as at the time they allowed a shorter period of time between the booking and pickup date. Instructions on where to pickup the SIM are shown on the website and it was easy enough to find on the day. You will need two forms of ID – a passport and some other kind of photo ID such as a driver’s license.

The speeds were very good and there wasn’t any limiting or speed throttling that I noticed. I performed a large backup to Google Drive >200GB without any issues. This is a “true” unlimited service. I had no issues getting decent signal and speeds outside of Taipei either, the SIM worked great in Hualien for instance.

138mbps download / 37mbps upload – 4G speedtest in Taipei

~93mbps download / ~28mbps upload over WiFi in Taipei

FreeNAS CPU core and disk temperature check script

This is a nice simple script to display CPU core and disk temperatures on a FreeNAS server. Tested with FreeNAS 9.10.2-U1


Create a file with the following content – Mine is just called “temps_check_script.sh” as an example.

# Write some general information
echo System Temperatures - `date`
uptime | awk '{ print "\nSystem Load:",$10,$11,$12,"\n" }'

# Write CPU temperatures
echo "CPU Temperature:"
sysctl -a | egrep -E "cpu\.[0-9]+\.temp"

# Write HDD temperatures and status
echo "HDD Temperature:"
for i in $(sysctl -n kern.disks | awk '{for (i=NF; i!=0 ; i--) if(match($i, '/da/')) print $i }' ) ; do
echo $i: `smartctl -a -n standby /dev/$i | awk '/Temperature_Celsius/{DevTemp=$10;} /Serial Number:/{DevSerNum=$3}; /Device Model:/{DevVendor=$3; DevName=$4} END {printf "%s C - %s %s
(%s)", DevTemp,DevVendor,DevName,DevSerNum }'`;
done


Run it with ./temps_check_script.sh – The output looks like this:

System Temperatures - Wed Jun 21 07:53:16 AEST 2017

System Load: 0.17

CPU Temperature:
dev.cpu.3.temperature: 40.0C
dev.cpu.2.temperature: 44.0C
dev.cpu.1.temperature: 40.0C
dev.cpu.0.temperature: 42.0C

HDD Temperature:
ada0: 27 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
ada1: 27 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
ada2: 27 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
ada3: 28 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
ada4: 28 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
ada5: 27 C - Hitachi HDS5C3020ALA632 (SERIALNUMBERGOESHERE)
da0: 32 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)
da1: 31 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)
da2: 29 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)
da3: 30 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)
da4: 31 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)
da5: 30 C - TOSHIBA MD04ACA400 (SERIALNUMBERGOESHERE)

Me Know No Nihongo – Part 1 – Learning Hiragana & Katakana

Welcome to the first post of the “Me Know No Nihongo” series. In this series of posts I’ll simply be going over some of my Japanese language learning – primarily using the textbook “Minna No Nihongo”. I am by no means an expert when it comes to the Japanese language, in fact I am pretty far from that! Essentially I intend to use this series of posts as a means of revision for myself and to perhaps help some other learners out there that are using Minna No Nihongo. Even if you are using a different textbook, hopefully you can find something useful in my posts. I will outline and share various learning tools and methods that have helped me personally. This will include many free or cheap resources that are readily available, and also some that I have created myself. I will rarely ever delve into the concepts – for the most part I will just be providing resources and learning techniques. (Yes, “Me Know No Nihongo” is a dumb play on “Minna No Nihongo”)

 

Part 1 – Learning Hiragana & Katakana

You may already know that written Japanese is split into Hiragana, Katakana, Kanji and Romaji. Hiragana and Katakana are the “Kana”. These are essentially the phonetic alphabets in Japanese (technically they aren’t alphabets but I won’t go into that). You will need to learn how to read, write and pronounce all of the characters. It is a lot easier than it first seems. It won’t take you very long to conquer.

I would first recommend getting an app called “Dr Moku”. The developers claim with this app you can “Learn Hiragana and Katakana IN ONE HOUR with mnemonic tricks!”. It certainly took me a longer than an hour to learn all of the Hiragana and Katakana properly, but maybe it will only take you an hour. I found this app to be very helpful when starting out.

I’d recommend doing drills as often as possible using an app called Kana Mind.

You can practice your actual writing/stroke order using an app called Kana Writing. This works really well if you have a tablet or phone that you can comfortably use a stylus on. You want to emulate the writing experience as much as possible. Once you have gone through the entire Hiragana and Katakana in this app a bunch of times, start writing everything out on paper as well. It may be a bit dull writing the same characters over and over again but at a certain point it will all just “click” and you’ll start progressing quickly.

A little bit of poor form there having “Writting” as an error…

These timed drag and drop exercises are also helpful for character recognition.

Hiragana Drag-n-Drop

Katakana Drag-n-Drop

You may also want to print out some charts, or perhaps use these as a desktop wallpaper. Click on the images below to open the full size images. They are pretty big and are perfect for printing.

Try to get some practice in whenever you have a spare moment. Taking a dump at work? Get your phone and do some app drills. Stuck on a phone call? Practice some writing by just doodling on some nearby paper. You should have everything committed to memory a lot quicker than you would have thought it’d take.

 

Additional resources

I’d recommend heading over to the Learn Japanese sub-reddit. There are a lot of helpful links, posts and people!

My 4RU Rosewill RSV-L4500 ~22TB usable storage FreeNAS Build

This is my current storage box, which originally started in a Fractal R3 Define case, and had slowly been upgraded over the years.

  • Rosewill RSV-L4500 Chassis
  • Seasonic S12II 620W Power Supply
  • Front fans – 3x Corsair SP120 Performance Edition ~2350 RPM (these are way louder than the stock fans!)
  • Center bracket fans – 3x Corsair SP120 Quite Edition ~1450 RPM
  • Rear fans – 2x stock 80mm fans that come with the case
  • CPU Fan – Noctua NH-L9i
  • Motherboard – ASUS P8B-X
  • CPU – Xeon E3-1220 – 3.1ghz (LGA1155)
  • RAM – 2x – Kingston Technology ValueRAM 8GB 1333MHz DDR3 ECC CL9 DIMM (16GB total)
  • LSI 9220-8i in IT Mode + motherboard SATA for disks
  • 6x 4TB Toshiba MD04ACA400 in RAIDZ2
  • 6x 2TB Hitachi (5200rpm model) in RAIDZ2

As you can see, it’s pretty damn messy to cable when you have no backplane!

nas1 nas2 nas3 nas5 nas6 nas7

The front fans and also the rear fans are powered using chained molex adaptors which is certainly messy. The center bracket fans are plugged straight into the motherboard. I’m considering one of those fan controllers that have something like 8x 3pin fan headers powered by a single molex, which can then either float in the case or be mounted somewhere. Not sure yet if I should replace the rear 80mm fans or not. There is a single fan header empty near that end of the motherboard, running one off that would be neater than the molex.

It took quite some time to choose a power supply for this build. This PSU was chosen based on how I could distribute the rail amperage for the disks. You will find it’s not really possible to use the chained SATA power due to how close the drives are together when bending the cable. A bunch of SATA power and SATA>Molex splitters have been used, however everything is distributed so that no single cable has too many drives so that the rails are not overloaded.

This box lives under my bed. It’s not running 24/7 (not even close actually), but rather to backup and snatch files to/from perhaps 2/3x a month for ~4 hours each time. Ambient temperatures are pretty high here. I’m yet to do a full load/temp test on the CPU since changing all of the cooling from stock – previously when the ambient temp was ~27c the CPU at ~90% load was hitting ~65c on all cores – not great considering the intel rated max for this CPU is apparently 69c.

I think if you live somewhere with an ambient temperature that sits around 20c, you’d be totally fine using all of the stock cooling for this case.

~2TB free space left on both arrays at this point. I would like to move to having less drives and a smaller form factor in future once drive sizes increase and the prices for drives go down.