Improve configurability.

This commit is contained in:
Gaelan Steele 2023-07-13 21:21:21 -07:00
parent d40fa59204
commit 1dec24b614
24 changed files with 284 additions and 226 deletions

53
LICENSE Normal file
View file

@ -0,0 +1,53 @@
Copyright (c) 2023 Gaelan Steele
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
Minifedi's build scripts for Mastodon, Akkoma, and GoToSocial are derived from
Nixpkgs, released under the following license:
Copyright (c) 2003-2023 Eelco Dolstra and the Nixpkgs/NixOS contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
Minifedi contains nginx configuration file templates derived from configuration
files provided by the Mastodon, Akkoma, and GoToSocial projects, all of which
are licensed under AGPLv3. My position is that these configuration files are
insufficiently creative to be copyrightable, but this is not legal advice.

View file

@ -1,28 +1,70 @@
# MINIFEDI IS NOT DONE. It's like 80% of the way there, but the docs below remain slightly aspirational for the moment.
# Minifedi
Minifedi is a tool to quickly spin up a bunch of ActivityPub servers for local testing.
Minifedi should run on any macOS or Linux system with [Nix](https://nixos.org) installed. (Nix itself works fine on any Linux distribution; you don't need to be using NixOS.) Windows isn't natively supported, but WSL should work. Minifedi is entirely self-contained and needs no changes to your system configuration besides installing Nix; you can install it with a git clone, delete it with `rm -rf`, and your system will be exactly the way it was before.
Minifedi is entirely self-contained and needs no changes to your system configuration besides installing Nix; you can install it with a git clone, delete it with `rm -rf`, and your system will be exactly the way it was before.
Minifedi's goal is to "just work" on every machine. If the instructions below fail for you, please file an issue; I'll fix it if at all possible.
## System Requirements
- macOS or Linux (any distribution). Tested on x86_64, aarch64 should work. Other architectues probably won't due to poor Nix support, unfortunately.
- Windows isn't natively supported, but might work under WSL.
- A recent version of [Nix](https://nixos.org).
- This doesn't mean you need to be on NixOS; Nix can be installed on more or less any distribution, and is happy to do its own thing without interfering with your system.
- ~4GB free on disk.
- ~4GB free in /tmp.
- On many Linux distributions, this means you'll need ~8GB of RAM.
- You might be able to get away with less if you disable GoToSocial.
- Ports 80 and 443 free.
- This is required because some (all) fedi software is only willing to federate with servers on the standard ports.
- macOS lets any user listen on these ports. On Linux, Minifedi will use sudo to gain the capability required to listen on these ports, then immediately switch back to your user and relinquish all other capabilties.
## Warnings
Minifedi is very new software. I'm fairly sure it won't break your system (it's designed very specifically to not do anything that possibly could) but it might not work either.
Minifedi is designed for testing only. The assumption is you'll happily throw out everything stored in it when you're done. Don't store anything you care about in an instance run by Minifedi.
## Getting Started
```
git clone https://github.com/Gaelan/minifedi.git
cd minifedi
vi nix/services.nix # if you'd like, edit the list of instances - by default, we run one of each
nix run
```
Minifedi's goal is to "just work" on every machine. If the instructions below fail for you, please file an issue; I'll fix it if at all possible.
Give it some time, and you should see
1. Install [Nix](https://nixos.org), if you haven't.
- If you install Nix through your OS package manager, you may need to add yourself to the `nix-users` group and/or ensure the `nix-daemon` service is enabled.
2. ```
git clone https://github.com/Gaelan/minifedi.git
cd minifedi
```
3. If you'd like, edit `config.nix` to customize which instances you get. By default, you get one each of Mastodon, Glitch, Akkoma, and GoToSocial, but you're welcome to disable some or run multiple copies of the same type.
4. `./minifedi start`
5. Wait for stuff to build then start up; this should take 20-30 minutes.
6. Your instances should be running and accessible at INSTANCENAME.lvh.me (e.g. https://mastodon.lvh.me).
Each instance is created by default with five users:
- username `a`, email `a@example.com`, password `MiniFediA1!`, admin
- username `b`, email `b@example.com`, password `MiniFediB1!`
- username `c`, email `c@example.com`, password `MiniFediC1!`
- username `d`, email `d@example.com`, password `MiniFediD1!`
- username `e`, email `e@example.com`, password `MiniFediE1!`
Enjoy your testing!
## Supported Software
Minifedi currently supports:
Minifedi currently supports the following:
- Mastodon (and forks)
- Mastodon
- Akkoma
- GoToSocial
Forks of the above should work fine as well, as long as they haven't changed anything about the build, installation, or configuration process.
## How do I…
### Reset Minifedi, restoring every instance to its default state?
```sh
rm -r data/
```
### Use a different version (including a fork) of

7
TODO
View file

@ -1,5 +1,4 @@
- fix flake.nix to handle arbitrary arches
- figure out how to support local clones, and document this
- data generation?
- figure out how to support local source, and document this
- separate out config into separate file, and document this
- license
- support custom source for akkoma and gts
- data generation?

24
config.nix Normal file
View file

@ -0,0 +1,24 @@
{ types }:
{
instances = [
{
name = "mastodon";
type = types.mastodon;
version = ./versions/mastodon/mastodon-4.1.4;
}
{
name = "glitch";
type = types.mastodon;
version = ./versions/mastodon/glitch-a004718;
}
{
name = "akkoma";
type = types.akkoma;
}
{
name = "gotosocial";
type = types.gotosocial;
}
];
}

View file

@ -1,5 +1,6 @@
{
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, flake-utils, nixpkgs }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system};
@ -8,7 +9,10 @@
s6 = (import ./nix/s6.nix {
inherit pkgs;
services = pkgs.lib.attrsets.mapAttrs (_: v: v.service)
(import ./nix/services.nix { inherit pkgs; });
(import ./nix/services.nix {
inherit pkgs;
configFn = import ./config.nix;
});
path = "service";
});
in {
@ -26,12 +30,15 @@
mkdir -p cert
rm -rf data/run
mkdir data/run
${if pkgs.stdenv.isLinux then "export LOCALE_ARCHIVE=${pkgs.glibcLocales}/lib/locale/locale-archive" else ""}
${if pkgs.stdenv.isLinux then
"export LOCALE_ARCHIVE=${pkgs.glibcLocales}/lib/locale/locale-archive"
else
""}
export MINIFEDI_CERT=$(pwd)/cert
export MINIFEDI_DATA=$(pwd)/data
export MINIFEDI_RUN=$(pwd)/data/run
${if pkgs.stdenv.isLinux then ''
echo "=> You'll probably get prompted for a sudo password now. This is just so we can bind to port 80/443; we literally acquire cap_net_bind_service then switch back to being $USER."
echo "=> You'll probably get prompted for a sudo password now. This is just so we can bind to port 80/443; we will acquire cap_net_bind_service then switch back to being $USER."
exec $(PATH=$oldpath which sudo) -E ${pkgs.libcap}/bin/capsh --keep=1 --user="$USER" --inh='cap_net_bind_service' --addamb='cap_net_bind_service' -- -c ${s6.start}
'' else ''
exec ${s6.start}
@ -55,11 +62,11 @@
'';
in "${script}";
};
apps.x86_64-darwin.mastodon-mk-version = {
apps.mk-mastodon = {
type = "app";
program = "${
import ./nix/fedi/mastodon/mk-version { inherit pkgs; }
}/bin/mastodon-mk-version";
}/bin/mk-mastodon";
};
});
}

View file

@ -5,9 +5,12 @@ if ! type "nix" > /dev/null; then
exit 1
fi
if [ "x$1" = x ]; then
echo "subcommand required: start, install-cert, mastodon-mk-version"
subcommand=$1
shift
if [ -z "$subcommand" ]; then
echo "subcommand required: start, install-cert, mk-mastodon"
exit 1
fi
nix --extra-experimental-features "flakes nix-command" run .#$1
nix --extra-experimental-features "flakes nix-command" run .#$subcommand -- $@

View file

@ -34,7 +34,6 @@ let
config :pleroma, :media_proxy,
enabled: false,
redirect_on_failure: true
#base_url: "https://cache.pleroma.social"
config :pleroma, Pleroma.Repo,
adapter: Ecto.Adapters.Postgres,
@ -65,12 +64,21 @@ let
"ref" => "stable"
}
config :pleroma, :http, adapter: [pools: %{default: [conn_opts: [transport_opts: [cacertfile: "$MINIFEDI_CERT/rootCA.pem"]]]}]
config :pleroma, :http,
adapter: [
pools: %{
default: [
conn_opts: [
transport_opts: [
verify: :verify_none
# cacertfile: "$MINIFEDI_CERT/rootCA.pem"
# ^ won't work if Erlang finds the system cert store
]
]
]
}
]
'';
# admin: %{
# "name" => "admin",
# "ref" => "stable"
# }
path = pkgs.lib.strings.concatStrings (builtins.map (x: "${x}/bin:") [
pkgs.akkoma

View file

@ -38,9 +38,8 @@ let
in if portFromHash <= 1024 then portFromHash + 1024 else portFromHash;
config = pkgs.writeText "config.yaml" (pkgs.lib.generators.toYAML { } {
host = "${name}.lvh.me";
bind-address = "127.0.0.1";
inherit port;
inherit host port;
db-type = "postgres";
db-user = name;
db-database = name;

View file

@ -2,20 +2,17 @@
, nixosTests, yarn, callPackage, imagemagick, ffmpeg, file, ruby_3_0
, writeShellScript, fetchYarnDeps, fixup_yarn_lock, brotli
, pname ? "mastodon", versionDef }:
, versionDef }:
stdenv.mkDerivation rec {
inherit pname;
version = import "${versionDef}/version.nix";
name = import "${versionDef}/name.nix";
# Using overrideAttrs on src does not build the gems and modules with the overridden src.
# Putting the callPackage up in the arguments list also does not work.
src = callPackage "${versionDef}/source.nix" { };
mastodonGems = bundlerEnv {
name = "${pname}-gems-${version}";
inherit version;
name = "gems-${name}";
ruby = ruby_3_0;
gemdir = src;
# hack: bundix doesn't properly handle deps in non-default groups, so we get
@ -39,8 +36,8 @@ stdenv.mkDerivation rec {
};
mastodonModules = stdenv.mkDerivation {
pname = "${pname}-modules";
inherit src version;
name = "modules-${name}";
inherit src;
yarnOfflineCache = fetchYarnDeps {
yarnLock = "${src}/yarn.lock";

View file

@ -1,6 +1,6 @@
{ pkgs, name, host, users, versionDef, ... }:
{ pkgs, name, host, users, version, ... }:
let
mastodon = pkgs.callPackage ./build.nix { inherit versionDef; };
mastodon = pkgs.callPackage ./build.nix { versionDef = version; };
env = {
LOCAL_DOMAIN = host;
WEB_DOMAIN = host;

View file

@ -10,11 +10,11 @@ let
jq
prefetch-yarn-deps
]);
in pkgs.runCommand "mastodon-mk-version" {
in pkgs.runCommand "mk-mastodon" {
nativeBuildInputs = [ pkgs.makeWrapper ];
} ''
mkdir -p $out/bin
cp ${./mk-version.sh} $out/bin/mastodon-mk-version
patchShebangs $out/bin/mastodon-mk-version
wrapProgram $out/bin/mastodon-mk-version --prefix PATH : ${binPath}
cp ${./mk-version.sh} $out/bin/mk-mastodon
patchShebangs $out/bin/mk-mastodon
wrapProgram $out/bin/mk-mastodon --prefix PATH : ${binPath}
''

View file

@ -1,66 +1,27 @@
#!/usr/bin/env bash
# Derived from the update script for nixpkgs#mastodon. BSD-licensed.
# Derived from the update script for nixpkgs#mastodon. MIT-licensed.
set -e
OWNER=mastodon
REPO=mastodon
NAME=$1
REPO=$2
REV=$3
POSITIONAL=()
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
--owner)
OWNER="$2"
shift # past argument
shift # past value
;;
--repo)
REPO="$2"
shift # past argument
shift # past value
;;
--ver)
VERSION="$2"
shift # past argument
shift # past value
;;
--rev)
REVISION="$2"
shift # past argument
shift # past value
;;
--patches)
PATCHES="$2"
shift # past argument
shift # past value
;;
*) # unknown option
POSITIONAL+=("$1")
shift # past argument
;;
esac
done
if [[ -z "$VERSION" || -n "$POSITIONAL" ]]; then
echo "Usage: update.sh [--owner OWNER] [--repo REPO] --ver VERSION [--rev REVISION] [--patches PATCHES]"
echo "OWNER and repo must be paths on github."
echo "If VERSION is not a revision acceptable to 'git checkout', you must provide one in REVISION."
echo "If OWNER and REPO are not provided, it defaults they default to mastodon and mastodon."
echo "PATCHES, if provided, should be one or more Nix expressions separated by spaces."
if [[ -z "$REV" ]]; then
echo "Usage: minifedi mk-mastodon NAME REPO REV"
echo "NAME can be anything, but generally it's something like mastodon-4.1.4 or glitch-12abcdef"
echo "REPO is a git clone URL"
echo "REV is a git commit or tag (not a branch)"
exit 1
fi
if [[ -z "$REVISION" ]]; then
REVISION="$VERSION"
fi
rm -rf versions/mastodon/$NAME
mkdir -p versions/mastodon/$NAME
cd versions/mastodon/$NAME
rm -f gemset.nix version.nix source.nix
TARGET_DIR="$PWD"
WORK_DIR=$(mktemp -d)
# Check that working directory was created.
@ -71,31 +32,23 @@ fi
# Delete the working directory on exit.
function cleanup {
# Report errors, if any, from nix-prefetch-git
cat $WORK_DIR/nix-prefetch-git.out >/dev/stderr || true
rm -rf "$WORK_DIR"
}
trap cleanup EXIT
echo "Fetching source code $REVISION"
JSON=$(nix-prefetch-github "$OWNER" "$REPO" --rev "$REVISION" 2> $WORK_DIR/nix-prefetch-git.out)
echo "Fetching source code"
JSON=$(nix-prefetch-git $REPO $REV)
SHA=$(echo "$JSON" | jq -r .sha256)
echo "Creating version.nix"
echo "\"$VERSION\"" | sed 's/^"v/"/' > version.nix
echo "\"$NAME\"" > name.nix
cat > source.nix << EOF
# This file was generated by pkgs.mastodon.updateScript.
{ fetchFromGitHub, applyPatches }: let
src = fetchFromGitHub {
owner = "mastodon";
repo = "mastodon";
rev = "$REVISION";
# This file was generated by minifedi mk-mastodon.
{ fetchgit, applyPatches }: fetchgit {
url = "$REPO";
rev = "$REV";
sha256 = "$SHA";
};
in applyPatches {
inherit src;
patches = [$PATCHES];
}
EOF
SOURCE_DIR="$(nix-build --no-out-link -E '(import <nixpkgs> {}).callPackage ./source.nix {}')"
@ -105,4 +58,6 @@ bundix --lockfile="$SOURCE_DIR/Gemfile.lock" --gemfile="$SOURCE_DIR/Gemfile"
echo "" >> "$TARGET_DIR/gemset.nix" # Create trailing newline to please EditorConfig checks
echo "Creating yarn-hash.nix"
echo '"'$(prefetch-yarn-deps "$SOURCE_DIR/yarn.lock")'"' > "$TARGET_DIR/yarn-hash.nix"
echo '"'$(prefetch-yarn-deps "$SOURCE_DIR/yarn.lock")'"' > "$TARGET_DIR/yarn-hash.nix"
git add .

View file

@ -1,27 +1,14 @@
{ pkgs }:
{ pkgs, configFn }:
let
instances = [
{
name = "mastodon";
type = ./fedi/mastodon;
versionDef = ../versions/mastodon/mastodon-4.1.4;
}
{
name = "glitch";
type = ./fedi/mastodon;
versionDef = ../versions/mastodon/glitch-a40529f;
}
{
name = "akkoma";
type = ./fedi/akkoma;
}
{
name = "gotosocial";
type = ./fedi/gotosocial;
}
];
instances = (configFn {
types = {
mastodon = import ./fedi/mastodon;
akkoma = import ./fedi/akkoma;
gotosocial = import ./fedi/gotosocial;
};
}).instances;
evaldInstances = builtins.listToAttrs (builtins.map (inst:
pkgs.lib.attrsets.nameValuePair inst.name (import inst.type ({
pkgs.lib.attrsets.nameValuePair inst.name (inst.type ({
inherit pkgs;
host = "${inst.name}.lvh.me";
users = [

View file

@ -1,3 +0,0 @@
{
hostForName = name: "${name}.lvh.me"
}

View file

@ -5,32 +5,32 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "10y18l67i6ry7v9w0qwh26477g4gm0qrjjpa87pa5a42hzkglnc7";
sha256 = "1d72cqx1h9c0yl1vc8xakvji00krg118ih6lwqlg5nbw50gbx25c";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
actionmailbox = {
dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"];
dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" "net-imap" "net-pop" "net-smtp"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1ihayijdgasf0rp10x6h335k3y1hgqr6c9s8lxqmhm4gpczajaac";
sha256 = "12xkyfdpr7ljnd31yhc2kzl0rqrlwxzpg4qcn4yb2h364hwc6fh8";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
actionmailer = {
dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"];
dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" "rails-dom-testing"];
groups = ["default" "development"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "03557cskby5alpncnhgm1j1kq43xqq75sdd6r2x22q3j2jv68pj5";
sha256 = "01x11ijfg56585vj7a7az0235idnxcnyjp1nb1jvkm08jjll5d1k";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
actionpack = {
dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
@ -38,21 +38,21 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1x7ffyan8sbv4ywjghiyiv077vfxyf6i6y0h4k0mfpdmf76l0i86";
sha256 = "0d66w1d9rhvafd0dilqyr1ymsvr060l8hi0xvwij7cyvzzxrlrbc";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
actiontext = {
dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"];
dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "globalid" "nokogiri"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0g5gw9ywirw7814wn8cdnnv1df58x5gplgpb15gaw5gzkw9cgvd8";
sha256 = "0bpyfh8g0mzgkb8bxvf245mwnx1awbr1y6dxcdckyhsjjgrfynfl";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
actionview = {
dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
@ -60,10 +60,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0cmzc2c00lsdr5hpmsgs8axs5pbhv5xyqiyi69wf81pqypd2cy3l";
sha256 = "1icfh9pgjpd29apzn07cnqa9nlpvjv7i4vrygack5gp7hp54l8m7";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
active_model_serializers = {
dependencies = ["actionpack" "activemodel" "case_transform" "jsonapi-renderer"];
@ -82,10 +82,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "153z9lmkip3v243xxa5rcc8am82ma73ar46q4vxbmzi850a5yjj2";
sha256 = "1gawwb6550ra1xgbrki03aq4q5wafa3xfrpdr3cva4ghy3qqn53q";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
activemodel = {
dependencies = ["activesupport"];
@ -93,10 +93,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1bpr0zspih2rf2ppzjxaw8sq6gfqg9vss5h0fs4r85p03579swin";
sha256 = "072iv0d3vpbp0xijg4jj99sjil1rykmqfj9addxj76bm5mbzwcaj";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
activerecord = {
dependencies = ["activemodel" "activesupport"];
@ -104,10 +104,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "06403rkjnyr80yj4g05lb5hn04yfzipa7bm0gplbqrrykr3hvh5r";
sha256 = "1l0rn43bhyzlfa4wwcfz016vb4lkzvl0jf5zibkjy4sppxxixzrq";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
activestorage = {
dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"];
@ -115,21 +115,21 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "094kvh8bp792xccql54kky8prmvqvfzwwv9xas2pnh8s4v3avbzl";
sha256 = "036mv935r5mmh7fljz10lyr43c5y5bn8b6h7gdkv8spfgwzihw4j";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
activesupport = {
dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"];
dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
groups = ["default" "development" "pam_authentication" "production" "test"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0s465919p6fcgcsqin8w8hay2m598dvnzks490hbsb0p68sdz69m";
sha256 = "1cjsf26656996hv48wgv2mkwxf0fy1qc68ikgzq7mzfq2mmvmayk";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
addressable = {
dependencies = ["public_suffix"];
@ -368,10 +368,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0wzvxpabnjwwjgr9s13965dbdgl3qfvwjbmhimh83p81bm5lsrnw";
sha256 = "1l2584f7cm7lmwihm1l449rk6vl4wlx3s7x317cm2inapzjhiybg";
type = "gem";
};
version = "5.4.1";
version = "6.0.0";
};
browser = {
groups = ["default"];
@ -443,10 +443,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1iyhs77bff09g18dlz0li5f44khjwpqc09gk5hzcnf5v9yvijpg9";
sha256 = "05lk7y4qyzadzzshjyhgfgx00ggqliq7n561wkx8m331wljv7kx7";
type = "gem";
};
version = "1.6.2";
version = "1.6.3";
};
capistrano-rbenv = {
dependencies = ["capistrano" "sshkit"];
@ -518,10 +518,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1wxq6396814ngwnvwcjkkqm8ji8d7q385gw53kr1dbfihiivlizq";
sha256 = "087ybm1384f5sscvqwk3pcswxycy4y5q11m6587fidqvdc0ipkma";
type = "gem";
};
version = "7.3.2";
version = "7.3.3";
};
chunky_png = {
groups = ["default"];
@ -1125,10 +1125,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1yz5g7ffyv99vd9x3yj64ba4zv2bd71gmgrf60a3kc8m1cvc1z5p";
sha256 = "1fwa7gpxc7crzf5nqc40n2ciqpdk57y213asl6kkbzxnjfl0v319";
type = "gem";
};
version = "0.45.0";
version = "0.48.0";
};
hashdiff = {
groups = ["default" "test"];
@ -1454,6 +1454,16 @@
};
version = "7.2.0";
};
language_server-protocol = {
groups = ["default" "development"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0gvb1j8xsqxms9mww01rmdl78zkd72zgxaap56bhv8j45z05hp1x";
type = "gem";
};
version = "3.17.0.3";
};
launchy = {
dependencies = ["addressable"];
groups = ["default" "development"];
@ -1541,17 +1551,6 @@
};
version = "2.8.1";
};
makara = {
dependencies = ["activerecord"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0a6x6w1ij484s1z0wp667d6v0zb8bylhhr3av10yz60a2nz4r1l7";
type = "gem";
};
version = "0.5.1";
};
marcel = {
groups = ["default"];
platforms = [];
@ -2131,15 +2130,15 @@
version = "2.1.0";
};
rails = {
dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"];
dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "17ympjpkhz06xqsay18hskpbs64nh05hzrsckx8va6ikrxhs2ksq";
sha256 = "08glp6jhq5yh8i5jjxzqa3aqx819l6ci6m68bx1asmimla0x9ysx";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
rails-controller-testing = {
dependencies = ["actionpack" "actionview" "activesupport"];
@ -2180,10 +2179,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "05mcgv748vppnm3fnml37wjy3dw61wj8vfw14ldaj1yx1bmkhb07";
sha256 = "1bbh5gsw46djmrgddwaq3wsjmj9rsh5dk13wkclwxf1rg9jpkn3g";
type = "gem";
};
version = "6.0.0";
version = "7.0.7";
};
rails-settings-cached = {
dependencies = ["rails"];
@ -2199,15 +2198,15 @@
version = "0.6.6";
};
railties = {
dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor" "zeitwerk"];
groups = ["default" "development" "pam_authentication" "production" "test"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0g92if3cxxysl9h6x6ibs7y9dsbcniiwgcldvg00kib02b3pxkbb";
sha256 = "0dcabk5bl5flmspnb9d2qcvclcaw0nd5yr9w6m5pzsmylg3y63pv";
type = "gem";
};
version = "6.1.7.4";
version = "7.0.6";
};
rainbow = {
groups = ["default" "development"];
@ -2462,15 +2461,15 @@
version = "0.6";
};
rubocop = {
dependencies = ["json" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
dependencies = ["json" "language_server-protocol" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
groups = ["development"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0bxc1p7bwh8dlmcvh6ns239sp9v8j46vw4h450ag8wa7bh1ii1wh";
sha256 = "1vklabd0510isqhikx4bfx5qn9g8pyj8h9jxryayp2wj8mx4kg74";
type = "gem";
};
version = "1.52.1";
version = "1.54.1";
};
rubocop-ast = {
dependencies = ["parser"];
@ -2522,10 +2521,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0j6dn8pz70bngx6van8yzsimpdd93gm7c8lr93wz1j4ahm6q4hn9";
sha256 = "05r46ds0dm44fb4p67hbz721zck8mdwblzssz2y25yh075hvs36j";
type = "gem";
};
version = "2.19.1";
version = "2.20.2";
};
rubocop-rspec = {
dependencies = ["rubocop" "rubocop-capybara" "rubocop-factory_bot"];
@ -2768,10 +2767,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1y6w2qkwg0ygn85x0afscnj0dv8iwkvm153zjclvwafkm6g0pknk";
sha256 = "14a717mr2cmpgld5fcdd124cvlc5b634f96rhwlnmmc4m8bbkcp9";
type = "gem";
};
version = "1.21.4";
version = "1.21.5";
};
stackprof = {
groups = ["development"];
@ -2883,10 +2882,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1pfddf51n5fnj4f9ggwj3wbf23ynj0nbxlxqpz12y1gvl9g7d6r6";
sha256 = "1d9cvm0f4zdpwa795v3zv4973y5zk59j7s1x3yn90jjrhcz1yvfd";
type = "gem";
};
version = "0.3.2";
version = "0.4.0";
};
tpm-key_attestation = {
dependencies = ["bindata" "openssl" "openssl-signature_algorithm"];

View file

@ -0,0 +1 @@
"glitch-a004718"

View file

@ -0,0 +1,6 @@
# This file was generated by minifedi mk-mastodon.
{ fetchgit, applyPatches }: fetchgit {
url = "https://github.com/glitch-soc/Mastodon.git";
rev = "a004718";
sha256 = "09i3y408dv5bp1axqnn1v25yg5l9hqj85x524bai5a186wh0pcqh";
}

View file

@ -0,0 +1 @@
"095dcrfc01ywk1g4mq7irm7jm0zzawapacfmbm5b7cv929pvbkkd"

View file

@ -1,12 +0,0 @@
# This file was generated by pkgs.mastodon.updateScript.
{ fetchFromGitHub, applyPatches }: let
src = fetchFromGitHub {
owner = "mastodon";
repo = "mastodon";
rev = "a40529fa79c6882eb1929014e5f9324d8e81ae49";
sha256 = "/b7Z5WbErerqRb5nHh57mbjOyP7tDpi4KUglXdd693Y=";
};
in applyPatches {
inherit src;
patches = [];
}

View file

@ -1 +0,0 @@
"a40529f"

View file

@ -1 +0,0 @@
"05phsp5wj2p63vjd8hr9h39wxqwz3j8zqh4avj8mwrsh23ahkxgi"

View file

@ -0,0 +1 @@
"mastodon-4.1.4"

View file

@ -1,12 +1,6 @@
# This file was generated by pkgs.mastodon.updateScript.
{ fetchFromGitHub, applyPatches }: let
src = fetchFromGitHub {
owner = "mastodon";
repo = "mastodon";
# This file was generated by minifedi mk-mastodon.
{ fetchgit, applyPatches }: fetchgit {
url = "https://github.com/Mastodon/Mastodon.git";
rev = "v4.1.4";
sha256 = "8ULBO8IdwBzC5dgX3netTHbbRrODX4CropWZWtqWHZw=";
};
in applyPatches {
inherit src;
patches = [];
sha256 = "170xjvd5m6cmlamq0pw3nd3dnxjcmmvxw5yqwp11rh0xq8xw2hpi";
}

View file

@ -1 +0,0 @@
"4.1.4"