mirror of
https://github.com/ivabus/website
synced 2024-11-25 01:45:11 +03:00
83 lines
1.9 KiB
Markdown
83 lines
1.9 KiB
Markdown
---
|
|
layout: post
|
|
summary: "This post is hosted on NixOS"
|
|
title: "Hosting Jekyll websites on NixOS"
|
|
---
|
|
|
|
## Preamble
|
|
|
|
Previously this website (ivabus.dev) was hosted on Cloudflare Pages, but recently I learned about NixOS and wanted to host my site "declarative" way.
|
|
|
|
## The way
|
|
|
|
### Step 1: Package website
|
|
|
|
To host website correct way, we want to have its Nix derivation. Before we create one, we have to have `gemset.nix`. To generate one, run this in the root of your Jekyll project
|
|
|
|
```shell
|
|
nix-shell -p bundler -p bundix --run 'bundler update; bundler lock; bundler package --no-install --path vendor; bundix; rm -rf vendor'
|
|
```
|
|
|
|
Note: make sure to remove all the platform-specific gems from `Gemfile` and `Gemfile.lock`, like `google-protobuf`, so your website could be built
|
|
|
|
Then you need to create a package for your website with code like this
|
|
|
|
```nix
|
|
{ pkgs ? import <nixpkgs> { }, bundlerEnv ? pkgs.bundlerEnv, ... }:
|
|
let
|
|
version = "commit hash";
|
|
repo = builtins.fetchGit {
|
|
url = "https://address/of/git/repo";
|
|
rev = version;
|
|
};
|
|
|
|
gems = bundlerEnv {
|
|
name = "your-site";
|
|
ruby = pkgs.ruby;
|
|
gemdir = "${repo}/.";
|
|
};
|
|
in pkgs.stdenv.mkDerivation {
|
|
inherit version;
|
|
name = "your-site";
|
|
src = repo;
|
|
|
|
buildInputs = with pkgs; [
|
|
gems
|
|
# nokogiri dependencies
|
|
zlib
|
|
libiconv
|
|
libxml2
|
|
libxslt
|
|
# jekyll wants a JS runtime
|
|
nodejs-slim
|
|
];
|
|
|
|
buildPhase = ''
|
|
bundle exec jekyll build
|
|
'';
|
|
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
cp -r _site/* $out/
|
|
'';
|
|
}
|
|
|
|
```
|
|
|
|
### Step 2: Prepare nginx
|
|
|
|
```nix
|
|
services.nginx = {
|
|
enable = true;
|
|
virtualHosts."your.site" = {
|
|
root = pkgs.callPackage ./path/to/pkg.nix { };
|
|
extraConfig = ''
|
|
error_page 404 /404.html;
|
|
'';
|
|
};
|
|
}
|
|
```
|
|
|
|
### Step 3: Rebuild
|
|
|
|
Rebuild your system and try to visit your website (don't forget to open 80 (and 443, if HTTPS is enabled) ports in the firewall, if needed)
|