about summary refs log tree commit diff
path: root/web/homepage
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-02-08T14·06+0000
committerVincent Ambo <tazjin@google.com>2020-02-08T14·06+0000
commit7935957938fb4bd73b557e42fa828b1470979777 (patch)
treee7289865c0b38851172a292897e8dd897a2ae672 /web/homepage
parent8e9fb739582b5ed871522826ea145f4a9dac2777 (diff)
refactor(web): Move nginx setup to //web/homepage r/487
The homepage is going to be the landing page for all content, whether
it be blog posts or other stuff.
Diffstat (limited to 'web/homepage')
-rw-r--r--web/homepage/default.nix15
-rw-r--r--web/homepage/nginx.nix74
2 files changed, 89 insertions, 0 deletions
diff --git a/web/homepage/default.nix b/web/homepage/default.nix
new file mode 100644
index 0000000000..94dfaf3dc6
--- /dev/null
+++ b/web/homepage/default.nix
@@ -0,0 +1,15 @@
+# Assembles the website index and configures an nginx instance to
+# serve it.
+#
+# The website is made up of a simple header&footer and content
+# elements for things such as blog posts and projects.
+#
+# Content for the blog is in //web/blog instead of here.
+{ pkgs, lib, ... }:
+
+with pkgs;
+with nix.yants;
+
+third_party.callPackage ./nginx.nix {
+  blog = web.blog;
+}
diff --git a/web/homepage/nginx.nix b/web/homepage/nginx.nix
new file mode 100644
index 0000000000..90a13a1e98
--- /dev/null
+++ b/web/homepage/nginx.nix
@@ -0,0 +1,74 @@
+# This file creates an nginx server that serves the blog on port 8080.
+#
+# It's not intended to be the user-facing nginx.
+{
+  # third_party attributes supplied by callPackage
+  writeText, writeShellScriptBin, nginx, lib,
+
+  # website content
+  blog
+}:
+
+let
+  inherit (builtins) hasAttr filter map;
+  inherit (pkgs.third_party) ;
+
+  oldRedirects = lib.concatStringsSep "\n" (map (post: ''
+    location ~* ^(en)?/${post.oldKey} {
+      # TODO(tazjin): 301 once this works
+      return 302 /${post.key};
+    }
+  '') (filter (hasAttr "oldKey") blog.posts));
+
+  config = writeText "homepage-nginx.conf" ''
+    daemon off;
+    worker_processes 1;
+    error_log stderr;
+    pid /tmp/nginx-homepage.pid;
+
+    events {
+      worker_connections  1024;
+    }
+
+    http {
+      include ${nginx}/conf/mime.types;
+      fastcgi_temp_path /tmp/nginx-homepage;
+      uwsgi_temp_path /tmp/nginx-homepage;
+      scgi_temp_path /tmp/nginx-homepage;
+      client_body_temp_path /tmp/nginx-homepage;
+      proxy_temp_path /tmp/nginx-homepage;
+      sendfile on;
+
+      # Logging is handled by the primary nginx server
+      access_log off;
+
+      server {
+        listen 8080 default_server;
+        root ${blog.rendered};
+
+        location /static {
+          alias ${blog.static}/;
+        }
+
+        ${oldRedirects}
+
+        location / {
+          if ($request_uri ~ ^/(.*)\.html$) {
+            return 302 /$1;
+          }
+
+          try_files $uri $uri.html $uri/ =404;
+        }
+      }
+    }
+  '';
+in writeShellScriptBin "homepage" ''
+  if [[ -v CONTAINER_SETUP ]]; then
+    cd /run
+    echo 'nogroup:x:30000:nobody' >> /etc/group
+    echo 'nobody:x:30000:30000:nobody:/tmp:/bin/bash' >> /etc/passwd
+  fi
+
+  mkdir -p /tmp/nginx-homepage
+  exec ${nginx}/bin/nginx -c ${config}
+''