Building & Deploying a Hugo + Blowfish Website on Debian/Ubuntu (Complete Developer Workflow) #
A step-by-step guide for developers who want to build a Hugo site using the Blowfish theme β starting locally on Ubuntu/Debian, then deploying to a VPS running Nginx or Apache.
This article covers:
- Installing Hugo correctly on Debian/Ubuntu
- Creating a Hugo project
- Adding Blowfish using Git submodules
- Configuring your theme and site metadata
- Local development workflow
- Deployment approaches (zip + SCP, public folder only, or remote sync)
- Nginx/Apache setup for serving the final site
π Official References #
- Hugo documentation: https://gohugo.io/documentation/
- Blowfish theme documentation: https://blowfish.page/docs/
1. Installing Hugo on Ubuntu/Debian #
β οΈ Debian/Ubuntu Repositories Contain an Old Version #
Debian & Ubuntu apt repositories frequently ship outdated Hugo versions. Example:
sudo apt install hugo
This often installs a version without βextendedβ SASS support, breaking many modern themes (including Blowfish).
βοΈ Recommended: Install Hugo via Snap #
Snap provides the newest “extended” version reliably.
sudo snap install hugo --channel=extended
Check version:
hugo version
You should see something like:
hugo v0.135.0+extended
2. Create Your Hugo Site Locally #
Choose any folder in your home directory:
hugo new site blogs
cd blogs
Initialize Git (optional but recommended):
git init
git add .
git commit -m "Initial Hugo site"
If using GitHub:
git remote add origin https://github.com/USERNAME/REPO.git
git push -u origin main
3. Install the Blowfish Theme #
There are three possible ways to install themes in Hugo:
A β Copy theme folder directly (bad for updates) #
B β Git clone theme into /themes (works but messy) #
C β Git submodule (recommended) #
βοΈ Best method: Git submodule
git submodule add -b main https://github.com/nunocoracao/blowfish.git themes/blowfish
This keeps Blowfish locked to a version and easy to update later:
git submodule update --remote --merge
4. Configure Blowfish Theme Files #
Follow the official Blowfish installation guide: https://blowfish.page/docs/installation/#set-up-theme-configuration-files
Copy Blowfish example config files:
cp themes/blowfish/config/_default/* config/_default/
This gives you:
config.tomlparams.tomlmenus.tomllanguages.toml
Now edit these files to match your site.
5. Basic Theme Settings to Adjust #
Open:
config/_default/params.toml
Change:
Site title & description #
title = "My Blogs"
description = "Developer Blog Built with Hugo + Blowfish"
Color scheme #
colorScheme = "noir"
defaultAppearance = "dark"
autoSwitchAppearance = false
Disable placeholder favicons & use your own #
Drop favicon files into:
static/
favicon.ico
favicon-16x16.png
favicon-32x32.png
apple-touch-icon.png
android-chrome-512x512.png
Blowfish automatically picks them up.
6. Create First Content Pages #
Example:
hugo new posts/my-first-post.md
Or make an “About” page using a leaf bundle:
content/about/
index.md
feature.jpg
Front matter example:
---
title: "About Me"
description: "Developer & Engineer"
showHero: false
---
7. Run Local Development Server #
Use the two most important Hugo development flags:
--disableFastRenderensures all changes rebuild--ignoreCacheprevents stale assets
Run:
hugo server --disableFastRender --ignoreCache
Open browser: http://localhost:1313/
Verify:
- Menus
- Site title & metadata
- Favicon
- Theme colors
- Blog posts
- About page
- Images + leaf bundles
Continue editing until satisfied.
8. Preparing for Deployment #
You have three deployment options:
Option 1 β Zip Full Repo & SCP to Server #
On your laptop:
cd ..
zip -r blogs.zip blogs/
scp blogs.zip user@yourvps:/var/www/
On VPS:
unzip blogs.zip
cd blogs
Install Hugo (snap or binary), then:
hugo --minify
Static website appears in:
public/
Option 2 β Only Upload the Generated public/ Folder
#
On local machine:
hugo --minify
Upload to server:
scp -r public/ user@yourvps:/var/www/YOURDOMAIN/
This is the lightest deployment method.
Option 3 β Remote Sync (VS Code SFTP, rsync, or WinSCP) #
Example with VSCode SFTP extension:
- Edit locally
- Press Upload
- Server receives
public/folder - No need to install Hugo on server
Or use rsync:
rsync -avz public/ user@yourvps:/var/www/YOURDOMAIN/
9. Configure Nginx (Recommended) #
Create a new site block:
sudo nano /etc/nginx/sites-available/blogs.example.com
Insert:
server {
listen 80;
server_name blogs.example.com;
root /var/www/blogs.example.com/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Enable site:
sudo ln -s /etc/nginx/sites-available/blogs.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Add HTTPS (optional but recommended):
sudo certbot --nginx -d blogs.example.com
10. Apache Alternative #
Create site config:
sudo nano /etc/apache2/sites-available/blogs.example.com.conf
Add:
<VirtualHost *:80>
ServerName blogs.example.com
DocumentRoot /var/www/blogs.example.com/public
<Directory /var/www/blogs.example.com/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Enable:
sudo a2ensite blogs.example.com
sudo systemctl reload apache2
11. Final Test on Server #
Visit:
https://blogs.example.com
Verify:
- Pages load
- CSS/JS applied correctly
- Icons display
- Images + leaf bundles render properly
- No 404 issues
If everything looks good β your Hugo + Blowfish site is fully deployed!
π Conclusion #
You have now:
β Installed Hugo the correct way (Snap extended version) β Created a new Hugo project β Added Blowfish cleanly using Git submodules β Configured site + theme + metadata β Built a local workflow β Deployed the site to a VPS using SCP or rsync β Served it via Nginx or Apache
From here, you can continue adding:
- Posts
- Content pages
- Taxonomies
- Custom layouts
- Assets
Blowfish is extremely flexible β explore the rest of the docs to unlock more features: https://blowfish.page/docs/