This page shows you how to put your website online.
Your website is a static website. When you run
npm run buildVite creates a folder called dist containing plain HTML, CSS, JavaScript and your images. There is no server code and no database. Any hosting that can serve static files will work.
Deploying always means the same thing: get the content of dist onto a host and point a domain at it.
- Server name, IP, links and texts are final
- Placeholder images are replaced (logo, hero background, About images)
- Vote links point to your own voting pages
- Favicon is in place
- You tested the build locally with
npm run test - You checked the page on a phone
| Option | Difficulty | Cost | Good for |
|---|---|---|---|
| Vercel | Very easy | Free plan | Beginners, automatic updates |
| Netlify | Very easy | Free plan | Beginners, drag and drop upload |
| Cloudflare Pages | Easy | Free plan | Fast worldwide delivery |
| Linux VPS with Nginx | Medium | Your server | Full control, same machine as other services |
| Docker | Medium | Your server | Container setups |
| Web hosting via FTP | Easy | Your hosting | You already have a web hosting package |
| GitHub Pages | Easy | Free | Only with a custom domain |
If you are unsure, start with Vercel.
Vercel builds and hosts your site for free and updates it automatically whenever you push changes to GitHub.
- Upload your project to a GitHub repository.
- Create an account on vercel.com and log in with GitHub.
- Click Add New > Project and select your repository.
- Vercel detects Vite automatically. The settings should be:
- Build Command:
npm run build - Output Directory:
dist
- Build Command:
- Click Deploy. After a minute, your site is online at a
*.vercel.appaddress.
Using your own domain: Open your project, go to Settings > Domains, add your domain and follow the DNS instructions shown there.
Updating: Change your config, commit and push to GitHub. Vercel deploys the new version automatically.
Alternative without GitHub (CLI):
npm install -g vercel
vercelRun vercel --prod to publish to production.
Drag and drop (no account setup with Git needed):
- Run
npm run buildon your computer. - Open app.netlify.com/drop.
- Drag the
distfolder into the page. Your site is online immediately.
With Git (automatic updates):
- Create a site via Add new site > Import an existing project and pick your repository.
- Set Build command to
npm run buildand Publish directory todist. - Click Deploy.
Custom domains are added under Domain management.
- Push your project to GitHub.
- In the Cloudflare dashboard open Workers & Pages and create a new Pages project connected to Git.
- Select your repository and set:
- Build command:
npm run build - Build output directory:
dist
- Build command:
- Click Save and Deploy.
If your domain's DNS is managed by Cloudflare, connecting it is especially simple under Custom domains.
This guide uses Ubuntu or Debian. You need a VPS, its IP address and a domain.
At your domain provider, create these DNS records:
| Type | Name | Value |
|---|---|---|
| A | @ |
Your server IP |
| A | www |
Your server IP |
DNS changes can take a few minutes up to a few hours.
ssh your-user@YOUR_SERVER_IPsudo apt update
sudo apt install -y nginxsudo mkdir -p /var/www/minecraft-landing
sudo chown -R $USER:$USER /var/www/minecraft-landingOn your own computer, in the project folder:
npm run buildThen upload the content of dist to the server.
macOS and Linux:
rsync -avz --delete dist/ your-user@YOUR_SERVER_IP:/var/www/minecraft-landing/Windows (PowerShell) or any system:
scp -r dist/* your-user@YOUR_SERVER_IP:/var/www/minecraft-landing/You can also use a graphical tool like WinSCP or FileZilla and copy the files into /var/www/minecraft-landing/.
Create the configuration file:
sudo nano /etc/nginx/sites-available/minecraft-landingPaste the following and replace example.com with your domain:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/minecraft-landing;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# Cache built assets for a long time (file names change on every build)
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}Save with Ctrl + O, Enter, and exit with Ctrl + X. Then enable the site:
sudo ln -s /etc/nginx/sites-available/minecraft-landing /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxnginx -t must report that the syntax is OK. If the default Nginx welcome page still appears, remove the default site and reload:
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl reload nginxAllow SSH first, otherwise you can lock yourself out:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enableYour Minecraft server port (default 25565) is not affected by Nginx. If you run the Minecraft server on the same machine, open that port separately if needed.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.comFollow the prompts. Certbot adjusts the Nginx configuration and renews the certificate automatically. You can test the renewal with:
sudo certbot renew --dry-runYour website is now available at https://example.com.
Whenever you change something: run npm run build again and repeat the upload from step 5.
If you prefer containers, create a file called Dockerfile in the project folder:
# Stage 1: build the website
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: serve the built files with Nginx
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80Build and run it:
docker build -t minecraft-landing .
docker run -d --name minecraft-landing -p 80:80 --restart unless-stopped minecraft-landingTo update, rebuild the image, remove the old container (docker rm -f minecraft-landing) and start it again.
For HTTPS, put a reverse proxy such as Caddy, Traefik or Nginx Proxy Manager in front of the container.
If you already have a classic web hosting package (for example from your domain provider):
- Run
npm run build. - Connect to your hosting with an FTP/SFTP tool such as FileZilla.
- Upload the content of the
distfolder (not the folder itself) into the web root, usually calledpublic_htmlorhtdocs.
Most providers offer a free HTTPS certificate in their control panel.
GitHub Pages works best with a custom domain or a repository named your-username.github.io.
For addresses like your-username.github.io/repository-name, the website runs in a sub-folder. In that case the image paths starting with / (for example /images/logo.png) don't work without extra configuration. If you are a beginner, prefer one of the other options.
- Open your domain on desktop and phone and check every section.
- Check that the server status, staff names and heads load.
- Test the copy IP button, the Discord and shop links and all vote links.
- When you change
site.jsonor a theme later, build and deploy again. The config is bundled into the website during the build.
The website shows the old version
Clear the browser cache with Ctrl + Shift + R. Check that you uploaded the new build.
Images are missing
Check that the files are in public/images/ and that the paths in site.json start with /images/ and match the file name exactly (including upper and lower case).
Server status shows offline although the server is online
Check server.ip (and the port, if you use one) in site.json. Bedrock servers need the Bedrock status API, see Configuration.
Nginx shows 502, 403 or the wrong page
Run sudo nginx -t and check that root points to the folder that contains index.html.