forked from M-Labs/it-infra
flarum: init
This commit is contained in:
parent
b8dae38b00
commit
24e1201ab1
|
@ -20,6 +20,7 @@ in
|
||||||
[
|
[
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./backup-module.nix
|
./backup-module.nix
|
||||||
|
./flarum.nix
|
||||||
(builtins.fetchTarball {
|
(builtins.fetchTarball {
|
||||||
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/v2.3.0/nixos-mailserver-v2.3.0.tar.gz";
|
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/v2.3.0/nixos-mailserver-v2.3.0.tar.gz";
|
||||||
sha256 = "0lpz08qviccvpfws2nm83n7m2r8add2wvfg9bljx9yxx8107r919";
|
sha256 = "0lpz08qviccvpfws2nm83n7m2r8add2wvfg9bljx9yxx8107r919";
|
||||||
|
@ -574,14 +575,14 @@ in
|
||||||
"forum.m-labs.hk" = {
|
"forum.m-labs.hk" = {
|
||||||
forceSSL = true;
|
forceSSL = true;
|
||||||
useACMEHost = "nixbld.m-labs.hk";
|
useACMEHost = "nixbld.m-labs.hk";
|
||||||
root = "/var/www/flarum/public";
|
root = "${config.services.flarum.installPath}/public";
|
||||||
locations."~ \.php$".extraConfig = ''
|
locations."~ \.php$".extraConfig = ''
|
||||||
fastcgi_pass unix:${config.services.phpfpm.pools.flarum.socket};
|
fastcgi_pass unix:${config.services.phpfpm.pools.flarum.socket};
|
||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
'';
|
'';
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
index index.php;
|
index index.php;
|
||||||
include /var/www/flarum/.nginx.conf;
|
include ${config.services.flarum.installPath}/.nginx.conf;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
"call.m-labs.hk" = {
|
"call.m-labs.hk" = {
|
||||||
|
@ -634,7 +635,7 @@ in
|
||||||
package = pkgs.mariadb;
|
package = pkgs.mariadb;
|
||||||
};
|
};
|
||||||
services.phpfpm.pools.flarum = {
|
services.phpfpm.pools.flarum = {
|
||||||
user = "nobody";
|
user = config.services.flarum.user;
|
||||||
settings = {
|
settings = {
|
||||||
"listen.owner" = "nginx";
|
"listen.owner" = "nginx";
|
||||||
"listen.group" = "nginx";
|
"listen.group" = "nginx";
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Run with: nix-shell flarum-update.nix
|
||||||
|
|
||||||
|
{ pkgs ? import <nixpkgs> {}
|
||||||
|
}:
|
||||||
|
|
||||||
|
with pkgs;
|
||||||
|
let
|
||||||
|
composer2nix = import (fetchFromGitHub {
|
||||||
|
owner = "svanderburg";
|
||||||
|
repo = "composer2nix";
|
||||||
|
rev = "v0.0.4";
|
||||||
|
sha256 = "0q0x3in43ss1p0drhc5lp5bnp2jqni1i7zxm7lmjl5aad9nkn3gf";
|
||||||
|
}) { inherit pkgs; };
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "flarum-update";
|
||||||
|
buildInputs = [ phpPackages.composer composer2nix ];
|
||||||
|
shellHook = ''
|
||||||
|
OUT=$(pwd)/flarum
|
||||||
|
|
||||||
|
cd $(mktemp -d)
|
||||||
|
composer create-project flarum/flarum . --stability=beta
|
||||||
|
composer require fof/upload
|
||||||
|
|
||||||
|
composer2nix
|
||||||
|
cp -v *.nix composer.{json,lock} $OUT/
|
||||||
|
exit
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
let
|
||||||
|
flarumPackage = with pkgs; stdenv.mkDerivation {
|
||||||
|
name = "flarum-package";
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "flarum";
|
||||||
|
repo = "flarum";
|
||||||
|
rev = "v0.1.0-beta.13";
|
||||||
|
sha256 = "0mj6w7nibdqmi7lx2r5d9yiif6lb584l93551i115a9ly3s4yinn";
|
||||||
|
};
|
||||||
|
buildPhase =
|
||||||
|
''
|
||||||
|
cp ${./flarum}/* .
|
||||||
|
'';
|
||||||
|
installPhase =
|
||||||
|
''
|
||||||
|
cp -ar . $out
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
flarum = import "${flarumPackage}" {
|
||||||
|
inherit pkgs;
|
||||||
|
noDev = true;
|
||||||
|
};
|
||||||
|
cfg = config.services.flarum;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.flarum = with pkgs.lib; {
|
||||||
|
user = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "nobody";
|
||||||
|
};
|
||||||
|
group = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "nogroup";
|
||||||
|
};
|
||||||
|
installPath = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/var/www/flarum";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.systemd.services.flarum-install = {
|
||||||
|
description = "Flarum installation";
|
||||||
|
before = [ "nginx.service" "phpfm-flarum.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
};
|
||||||
|
path = [ pkgs.rsync ];
|
||||||
|
script = with cfg; ''
|
||||||
|
mkdir -p ${installPath}
|
||||||
|
rsync --links --recursive ${flarum}/ ${installPath}
|
||||||
|
for d in ${installPath} ${installPath}/public/assets \
|
||||||
|
${installPath}/storage ${installPath}/storage/*
|
||||||
|
do
|
||||||
|
chown ${user}:${group} $d
|
||||||
|
chmod 0775 $d
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,238 @@
|
||||||
|
# This file originates from composer2nix
|
||||||
|
|
||||||
|
{ stdenv, writeTextFile, fetchurl, php, unzip, phpPackages }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (phpPackages) composer;
|
||||||
|
buildZipPackage = { name, src }:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
inherit name src;
|
||||||
|
buildInputs = [ unzip ];
|
||||||
|
buildCommand = ''
|
||||||
|
unzip $src
|
||||||
|
baseDir=$(find . -type d -mindepth 1 -maxdepth 1)
|
||||||
|
cd $baseDir
|
||||||
|
mkdir -p $out
|
||||||
|
mv * $out
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
buildPackage =
|
||||||
|
{ name
|
||||||
|
, src
|
||||||
|
, packages ? {}
|
||||||
|
, devPackages ? {}
|
||||||
|
, buildInputs ? []
|
||||||
|
, symlinkDependencies ? false
|
||||||
|
, executable ? false
|
||||||
|
, removeComposerArtifacts ? false
|
||||||
|
, postInstall ? ""
|
||||||
|
, noDev ? false
|
||||||
|
, unpackPhase ? "true"
|
||||||
|
, buildPhase ? "true"
|
||||||
|
, ...}@args:
|
||||||
|
|
||||||
|
let
|
||||||
|
reconstructInstalled = writeTextFile {
|
||||||
|
name = "reconstructinstalled.php";
|
||||||
|
executable = true;
|
||||||
|
text = ''
|
||||||
|
#! ${php}/bin/php
|
||||||
|
<?php
|
||||||
|
if(file_exists($argv[1]))
|
||||||
|
{
|
||||||
|
$composerLockStr = file_get_contents($argv[1]);
|
||||||
|
|
||||||
|
if($composerLockStr === false)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Cannot open composer.lock contents\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$config = json_decode($composerLockStr, true);
|
||||||
|
|
||||||
|
if(array_key_exists("packages", $config))
|
||||||
|
$allPackages = $config["packages"];
|
||||||
|
else
|
||||||
|
$allPackages = array();
|
||||||
|
|
||||||
|
${stdenv.lib.optionalString (!noDev) ''
|
||||||
|
if(array_key_exists("packages-dev", $config))
|
||||||
|
$allPackages = array_merge($allPackages, $config["packages-dev"]);
|
||||||
|
''}
|
||||||
|
|
||||||
|
$packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||||
|
print($packagesStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print("[]");
|
||||||
|
?>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
constructBin = writeTextFile {
|
||||||
|
name = "constructbin.php";
|
||||||
|
executable = true;
|
||||||
|
text = ''
|
||||||
|
#! ${php}/bin/php
|
||||||
|
<?php
|
||||||
|
$composerJSONStr = file_get_contents($argv[1]);
|
||||||
|
|
||||||
|
if($composerJSONStr === false)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Cannot open composer.json contents\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$config = json_decode($composerJSONStr, true);
|
||||||
|
|
||||||
|
if(array_key_exists("bin-dir", $config))
|
||||||
|
$binDir = $config["bin-dir"];
|
||||||
|
else
|
||||||
|
$binDir = "bin";
|
||||||
|
|
||||||
|
if(array_key_exists("bin", $config))
|
||||||
|
{
|
||||||
|
if(!file_exists("vendor/".$binDir))
|
||||||
|
mkdir("vendor/".$binDir);
|
||||||
|
|
||||||
|
foreach($config["bin"] as $bin)
|
||||||
|
symlink("../../".$bin, "vendor/".$binDir."/".basename($bin));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
bundleDependencies = dependencies:
|
||||||
|
stdenv.lib.concatMapStrings (dependencyName:
|
||||||
|
let
|
||||||
|
dependency = dependencies.${dependencyName};
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${if dependency.targetDir == "" then ''
|
||||||
|
vendorDir="$(dirname ${dependencyName})"
|
||||||
|
mkdir -p "$vendorDir"
|
||||||
|
${if symlinkDependencies then
|
||||||
|
''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
|
||||||
|
else
|
||||||
|
''cp -av "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
|
||||||
|
}
|
||||||
|
'' else ''
|
||||||
|
namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")"
|
||||||
|
mkdir -p "$namespaceDir"
|
||||||
|
${if symlinkDependencies then
|
||||||
|
''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
|
||||||
|
else
|
||||||
|
''cp -av "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
'') (builtins.attrNames dependencies);
|
||||||
|
|
||||||
|
extraArgs = removeAttrs args [ "name" "packages" "devPackages" "buildInputs" ];
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation ({
|
||||||
|
name = "composer-${name}";
|
||||||
|
buildInputs = [ php composer ] ++ buildInputs;
|
||||||
|
|
||||||
|
inherit unpackPhase buildPhase;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
${if executable then ''
|
||||||
|
mkdir -p $out/share/php
|
||||||
|
cp -av $src $out/share/php/$name
|
||||||
|
chmod -R u+w $out/share/php/$name
|
||||||
|
cd $out/share/php/$name
|
||||||
|
'' else ''
|
||||||
|
cp -av $src $out
|
||||||
|
chmod -R u+w $out
|
||||||
|
cd $out
|
||||||
|
''}
|
||||||
|
|
||||||
|
# Remove unwanted files
|
||||||
|
rm -f *.nix
|
||||||
|
|
||||||
|
export HOME=$TMPDIR
|
||||||
|
|
||||||
|
# Remove the provided vendor folder if it exists
|
||||||
|
rm -Rf vendor
|
||||||
|
|
||||||
|
# If there is no composer.lock file, compose a dummy file.
|
||||||
|
# Otherwise, composer attempts to download the package.json file from
|
||||||
|
# the registry which we do not want.
|
||||||
|
if [ ! -f composer.lock ]
|
||||||
|
then
|
||||||
|
cat > composer.lock <<EOF
|
||||||
|
{
|
||||||
|
"packages": []
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reconstruct the installed.json file from the lock file
|
||||||
|
mkdir -p vendor/composer
|
||||||
|
${reconstructInstalled} composer.lock > vendor/composer/installed.json
|
||||||
|
|
||||||
|
# Copy or symlink the provided dependencies
|
||||||
|
cd vendor
|
||||||
|
${bundleDependencies packages}
|
||||||
|
${stdenv.lib.optionalString (!noDev) (bundleDependencies devPackages)}
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Reconstruct autoload scripts
|
||||||
|
# We use the optimize feature because Nix packages cannot change after they have been built
|
||||||
|
# Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
|
||||||
|
composer dump-autoload --optimize ${stdenv.lib.optionalString noDev "--no-dev"}
|
||||||
|
|
||||||
|
# Run the install step as a validation to confirm that everything works out as expected
|
||||||
|
composer install --optimize-autoloader ${stdenv.lib.optionalString noDev "--no-dev"}
|
||||||
|
|
||||||
|
${stdenv.lib.optionalString executable ''
|
||||||
|
# Reconstruct the bin/ folder if we deploy an executable project
|
||||||
|
${constructBin} composer.json
|
||||||
|
ln -s $(pwd)/vendor/bin $out/bin
|
||||||
|
''}
|
||||||
|
|
||||||
|
${stdenv.lib.optionalString (!symlinkDependencies) ''
|
||||||
|
# Patch the shebangs if possible
|
||||||
|
if [ -d $(pwd)/vendor/bin ]
|
||||||
|
then
|
||||||
|
# Look for all executables in bin/
|
||||||
|
for i in $(pwd)/vendor/bin/*
|
||||||
|
do
|
||||||
|
# Look for their location
|
||||||
|
realFile=$(readlink -f "$i")
|
||||||
|
|
||||||
|
# Restore write permissions
|
||||||
|
chmod u+wx "$(dirname "$realFile")"
|
||||||
|
chmod u+w "$realFile"
|
||||||
|
|
||||||
|
# Patch shebang
|
||||||
|
sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \
|
||||||
|
-e "s|#!/usr/bin/env php|#!${php}/bin/php|" \
|
||||||
|
"$realFile" > tmp
|
||||||
|
mv tmp "$realFile"
|
||||||
|
chmod u+x "$realFile"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
''}
|
||||||
|
|
||||||
|
if [ "$removeComposerArtifacts" = "1" ]
|
||||||
|
then
|
||||||
|
# Remove composer stuff
|
||||||
|
rm -f composer.json composer.lock
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute post install hook
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
} // extraArgs);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
composer = stdenv.lib.makeOverridable composer;
|
||||||
|
buildZipPackage = stdenv.lib.makeOverridable buildZipPackage;
|
||||||
|
buildPackage = stdenv.lib.makeOverridable buildPackage;
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
{
|
||||||
|
"name": "flarum/flarum",
|
||||||
|
"description": "Delightfully simple forum software.",
|
||||||
|
"type": "project",
|
||||||
|
"keywords": [
|
||||||
|
"forum",
|
||||||
|
"discussion"
|
||||||
|
],
|
||||||
|
"homepage": "https://flarum.org/",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Franz Liedke",
|
||||||
|
"email": "franz@develophp.org"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Daniel Klabbers",
|
||||||
|
"email": "daniel@klabbers.email",
|
||||||
|
"homepage": "https://luceos.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "David Sevilla Martin",
|
||||||
|
"email": "me+flarum@datitisev.me",
|
||||||
|
"homepage": "https://datitisev.me"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Clark Winkelmann",
|
||||||
|
"email": "clark.winkelmann@gmail.com",
|
||||||
|
"homepage": "https://clarkwinkelmann.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matthew Kilgore",
|
||||||
|
"email": "matthew@kilgore.dev"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/flarum/core/issues",
|
||||||
|
"source": "https://github.com/flarum/flarum",
|
||||||
|
"docs": "https://flarum.org/docs/"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"flarum/approval": "^0.1.0",
|
||||||
|
"flarum/auth-facebook": "^0.1.0",
|
||||||
|
"flarum/auth-github": "^0.1.0",
|
||||||
|
"flarum/auth-twitter": "^0.1.0",
|
||||||
|
"flarum/bbcode": "^0.1.0",
|
||||||
|
"flarum/core": "^0.1.0",
|
||||||
|
"flarum/emoji": "^0.1.0",
|
||||||
|
"flarum/flags": "^0.1.0",
|
||||||
|
"flarum/lang-english": "^0.1.0",
|
||||||
|
"flarum/likes": "^0.1.0",
|
||||||
|
"flarum/lock": "^0.1.0",
|
||||||
|
"flarum/markdown": "^0.1.0",
|
||||||
|
"flarum/mentions": "^0.1.0",
|
||||||
|
"flarum/pusher": "^0.1.0",
|
||||||
|
"flarum/statistics": "^0.1.0",
|
||||||
|
"flarum/sticky": "^0.1.0",
|
||||||
|
"flarum/subscriptions": "^0.1.0",
|
||||||
|
"flarum/suspend": "^0.1.0",
|
||||||
|
"flarum/tags": "^0.1.0",
|
||||||
|
"fof/upload": "^0.10.0"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"preferred-install": "dist",
|
||||||
|
"sort-packages": true
|
||||||
|
},
|
||||||
|
"minimum-stability": "beta",
|
||||||
|
"prefer-stable": true
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,13 @@
|
||||||
|
{pkgs ? import <nixpkgs> {
|
||||||
|
inherit system;
|
||||||
|
}, system ? builtins.currentSystem, noDev ? false}:
|
||||||
|
|
||||||
|
let
|
||||||
|
composerEnv = import ./composer-env.nix {
|
||||||
|
inherit (pkgs) stdenv writeTextFile fetchurl php unzip phpPackages;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
import ./php-packages.nix {
|
||||||
|
inherit composerEnv noDev;
|
||||||
|
inherit (pkgs) fetchurl fetchgit fetchhg fetchsvn;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue