Previews and Deployment
There are multiple possible options for deploying a Hugo site, including Netlify, Firebase Hosting, Bitbucket with Aerobatic, and more; you can read about them all in Hosting and Deployment. Hugo also makes it easy to deploy your site locally for quick previews of your content.
Serving your site locally
Depending on your deployment choice you may want to serve your site locally during development to preview content changes. To serve your site locally:
Ensure you have an up to date local copy of your site files cloned from your repo. Don’t forget to use
--recurse-submodules
or you won’t pull down some of the code you need to generate a working site.git clone --recurse-submodules --depth 1 https://github.com/my/example.git
Note
If you’ve just added the theme as a submodule in a local version of your site and haven’t committed it to a repo yet, you must get local copies of the theme’s own submodules before serving your site.
git submodule update --init --recursive
Ensure you have the tools described in Prerequisites and installation installed on your local machine, including
postcss-cli
(you’ll need it to generate the site resources the first time you run the server).Run the
hugo server
command in your site root. By default your site will be available at http://localhost:1313/.
Now that you’re serving your site locally, Hugo will watch for changes to the content and automatically refresh your site. If you have more than one local git branch, when you switch between git branches the local website reflects the files in the current branch.
Build environments and indexing
By default, Hugo sites built with hugo
(rather than served locally with hugo server
) have the Hugo build environment production
. Deployed Docsy sites with production
builds can be indexed by search engines, including Google Custom Search Engines. Production builds also have optimized JavaScript and CSS for live deployment (for example, minified JS rather than the more legible original source).
If you do not want your deployed site to be indexed by search engines (for example if you are still developing your live site), or if you want to build a development version of your site for offline analysis, you can set your Hugo build environment to something else such as development
(the default for local deploys with hugo server
), test
, or another environment name of your choice.
The simplest way to set this is by using the -e
flag when specifying or running your hugo
command, as in the following example:
hugo -e development
Deployment with Netlify
We recommend using Netlify as a particularly simple way to serve your site from your Git provider (GitHub, GitLab, or BitBucket), with continuous deployment, previews of the generated site when you or your users create pull requests against the doc repo, and more. Netlify is free to use for Open Source projects, with premium tiers if you require greater support.
Before deploying with Netlify, make sure that you’ve pushed your site source to your chosen GitHub (or other provider) repo, following any setup instructions in Using the theme.
Then follow the instructions in Host on Netlify to set up a Netlify account (if you don’t have one already) and authorize access to your GitHub or other Git provider account. Once you’re logged in:
- Click New site from Git.
- Click your chosen Git provider, then choose your site repo from your list of repos.
- In the Deploy settings page:
- For your Build command, specify
cd themes/docsy && git submodule update -f --init && cd ../.. && hugo
. You need to specify this rather than justhugo
so that Netlify can use the theme’s submodules. If you don’t want your site to be indexed by search engines, you can add an environment flag to specify a non-production
environment, as described in Build environments and indexing. - Click Show advanced.
- In the Advanced build settings section, click New variable.
- Specify
HUGO_VERSION
as the Key for the new variable, and0.73
or later as its Value.
- For your Build command, specify
- Click Deploy site.
Note
Netlify uses your site repo’s package.json
file to install any JavaScript dependencies (like postcss
) before building your site. If you haven’t just copied our example site’s version of this file, make sure that you’ve specified all our prerequisites.
For example, if you want to use a version of postcss-cli
later than version 8.0.0, you need to ensure that your package.json
also specifies postcss
separately:
"devDependencies": {
"autoprefixer": "^9.8.8",
"postcss-cli": "^8.0.0",
"postcss": "^8.0.0"
}
Alternatively, you can follow the same instructions but specify your Deploy settings in a netlify.toml
file in your repo rather than in the Deploy settings page. You can see an example of this in the Docsy theme repo (though note that the build command here is a little unusual because the Docsy user guide is inside the theme repo).
If you have an existing deployment you can view and update the relevant information by selecting the site from your list of sites in Netlify, then clicking Site settings - Build and deploy. Ensure that Ubuntu Xenial 16.04 is selected in the Build image selection section - if you’re creating a new deployment this is used by default. You need to use this image to run the extended version of Hugo.
Deployment with Amazon S3 + Amazon CloudFront
There are several options for publishing your web site using Amazon Web Services, as described in this blog post. This section describes the most basic option, deploying your site using an S3 bucket and activating the CloudFront CDN (content delivery network) to speed up the delivery of your deployed contents.
After your registration at AWS, create your S3 bucket, connect it with your domain, and add it to the CloudFront CDN. This blog post has all the details and provides easy to follow step-by-step instructions for the whole procedure.
Download and install the latest version 2 of the AWS Command Line Interface (CLI). Then configure your CLI instance by issuing the command
aws configure
(make sure you have your AWS Access Key ID and your AWS Secret Access Key at hand):$ aws configure AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [None]: eu-central-1 Default output format [None]:
Check the proper configuration of your AWS CLI by issuing the command
aws s3 ls
, this should output a list of your S3 bucket(s).Inside your
config.toml
, add a[deployment]
section like this one:[deployment] [[deployment.targets]] name = "aws" URL = "s3://www.your-domain.tld" cloudFrontDistributionID = "E9RZ8T1EXAMPLEID"
Run the command
hugo --gc --minify
to render the site’s assets into thepublic/
directory of your Hugo build environment.Use Hugo’s built-in
deploy
command to deploy the site to S3:hugo deploy Deploying to target "aws" (www.your-domain.tld) Identified 77 file(s) to upload, totaling 5.3 MB, and 0 file(s) to delete. Success! Invalidating CloudFront CDN... Success!
As you can see, issuing the
hugo deploy
command automatically invalidates your CloudFront CDN cache.That’s all you need to do! From now on, you can easily deploy to your S3 bucket using Hugo’s built-in
deploy
command!
For more information about the Hugo deploy
command, including command line options, see this synopsis. In particular, you may find the --maxDeletes int
option or the --force
option (which forces upload of all files) useful.
Automated deployment with GitHub actions
If the source of your site lives in a GitHub repository, you can use GitHub Actions to deploy the site to your S3 bucket as soon as you commit changes to your GitHub repo. Setup of this workflow is described in this blog post.Handling aliases
If you are using aliases for URL management, you should have a look at this blog post. It explains how to turn aliases into proper301
redirects when using Amazon S3.If S3 does not meet your needs, consider AWS Amplify Console. This is a more advanced continuous deployment (CD) platform with built-in support for the Hugo static site generator. A starter can be found in Hugo’s official docs.
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.