April 23, 2025
With my server running and reasonably secure, it was time to set up a proper homepage! I
already had Grafana exposed at grafana.jamesmassucco.com
but I didn't have
a proper root site at jamesmassucco.com
. Again, I relied on ChatGPT to get
started. I told it I wanted a sleak and simple website for showcasing my coding, and it
rendered a terminal-style website, and then generated some CSS and HTML to make it real!
It honestly did a phenomal job, and all I really had to do was edit the content it had
populated to align with what I wanted to say.
To serve it up, I added a new docker-compose.yml
under the new top-level
director homepage/
to create an nginx
container with a my
homepage/site/
directory mapped into the
/usr/share/nginx/html
directory of the container. After that, all I need to
do was add my desired top-level directory to my cloudflare-ddns
setup and
it was automatically registered to Cloudflare, and boom - I was able to access my
website!
Once I had a homepage, I wanted to add a bit more content, so I (agin with help from ChatGPT) cooked up a Metrics page! I initially wanted to embed Grafana directly in the page to show metrics, but this raised some security red flags due to the use of IFrames, and so I opted instead to generate some fake metrics, both static ones and a bit of JavaScript to make some dynamic plots.
Repo Quality of Life
Since the website came together more quickly than I'd expected, I decided to spent a bit
of time on repo quality of life items. First, I setup a .vscode/
directory
with settings.json
and extensions.json
files so that default
settings get automatically applied in any VSCode session accessing the repo, and so that
the required extensions are automatically suggested.
Next, I added linters: Prettier (HTML/CSS/Markdown), Stylelint (CSS), and Ruff (Python). I made sure to update the VSCode extensions to include them all, and set up configuration files for them in the root of the repo using some basic settings.
Finally, I setup a bootstrap.sh
script to provision a fresh install of the
repo with the required dependencies. There's still some work to be done there, because
it does a lot of unnecessary work and has some error messages, but it's enough for now.
This will be helpful when I start to expand my cluster to multiple pieces of hardware
and want to provision the repo on each of them during initial configuration.