diff --git a/configuration/data/mobile-proxy/config.jsx b/configuration/data/mobile-proxy/config.jsx new file mode 100644 index 0000000..1b3d344 --- /dev/null +++ b/configuration/data/mobile-proxy/config.jsx @@ -0,0 +1,61 @@ +"use strict"; + +const React = require("react"); +const url = require("url"); + +function NoticeBox({ children, siteName }) { + return ( +
+ This is a mobile proxy. It is intended to visit {siteName} on devices that would otherwise not correctly display the site. {children} +
+ ); +} + +module.exports = { + port: 3000, + hosts: { + "awesomedude.cryto.net": { + prefix: () => ( + + ), + filters: [{ + matchPath: "/", + mapUrl: "http://www.awesomedude.com/", + mapContent: ($) => $("#container").html() + }, { + mapUrl: ({path}) => url.resolve("http://www.awesomedude.com/", path), + mapContent: ($) => $("body").html() + }] + }, + "castleroland.cryto.net": { + prefix: () => ( + + Please direct all your feedback to CastleRoland.net directly! + + ), + filters: [{ + matchPath: "/", + mapUrl: "https://castleroland.net/stories-categories/", + mapContent: ($) => $("section.home_about").html() + }, { + mapUrl: ({path}) => url.resolve("https://www.castleroland.net/", path), + mapContent: ($) => $("section.home_about").html() + }] + }, + "iomfats.cryto.net": { + prefix: () => ( + + Please direct all your feedback to the friendly guy over at IOMfAtS! + + ), + filters: [{ + matchPath: "/", + mapUrl: "http://iomfats.org/storyshelf/", + mapContent: ($) => $("div#homelinks").html() + }, { + mapUrl: ({path}) => url.resolve("http://iomfats.org/", path), + mapContent: ($) => $("div#content").html() + }] + } + } +}; diff --git a/configuration/default.nix b/configuration/default.nix index 17dea7a..37321a5 100644 --- a/configuration/default.nix +++ b/configuration/default.nix @@ -1,5 +1,18 @@ let - nixpkgsOptions = {}; + nixpkgsOptions = { + overlays = [ + (self: super: { + /* NOTE: Namespaced under `pkgs.cryto.*` to prevent naming conflicts with upstream nixpkgs */ + cryto = { + # FIXME: Remove default.nix suffix? + fetchFromCrytoGit = self.callPackage ./lib/fetch/from-cryto-git.nix {}; + nodeApplication = self.callPackage ./lib/node-application.nix {}; + unpack = self.callPackage ./lib/unpack.nix {}; + mobileProxy = self.callPackage ./packages/mobile-proxy/default.nix { configFile = null; }; + }; + }) + ]; + }; pkgs = (import (fetchTarball "https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz") nixpkgsOptions); pkgs1803 = (import (fetchTarball "https://github.com/NixOS/nixpkgs-channels/archive/nixos-18.03.tar.gz") nixpkgsOptions); presets = { @@ -9,6 +22,7 @@ let nginxPresets = { php = (import ./presets/nginx/php.nix); cphpApplication = (import ./presets/nginx/cphp-application.nix); + reverseProxy = (import ./presets/nginx/reverse-proxy.nix); }; in { network = { @@ -30,6 +44,9 @@ in { { scheme = "http"; port = 80; path = "/"; host = "books.cryto.net"; description = "books.cryto.net is up"; } { scheme = "http"; port = 80; path = "/"; host = "learn.cryto.net"; description = "learn.cryto.net is up"; } { scheme = "http"; port = 80; path = "/"; host = "vps-list.cryto.net"; description = "vps-list.cryto.net is up"; } + { scheme = "http"; port = 80; path = "/"; host = "iomfats.cryto.net"; description = "iomfats.cryto.net is up"; } + { scheme = "http"; port = 80; path = "/"; host = "castleroland.cryto.net"; description = "castleroland.cryto.net is up"; } + { scheme = "http"; port = 80; path = "/"; host = "awesomedude.cryto.net"; description = "awesomedude.cryto.net is up"; } ]; networking.firewall.allowedTCPPorts = [ 80 ]; @@ -37,6 +54,12 @@ in { services.nginx = { enable = true; virtualHosts = { + "404.cryto.net" = { + default = true; + extraConfig = '' + return 404; + ''; + }; "haless.cryto.net" = { locations."/shadow" = { alias = ./sources/shadow-generator; @@ -101,6 +124,9 @@ in { ''; })) ]; + "iomfats.cryto.net" = nginxPresets.reverseProxy "http://127.0.0.1:3000/"; + "castleroland.cryto.net" = nginxPresets.reverseProxy "http://127.0.0.1:3000/"; + "awesomedude.cryto.net" = nginxPresets.reverseProxy "http://127.0.0.1:3000/"; }; }; @@ -135,5 +161,33 @@ in { }; }; }; + + users.extraUsers.mobile-proxy = { + description = "mobile-proxy Service User"; + }; + + systemd.services.mobile-proxy = let + package = pkgs.cryto.mobileProxy.override { configFile = ./data/mobile-proxy/config.jsx; }; + in { + description = "Mobile Proxy"; + wantedBy = ["multi-user.target"]; + after = ["network.target"]; + + serviceConfig = { + ExecStart = "${package}/bin/mobile-proxy"; + User = "mobile-proxy"; + Restart = "on-failure"; + PermissionsStartOnly = true; + }; + + preStart = '' + mkdir -m 0700 -p /tmp/mobile-proxy-home + chown mobile-proxy /tmp/mobile-proxy-home + ''; + + environment = { + HOME = "/tmp/mobile-proxy-home"; + }; + }; }; } diff --git a/configuration/lib/fetch/from-cryto-git.nix b/configuration/lib/fetch/from-cryto-git.nix new file mode 100644 index 0000000..b6c87ed --- /dev/null +++ b/configuration/lib/fetch/from-cryto-git.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: + {owner, repo, rev, name ? ("${repo}-${rev}-src.tar.gz"), ...}@sourceArgs: + let + baseUrl = "https://git.cryto.net/${owner}/${repo}"; + in + pkgs.fetchurl ({ + inherit name; + url = "${baseUrl}/archive/${rev}.tar.gz"; + meta.homepage = baseUrl; + } // removeAttrs sourceArgs ["owner" "repo" "rev"]) diff --git a/configuration/lib/node-application.nix b/configuration/lib/node-application.nix new file mode 100644 index 0000000..dc4e206 --- /dev/null +++ b/configuration/lib/node-application.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: + { name, source }: + let + yarn2nix = (import (fetchTarball "https://github.com/joepie91/yarn2nix/archive/patch/remove-no-patch.tar.gz") { inherit pkgs; }); + in yarn2nix.mkYarnPackage { + name = name; + src = source; + packageJSON = "${source}/package.json"; + yarnLock = "${source}/yarn.lock"; + } diff --git a/configuration/packages/mobile-proxy/default.nix b/configuration/packages/mobile-proxy/default.nix new file mode 100644 index 0000000..1024793 --- /dev/null +++ b/configuration/packages/mobile-proxy/default.nix @@ -0,0 +1,19 @@ +{ pkgs, configFile, ... }: + pkgs.cryto.nodeApplication { + name = "mobile-proxy"; + source = pkgs.stdenv.mkDerivation { + name = "mobile-proxy-application"; + src = pkgs.cryto.fetchFromCrytoGit { + owner = "joepie91"; + repo = "mobile-proxy"; + rev = "1628f4be61621c1783e93ef6719b1dae4f352be8"; + sha256 = "1d9zc3phflsi2gsi7hmzybr0q983x7155bildvlbc7za3y8hry78"; + }; + + buildCommand = '' + mkdir -p $out + tar -xzvf $src -C $out + cp ${configFile} $out/config.jsx + ''; + }; + } diff --git a/configuration/presets/nginx/reverse-proxy.nix b/configuration/presets/nginx/reverse-proxy.nix new file mode 100644 index 0000000..5bcb1ac --- /dev/null +++ b/configuration/presets/nginx/reverse-proxy.nix @@ -0,0 +1,9 @@ +destination: { + locations."/" = { + proxyPass = destination; + proxyWebsockets = true; + extraConfig = '' + proxy_set_header Host $host; + ''; + }; +}