First and foremost, make sure to use a decent internet connection on both ends of the VPN tunnel of course. As this was completely unprecedented (we never had more than 20 people working from home simultaneously before) we were lacking numbers of "how much bandwidth will it take for some 50 people to work from home". The answer comes from the firewall – the bottleneck is the upload from the company. 15 MBits upload are just enough for 50 people to work with, a tad more wouldn't hurt.
Next comes the software. I've blogged about our general setup before and talked about new specifics during our Roadshow last fall. Our current setup is as follows:
- Redmine as Project Management System
- TeamCity as Continuous Integration Server
- Upsource for Code Reviews
- Mattermost for self hosted, secure team chat
The importance of a good team communication channel like Mattermost is evidenced by this shot from our live server's system console statistics – see what happened once we all started working from home:
From the software setup, you'll quickly realize we love free and open source tools although we're on the paid channel for the Jetbrains servers. Due to the current situation, we had to add a virtual conferencing solution to our zoo. After evaluating Zoom and Blizz, we decided to go for the latter, basically because we already use TeamViewer for our tech support and presentations and are happy with it.
As all these tools need to blend together nicely, we realized there was a missing link – there's no (or I was unable to find it) connection that allows for seamless blizz meeting invitations in Mattermost.
When googling for the best way to write custom integrations, you inevitably stumble upon custom slash commands. However, there's no easy way to just get a string in – string out.
You actually have to offer an http(s) endpoint that takes a payload similar to what's received from a form submit and returns some JSON. Enter the glory of .NET Core: Using a .NET Core Web-API project it was easy to come up with a self contained Kestrel-using slash command handler that can easily be extended for other custom slash commands as well. I used Lorenzo Polidori's httpcontentparser but had to adapt it a bit in order to work asynchronously (well, kind of, it's really a hack to get it up and running quickly). The sources for doing this are on GitHub.
To set it up you need to add the IP of the machine where this is hosted in the System Console > Developer > Allow untrusted internal connections. Next, add a new slash command via the "Integrations" menu. This is what the config looks like on our live server:
Now everyone can simply type /blizz <MeetingID> to create a message like this:
Maybe this can be useful to you as well. Stay safe these days!