Reorganize repository

This commit is contained in:
Charlotte Van Petegem 2021-07-10 09:03:38 +02:00
parent da1824edb6
commit 0fc6c32a47
No known key found for this signature in database
GPG key ID: 019E764B7184435A
124 changed files with 16295 additions and 1229 deletions

View file

@ -0,0 +1,64 @@
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '~> 3.0.2'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.1'
# Use postgresql as the database for Active Record
gem 'pg', '>= 1.2.3', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 5.3'
# Use ActiveModelSerializer for serializing to JSON
gem 'active_model_serializers', '~> 0.10'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1'
gem 'delayed_job_active_record', '~> 4.1'
gem 'delayed_cron_job', '~> 0.7'
gem 'wahwah', '~> 1.1.1'
gem 'has_scope', '~> 0.8'
gem 'pundit', '~> 2.1'
gem 'will_paginate', '~> 3.3'
# Use ActiveStorage variant
gem 'image_processing', '~> 1.12.1'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.6', require: false
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
gem 'rack-cors', '~> 1.1'
group :test do
gem 'codecov', '~> 0.5.2', require: false
gem 'mocha', '~> 1.13.0', require: false
gem 'simplecov', '~> 0.21', require: false
end
group :development, :test do
gem 'factory_bot_rails', '~> 6.2'
gem 'faker', '~> 2.18'
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: %i[mri mingw x64_mingw]
end
group :development do
gem 'annotate', '~> 3.1' # Remove workaround in lib/tasks/annotate.rb when https://github.com/ctran/annotate_models/issues/696 is fixed
gem 'rubocop-minitest', '~> 0.14.0'
gem 'rubocop-rails', '~> 2.11'
gem 'listen', '>= 3.1.5', '< 3.6'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', '~> 2.1'
gem 'spring-watcher-listen', '~> 2.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]

View file

@ -0,0 +1,262 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (6.1.4)
actionpack (= 6.1.4)
activesupport (= 6.1.4)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (6.1.4)
actionpack (= 6.1.4)
activejob (= 6.1.4)
activerecord (= 6.1.4)
activestorage (= 6.1.4)
activesupport (= 6.1.4)
mail (>= 2.7.1)
actionmailer (6.1.4)
actionpack (= 6.1.4)
actionview (= 6.1.4)
activejob (= 6.1.4)
activesupport (= 6.1.4)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (6.1.4)
actionview (= 6.1.4)
activesupport (= 6.1.4)
rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.1.4)
actionpack (= 6.1.4)
activerecord (= 6.1.4)
activestorage (= 6.1.4)
activesupport (= 6.1.4)
nokogiri (>= 1.8.5)
actionview (6.1.4)
activesupport (= 6.1.4)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_model_serializers (0.10.12)
actionpack (>= 4.1, < 6.2)
activemodel (>= 4.1, < 6.2)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (6.1.4)
activesupport (= 6.1.4)
globalid (>= 0.3.6)
activemodel (6.1.4)
activesupport (= 6.1.4)
activerecord (6.1.4)
activemodel (= 6.1.4)
activesupport (= 6.1.4)
activestorage (6.1.4)
actionpack (= 6.1.4)
activejob (= 6.1.4)
activerecord (= 6.1.4)
activesupport (= 6.1.4)
marcel (~> 1.0.0)
mini_mime (>= 1.1.0)
activesupport (6.1.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
annotate (3.1.1)
activerecord (>= 3.2, < 7.0)
rake (>= 10.4, < 14.0)
ast (2.4.2)
bcrypt (3.1.16)
bootsnap (1.7.5)
msgpack (~> 1.0)
builder (3.2.4)
byebug (11.1.3)
case_transform (0.2)
activesupport
codecov (0.5.2)
simplecov (>= 0.15, < 0.22)
concurrent-ruby (1.1.9)
crass (1.0.6)
delayed_cron_job (0.7.4)
delayed_job (>= 4.1)
delayed_job (4.1.9)
activesupport (>= 3.0, < 6.2)
delayed_job_active_record (4.1.6)
activerecord (>= 3.0, < 6.2)
delayed_job (>= 3.0, < 5)
docile (1.3.5)
erubi (1.10.0)
factory_bot (6.2.0)
activesupport (>= 5.0.0)
factory_bot_rails (6.2.0)
factory_bot (~> 6.2.0)
railties (>= 5.0.0)
faker (2.18.0)
i18n (>= 1.6, < 2)
ffi (1.15.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
has_scope (0.8.0)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.8.10)
concurrent-ruby (~> 1.0)
image_processing (1.12.1)
mini_magick (>= 4.9.5, < 5)
ruby-vips (>= 2.0.17, < 3)
jsonapi-renderer (0.2.2)
listen (3.5.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.10.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (1.0.1)
method_source (1.0.0)
mini_magick (4.11.0)
mini_mime (1.1.0)
mini_portile2 (2.5.3)
minitest (5.14.4)
mocha (1.13.0)
msgpack (1.4.2)
nio4r (2.5.7)
nokogiri (1.11.7)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
parallel (1.20.1)
parser (3.0.1.1)
ast (~> 2.4.1)
pg (1.2.3)
puma (5.3.2)
nio4r (~> 2.0)
pundit (2.1.0)
activesupport (>= 3.0.0)
racc (1.5.2)
rack (2.2.3)
rack-cors (1.1.1)
rack (>= 2.0.0)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (6.1.4)
actioncable (= 6.1.4)
actionmailbox (= 6.1.4)
actionmailer (= 6.1.4)
actionpack (= 6.1.4)
actiontext (= 6.1.4)
actionview (= 6.1.4)
activejob (= 6.1.4)
activemodel (= 6.1.4)
activerecord (= 6.1.4)
activestorage (= 6.1.4)
activesupport (= 6.1.4)
bundler (>= 1.15.0)
railties (= 6.1.4)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.3.0)
loofah (~> 2.3)
railties (6.1.4)
actionpack (= 6.1.4)
activesupport (= 6.1.4)
method_source
rake (>= 0.13)
thor (~> 1.0)
rainbow (3.0.0)
rake (13.0.3)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
regexp_parser (2.1.1)
rexml (3.2.5)
rubocop (1.18.2)
parallel (~> 1.10)
parser (>= 3.0.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.7.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.7.0)
parser (>= 3.0.1.1)
rubocop-minitest (0.14.0)
rubocop (>= 0.90, < 2.0)
rubocop-rails (2.11.2)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0)
ruby-progressbar (1.11.0)
ruby-vips (2.0.17)
ffi (~> 1.9)
simplecov (0.21.2)
docile (~> 1.1)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov_json_formatter (0.1.2)
spring (2.1.1)
spring-watcher-listen (2.0.1)
listen (>= 2.7, < 4.0)
spring (>= 1.2, < 3.0)
sprockets (4.0.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.2)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (1.1.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
unicode-display_width (2.0.0)
wahwah (1.1.1)
websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
will_paginate (3.3.0)
zeitwerk (2.4.2)
PLATFORMS
ruby
DEPENDENCIES
active_model_serializers (~> 0.10)
annotate (~> 3.1)
bcrypt (~> 3.1)
bootsnap (>= 1.4.6)
byebug
codecov (~> 0.5.2)
delayed_cron_job (~> 0.7)
delayed_job_active_record (~> 4.1)
factory_bot_rails (~> 6.2)
faker (~> 2.18)
has_scope (~> 0.8)
image_processing (~> 1.12.1)
listen (>= 3.1.5, < 3.6)
mocha (~> 1.13.0)
pg (>= 1.2.3, < 2.0)
puma (~> 5.3)
pundit (~> 2.1)
rack-cors (~> 1.1)
rails (~> 6.1)
rubocop-minitest (~> 0.14.0)
rubocop-rails (~> 2.11)
simplecov (~> 0.21)
spring (~> 2.1)
spring-watcher-listen (~> 2.0)
tzinfo-data
wahwah (~> 1.1.1)
will_paginate (~> 3.3)
RUBY VERSION
ruby 3.0.2p107
BUNDLED WITH
2.2.22

View file

@ -0,0 +1,184 @@
{ config, lib, pkgs, ... }:
let
web = pkgs.mkYarnPackage rec {
pname = "accentor-web";
version = "unstable";
src = pkgs.fetchFromGitHub {
owner = "accentor";
repo = "web";
rev = "develop";
sha256 = "0z5a3jwi93rriq5hvdqv53421jj9pg5651nam6h9krj6zhr93fs3";
};
packageJSON = ./package.json;
yarnLock = ./yarn.lock;
yarnNix = ./yarn.nix;
buildPhase = ''
cp deps/accentor/postcss.config.js .
yarn run build
'';
installPhase = ''
cp -r deps/accentor/dist $out
rm $out/**/*.map
'';
distPhase = "true";
};
api = pkgs.fetchFromGitHub {
owner = "accentor";
repo = "api";
rev = "develop";
sha256 = "06amrzlaai7sxpyqjffpympp1fx6wzdr45jxrxcf10xd3k7g7djy";
};
gems = pkgs.bundlerEnv {
name = "accentor-api-env";
ruby = pkgs.ruby_3_0;
gemfile = ./Gemfile;
lockfile = ./Gemfile.lock;
gemset = ./gemset.nix;
groups = [ "default" "development" "test" "production" ];
};
env = {
DATABASE_URL = "postgresql://%2Frun%2Fpostgresql/accentor";
FFMPEG_LOG_LOCATION = "/var/log/accentor/ffmpeg.log";
FFMPEG_VERSION_LOCATION = "${config.chvp.dataPrefix}/var/lib/accentor/ffmpeg.version";
RAILS_STORAGE_PATH = "${config.chvp.dataPrefix}/var/lib/accentor/storage";
RAILS_TRANSCODE_CACHE = "/var/tmp/accentor/transcode_cache";
BOOTSNAP_CACHE_DIR = "/var/tmp/accentor/bootsnap";
PIDFILE = "/run/accentor/server.pid";
RACK_ENV = "production";
RAILS_ENV = "production";
RAILS_LOG_TO_STDOUT = "yes";
};
in
{
options.chvp.services.accentor.enable = lib.mkOption {
default = false;
example = true;
};
config = lib.mkIf config.chvp.services.accentor.enable {
environment.systemPackages = [
(pkgs.writeShellScriptBin "accentor-console" ''
set -ex
export DATABASE_URL="postgresql://%2Frun%2Fpostgresql/accentor"
export FFMPEG_LOG_LOCATION="/var/log/accentor/ffmpeg.log"
export RAILS_STORAGE_PATH="${config.chvp.dataPrefix}/var/lib/accentor/storage"
export FFMPEG_VERSION_LOCATION="${config.chvp.dataPrefix}/var/lib/accentor/ffmpeg.version"
export RAILS_TRANSCODE_CACHE="/var/tmp/accentor/transcode_cache"
export BOOTSNAP_CACHE_DIR="/var/tmp/accentor/bootsnap"
export PIDFILE="/run/accentor/server.pid"
export RACK_ENV="production"
export RAILS_ENV="production"
export RAILS_LOG_TO_STDOUT="yes"
cd ${api}
${gems}/bin/bundle exec rails c
'')
];
security.doas.extraRules = [{
users = [ "charlotte" ];
noPass = true;
cmd = "accentor-console";
runAs = "accentor";
setEnv = [ "RAILS_MASTER_KEY" ];
}];
services.postgresql = {
enable = true;
dataDir = "${config.chvp.dataPrefix}/var/lib/postgresql/${config.services.postgresql.package.psqlSchema}";
ensureUsers = [{
name = "accentor";
ensurePermissions = { "DATABASE accentor" = "ALL PRIVILEGES"; };
}];
ensureDatabases = [ "accentor" ];
};
systemd.tmpfiles.rules = [
"d /run/accentor 0755 accentor accentor -"
"d /var/log/accentor 0755 accentor accentor -"
"d /var/tmp/accentor/transcode_cache 0755 accentor accentor -"
"d /var/tmp/accentor/bootsnap 0755 accentor accentor -"
"d ${config.chvp.dataPrefix}/var/lib/accentor/storage 0755 accentor accentor -"
];
systemd.services = {
accentor-api = {
after = [ "network.target" "postgresql.service" ];
requires = [ "postgresql.service" ];
wantedBy = [ "multi-user.target" ];
environment = env;
path = [ pkgs.ffmpeg gems gems.wrappedRuby ];
serviceConfig = {
EnvironmentFile = config.age.secrets."passwords/services/accentor".path;
Type = "simple";
User = "accentor";
Group = "accentor";
Restart = "on-failure";
WorkingDirectory = api;
ExecStartPre = [
"${gems}/bin/bundle exec rails db:migrate"
"${gems}/bin/bundle exec rails ffmpeg:check_version"
];
ExecStart = "${gems}/bin/bundle exec puma -C ${api}/config/puma.rb";
};
};
} // (builtins.foldl' (x: y: x // y) { } (builtins.genList
(n: {
"accentor-worker${toString n}" = {
after = [ "network.target" "accentor-api.service" "postgresql.service" ];
requires = [ "accentor-api.service" "postgresql.service" ];
wantedBy = [ "multi-user.target" ];
environment = env;
path = [ pkgs.ffmpeg gems gems.wrappedRuby ];
serviceConfig = {
EnvironmentFile = config.age.secrets."passwords/services/accentor".path;
Type = "simple";
User = "accentor";
Group = "accentor";
Restart = "on-failure";
WorkingDirectory = api;
ExecStart = "${gems}/bin/bundle exec rails jobs:work";
};
};
}) 4));
age.secrets."passwords/services/accentor" = {
file = ../../../secrets/passwords/services/accentor.age;
owner = "accentor";
};
users.users.accentor = {
group = "accentor";
home = "${config.chvp.dataPrefix}/var/lib/accentor";
createHome = true;
uid = 314;
};
users.groups.accentor.gid = 314;
chvp.services.nginx.hosts = [{
fqdn = "accentor.vanpetegem.me";
options = {
root = web;
locations = {
"/api" = {
proxyPass = "http://localhost:3000";
extraConfig = ''
proxy_set_header X-Forwarded-Ssl on;
client_max_body_size 40M;
'';
};
"/rails" = {
proxyPass = "http://localhost:3000";
extraConfig = ''
proxy_set_header X-Forwarded-Ssl on;
'';
};
"/".extraConfig = ''
autoindex on;
try_files $uri $uri/ /index.html =404;
'';
};
};
}];
};
}

View file

@ -0,0 +1,954 @@
{
actioncable = {
dependencies = [ "actionpack" "activesupport" "nio4r" "websocket-driver" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1wswkgwhmfk5j76ar76plhaxna12x0cyf2di57azahlcv88rrwra";
type = "gem";
};
version = "6.1.4";
};
actionmailbox = {
dependencies = [ "actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "101r0x4lhzp23hksch7z24ajvp549lskxn2cr7pbgr64jjy6v17y";
type = "gem";
};
version = "6.1.4";
};
actionmailer = {
dependencies = [ "actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0mxqpiwgqam5vfk8wsfyj4dpxq0xqqvfbcwx1i4p9n1ahrx7wv7f";
type = "gem";
};
version = "6.1.4";
};
actionpack = {
dependencies = [ "actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1pj4xz316b3z56vpb8pnrkwj4rlf3hgas5fhddk6yh7ifrl30sc9";
type = "gem";
};
version = "6.1.4";
};
actiontext = {
dependencies = [ "actionpack" "activerecord" "activestorage" "activesupport" "nokogiri" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1fn488la8dllfg5zhm74k8y23xl9czrzzs55b9v624j43wjhfxcl";
type = "gem";
};
version = "6.1.4";
};
actionview = {
dependencies = [ "activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1jqybz7h11xkjpqdffb9gphwmd56lms9xqskza00wd2pswxcwkn4";
type = "gem";
};
version = "6.1.4";
};
active_model_serializers = {
dependencies = [ "actionpack" "activemodel" "case_transform" "jsonapi-renderer" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1jjkmrx82rn0d2bhpi6kz2h1s4w7rpk5pj2vcssyc1a2ys12vyhj";
type = "gem";
};
version = "0.10.12";
};
activejob = {
dependencies = [ "activesupport" "globalid" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0q00vrknnnhmg02nik06ivrmz7hnq5snpy653kdpskvp4c9ys55c";
type = "gem";
};
version = "6.1.4";
};
activemodel = {
dependencies = [ "activesupport" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0xjy8fg7n5wwv29ngvvdf5r6815s5f0knzyswxh8w6z8f8qj5wr7";
type = "gem";
};
version = "6.1.4";
};
activerecord = {
dependencies = [ "activemodel" "activesupport" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "18897s9h9kha8vgky1yfq4x91m3p81k6rkrb1fgjlnqnvarh9vg0";
type = "gem";
};
version = "6.1.4";
};
activestorage = {
dependencies = [ "actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "03gb6jbvdzm0xlr2g393jvf980ybjf9zzgspl0p4ixh3lcxxr51w";
type = "gem";
};
version = "6.1.4";
};
activesupport = {
dependencies = [ "concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0kqgywy4cj3h5142dh7pl0xx5nybp25jn0ykk0znziivzks68xdk";
type = "gem";
};
version = "6.1.4";
};
annotate = {
dependencies = [ "activerecord" "rake" ];
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1dxrfppwfg13vqmambbs56xjj8qsdgcy58r2yc44vvy3z1g5yflw";
type = "gem";
};
version = "3.1.1";
};
ast = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y";
type = "gem";
};
version = "2.4.2";
};
bcrypt = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "02r1c3isfchs5fxivbq99gc3aq4vfyn8snhcy707dal1p8qz12qb";
type = "gem";
};
version = "3.1.16";
};
bootsnap = {
dependencies = [ "msgpack" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "12n09iwpssnsfw9s140ynfxr9psd0xcfx42yqdsk0hq60zhq2nlx";
type = "gem";
};
version = "1.7.5";
};
builder = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr";
type = "gem";
};
version = "3.2.4";
};
byebug = {
groups = [ "development" "test" ];
platforms = [{
engine = "maglev";
}
{
engine = "mingw";
}
{
engine = "mingw";
}
{
engine = "ruby";
}];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194";
type = "gem";
};
version = "11.1.3";
};
case_transform = {
dependencies = [ "activesupport" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0fzyws6spn5arqf6q604dh9mrj84a36k5hsc8z7jgcpfvhc49bg2";
type = "gem";
};
version = "0.2";
};
codecov = {
dependencies = [ "simplecov" ];
groups = [ "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1svgz4469ph5jlnnwfrwrrfi8c05cnis4bib769pjjjy9ax4s3zh";
type = "gem";
};
version = "0.5.2";
};
concurrent-ruby = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f";
type = "gem";
};
version = "1.1.9";
};
crass = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw";
type = "gem";
};
version = "1.0.6";
};
delayed_cron_job = {
dependencies = [ "delayed_job" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1qsf7csnhyk787yx88ilsqris3h0gga3g6ri31hccdfbdab1f33a";
type = "gem";
};
version = "0.7.4";
};
delayed_job = {
dependencies = [ "activesupport" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "19ym3jw2jj1pxm6p22x2mpf69sdxiw07ddr69v92ccgg6d7q87rh";
type = "gem";
};
version = "4.1.9";
};
delayed_job_active_record = {
dependencies = [ "activerecord" "delayed_job" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0n6wjvk0yfkp1z19kvma7piasw1xgjh5ls51sf24c8g1jlmkmvdh";
type = "gem";
};
version = "4.1.6";
};
docile = {
groups = [ "default" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1bpdrsdqwv80qqc3f4xxzpii13lx9mlx3zay4bnmmscrx8c0p63z";
type = "gem";
};
version = "1.3.5";
};
erubi = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l";
type = "gem";
};
version = "1.10.0";
};
factory_bot = {
dependencies = [ "activesupport" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "04vxmjr200akcil9fqxc9ghbb9q0lyrh2q03xxncycd5vln910fi";
type = "gem";
};
version = "6.2.0";
};
factory_bot_rails = {
dependencies = [ "factory_bot" "railties" ];
groups = [ "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7";
type = "gem";
};
version = "6.2.0";
};
faker = {
dependencies = [ "i18n" ];
groups = [ "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hwir9b9zy0asy0vap7zfqv75lbws4a1pmh74lhqd2rndv32vfc5";
type = "gem";
};
version = "2.18.0";
};
ffi = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0nq1fb3vbfylccwba64zblxy96qznxbys5900wd7gm9bpplmf432";
type = "gem";
};
version = "1.15.0";
};
globalid = {
dependencies = [ "activesupport" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1zkxndvck72bfw235bd9nl2ii0lvs5z88q14706cmn702ww2mxv1";
type = "gem";
};
version = "0.4.2";
};
has_scope = {
dependencies = [ "actionpack" "activesupport" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "00y4jr5fd5lf1b59wxaf5j04afxd4i0sdx6wh51w1ha5njqn7256";
type = "gem";
};
version = "0.8.0";
};
i18n = {
dependencies = [ "concurrent-ruby" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0g2fnag935zn2ggm5cn6k4s4xvv53v2givj1j90szmvavlpya96a";
type = "gem";
};
version = "1.8.10";
};
image_processing = {
dependencies = [ "mini_magick" "ruby-vips" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1778lv4lpwk9ffm0zy7w59gzchq19f22a5gfrdk6qa7l9vx89h11";
type = "gem";
};
version = "1.12.1";
};
jsonapi-renderer = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0ys4drd0k9rw5ixf8n8fx8v0pjh792w4myh0cpdspd317l1lpi5m";
type = "gem";
};
version = "0.2.2";
};
listen = {
dependencies = [ "rb-fsevent" "rb-inotify" ];
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0h2v34xhi30w0d9gfzds2w6v89grq2gkpgvmdj9m8x1ld1845xnj";
type = "gem";
};
version = "3.5.1";
};
loofah = {
dependencies = [ "crass" "nokogiri" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "19vkaazjqyq7yj5ah8rpr4vl9n4mg95scdr5im93akhd5bjvkkly";
type = "gem";
};
version = "2.10.0";
};
mail = {
dependencies = [ "mini_mime" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
type = "gem";
};
version = "2.7.1";
};
marcel = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0bp001p687nsa4a8sp3q1iv8pfhs24w7s3avychjp64sdkg6jxq3";
type = "gem";
};
version = "1.0.1";
};
method_source = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp";
type = "gem";
};
version = "1.0.0";
};
mini_magick = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1aj604x11d9pksbljh0l38f70b558rhdgji1s9i763hiagvvx2hs";
type = "gem";
};
version = "4.11.0";
};
mini_mime = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih";
type = "gem";
};
version = "1.1.0";
};
mini_portile2 = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1ad0mli9rc0f17zw4ibp24dbj1y39zkykijsjmnzl4gwpg5s0j6k";
type = "gem";
};
version = "2.5.3";
};
minitest = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "19z7wkhg59y8abginfrm2wzplz7py3va8fyngiigngqvsws6cwgl";
type = "gem";
};
version = "5.14.4";
};
mocha = {
groups = [ "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "15s53ggsykk69kxqvs4416s8yxdhz6caggva55n8sjgy4ixzwp10";
type = "gem";
};
version = "1.13.0";
};
msgpack = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6";
type = "gem";
};
version = "1.4.2";
};
nio4r = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "00fwz0qq7agd2xkdz02i8li236qvwhma3p0jdn5bdvc21b7ydzd5";
type = "gem";
};
version = "2.5.7";
};
nokogiri = {
dependencies = [ "mini_portile2" "racc" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1vrn31385ix5k9b0yalnlzv360isv6dincbcvi8psllnwz4sjxj9";
type = "gem";
};
version = "1.11.7";
};
parallel = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0055br0mibnqz0j8wvy20zry548dhkakws681bhj3ycb972awkzd";
type = "gem";
};
version = "1.20.1";
};
parser = {
dependencies = [ "ast" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1pxsi1i5z506xfzhiyavlasf8777h55ab40phvp7pfv9npmd5pnj";
type = "gem";
};
version = "3.0.1.1";
};
pg = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj";
type = "gem";
};
version = "1.2.3";
};
puma = {
dependencies = [ "nio4r" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0lmaq05a257m9588a81wql3a5p039f221f0dmq57bm2qjwxydjmj";
type = "gem";
};
version = "5.3.2";
};
pundit = {
dependencies = [ "activesupport" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "18kwm5rkazb89yf792y3fxqihcxw2vdy7k1w542s4hg82ibfpyx3";
type = "gem";
};
version = "2.1.0";
};
racc = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g";
type = "gem";
};
version = "1.5.2";
};
rack = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16";
type = "gem";
};
version = "2.2.3";
};
rack-cors = {
dependencies = [ "rack" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0jvs0mq8jrsz86jva91mgql16daprpa3qaipzzfvngnnqr5680j7";
type = "gem";
};
version = "1.1.1";
};
rack-test = {
dependencies = [ "rack" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
type = "gem";
};
version = "1.1.0";
};
rails = {
dependencies = [ "actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0k3d3acac2qn9fg185z3y79nvg4ghr4lyhqiz6mbwlsd7r2nd8mh";
type = "gem";
};
version = "6.1.4";
};
rails-dom-testing = {
dependencies = [ "activesupport" "nokogiri" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
type = "gem";
};
version = "2.0.3";
};
rails-html-sanitizer = {
dependencies = [ "loofah" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1icpqmxbppl4ynzmn6dx7wdil5hhq6fz707m9ya6d86c7ys8sd4f";
type = "gem";
};
version = "1.3.0";
};
railties = {
dependencies = [ "actionpack" "activesupport" "method_source" "rake" "thor" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0hwp0qwkphp3fvbsq6ljp8s99v621si9bgqihysz5bv1d1z52mm4";
type = "gem";
};
version = "6.1.4";
};
rainbow = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk";
type = "gem";
};
version = "3.0.0";
};
rake = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1iik52mf9ky4cgs38fp2m8r6skdkq1yz23vh18lk95fhbcxb6a67";
type = "gem";
};
version = "13.0.3";
};
rb-fsevent = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1k9bsj7ni0g2fd7scyyy1sk9dy2pg9akniahab0iznvjmhn54h87";
type = "gem";
};
version = "0.10.4";
};
rb-inotify = {
dependencies = [ "ffi" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005";
type = "gem";
};
version = "0.10.1";
};
regexp_parser = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0vg7imjnfcqjx7kw94ccj5r78j4g190cqzi1i59sh4a0l940b9cr";
type = "gem";
};
version = "2.1.1";
};
rexml = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
type = "gem";
};
version = "3.2.5";
};
rubocop = {
dependencies = [ "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hi5zxn7wk8l6x7rs2wi7iqv87b1h4dx63m1pqzgibd3fw4rhibb";
type = "gem";
};
version = "1.18.2";
};
rubocop-ast = {
dependencies = [ "parser" ];
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hnrfy928mwpa0ippqs4s8xwghwwp5h853naphgqxcd53l33chlv";
type = "gem";
};
version = "1.7.0";
};
rubocop-minitest = {
dependencies = [ "rubocop" ];
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1sf8s0iiwzv7k7vk3gb7483anf5gxh7wp7jf7d26ga5z4lzrsfd8";
type = "gem";
};
version = "0.14.0";
};
rubocop-rails = {
dependencies = [ "activesupport" "rack" "rubocop" ];
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0js9g5l5i29519qvi7pslhzjvsi6x05ab8wlrx9nb82p2l14rgq7";
type = "gem";
};
version = "2.11.2";
};
ruby-progressbar = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "02nmaw7yx9kl7rbaan5pl8x5nn0y4j5954mzrkzi9i3dhsrps4nc";
type = "gem";
};
version = "1.11.0";
};
ruby-vips = {
dependencies = [ "ffi" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0lk124dixshf8mmrjpsy9avnaygni3cwki25g8nm5py4d2f5fwwa";
type = "gem";
};
version = "2.0.17";
};
simplecov = {
dependencies = [ "docile" "simplecov-html" "simplecov_json_formatter" ];
groups = [ "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hrv046jll6ad1s964gsmcq4hvkr3zzr6jc7z1mns22mvfpbc3cr";
type = "gem";
};
version = "0.21.2";
};
simplecov-html = {
groups = [ "default" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb";
type = "gem";
};
version = "0.12.3";
};
simplecov_json_formatter = {
groups = [ "default" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0cl3j7p3b5q7sxsx1va63c8imc5x6g99xablz08qrmqhpi0d6g6j";
type = "gem";
};
version = "0.1.2";
};
spring = {
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1x2wz1y2b0kp7mlk9k8zkl39rddk2l3x34b7dar3bh3axd1cs30d";
type = "gem";
};
version = "2.1.1";
};
spring-watcher-listen = {
dependencies = [ "listen" "spring" ];
groups = [ "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1ybz9nsngfz4psvgnbr3gdk5ibqqhq47lsjkwh5yq4f8brpr10yz";
type = "gem";
};
version = "2.0.1";
};
sprockets = {
dependencies = [ "concurrent-ruby" "rack" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0ikgwbl6jv3frfiy3xhg5yxw9d0064rgzghar1rg391xmrc4gm38";
type = "gem";
};
version = "4.0.2";
};
sprockets-rails = {
dependencies = [ "actionpack" "activesupport" "sprockets" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2";
type = "gem";
};
version = "3.2.2";
};
thor = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "18yhlvmfya23cs3pvhr1qy38y41b6mhr5q9vwv5lrgk16wmf3jna";
type = "gem";
};
version = "1.1.0";
};
tzinfo = {
dependencies = [ "concurrent-ruby" ];
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
type = "gem";
};
version = "2.0.4";
};
unicode-display_width = {
groups = [ "default" "development" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1bilbnc8j6jkb59lrf177i3p1pdyxll0n8400hzqr35vl3r3kv2m";
type = "gem";
};
version = "2.0.0";
};
wahwah = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0dk750bhy0l3adnzkkklyima816k7shi54g9byrlw2mq2nnw5s5i";
type = "gem";
};
version = "1.1.1";
};
websocket-driver = {
dependencies = [ "websocket-extensions" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052";
type = "gem";
};
version = "0.7.5";
};
websocket-extensions = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw";
type = "gem";
};
version = "0.1.5";
};
will_paginate = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "10qk4mf3rfc0vr26j0ba6vcz7407rdjfn13ph690pkzr94rv8bay";
type = "gem";
};
version = "3.3.0";
};
zeitwerk = {
groups = [ "default" "development" "test" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1746czsjarixq0x05f7p3hpzi38ldg6wxnxxw74kbjzh1sdjgmpl";
type = "gem";
};
version = "2.4.2";
};
}

View file

@ -0,0 +1,45 @@
{
"name": "accentor",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'"
},
"dependencies": {
"@mdi/font": "^5.9.55",
"@mdi/svg": "^5.9.55",
"fetch-retry": "^4.1.1",
"roboto-fontface": "^0.10.0",
"vue": "^2.6.14",
"vue-i18n": "^8.24.5",
"vue-meta": "^2.4.0",
"vue-router": "^3.5.2",
"vuedraggable": "^2.24.3",
"vuetify": "^2.5.6",
"vuex": "^3.6.2",
"vuex-persistedstate": "^3.2.0"
},
"devDependencies": {
"@intlify/vue-i18n-loader": "^1.1.0",
"@vue/cli-plugin-babel": "^4.5.13",
"@vue/cli-plugin-eslint": "^4.5.13",
"@vue/cli-service": "^4.5.13",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.8.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-vue": "^7.12.1",
"eslint-plugin-vuetify": "^1.0.1",
"prettier": "^2.3.2",
"sass": "^1.35.1",
"sass-loader": "^10.1.1",
"vue-cli-plugin-i18n": "^2.1.0",
"vue-cli-plugin-vuetify": "^2.4.1",
"vue-template-compiler": "^2.6.14",
"vuetify-loader": "^1.7.2",
"webpack": "^4.46.0"
}
}

View file

@ -0,0 +1,8 @@
#!/usr/bin/env nix-shell
#!nix-shell -p curl yarn2nix bundix -i bash
curl -L -O https://github.com/accentor/api/raw/develop/Gemfile
curl -L -O https://github.com/accentor/api/raw/develop/Gemfile.lock
curl -L -O https://github.com/accentor/web/raw/develop/package.json
curl -L -O https://github.com/accentor/web/raw/develop/yarn.lock
yarn2nix --lockfile yarn.lock --no-patch > yarn.nix
bundix -l

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
{
options.chvp.services.containers = {
enable = lib.mkOption {
default = false;
example = true;
};
externalInterface = lib.mkOption {
example = "eno3";
};
};
config = {
networking.nat = lib.mkIf config.chvp.services.containers.enable {
enable = true;
enableIPv6 = true;
internalInterfaces = [ "ve-+" ];
externalInterface = config.chvp.services.containers.externalInterface;
};
};
}

View file

@ -0,0 +1,20 @@
{ pkgs, ... }:
{
users.users.data = {
isNormalUser = true;
home = "/home/data";
description = "Data Access";
uid = 1000;
group = "users";
};
security.sudo.enable = false;
services.openssh = {
enable = true;
permitRootLogin = "no";
hostKeys = [
{ bits = 4096; path = "/run/secrets/ssh_host_rsa_key"; type = "rsa"; }
{ path = "/run/secrets/ssh_host_ed25519_key"; type = "ed25519"; }
];
};
}

Binary file not shown.

View file

@ -0,0 +1,67 @@
{ config, lib, ... }:
{
imports = [ ./secret.nix ];
options.chvp.services.data-access.enable = lib.mkOption {
default = false;
example = true;
};
config = lib.mkIf config.chvp.services.data-access.enable {
chvp.services = {
containers.enable = true;
nginx.hosts = [
{
fqdn = "data.vanpetegem.me";
options = {
default = true;
basicAuthFile = config.age.secrets."passwords/services/data-basic-auth".path;
root = "/srv/data";
locations = {
"/".extraConfig = ''
autoindex on;
'';
"/public".extraConfig = ''
autoindex on;
auth_basic off;
'';
};
};
}
];
};
containers.data-access = {
ephemeral = true;
autoStart = true;
bindMounts = {
"/home/data/data" = {
hostPath = "/srv/data";
isReadOnly = false;
};
"/run/secrets" = {
hostPath = "/run/secrets/data-access";
isReadOnly = true;
};
};
privateNetwork = true;
hostAddress = "192.168.100.10";
hostAddress6 = "fc00::1";
localAddress = "192.168.100.11";
localAddress6 = "fc00::2";
config = { ... }: {
imports = [ ./config.nix ./config.secret.nix ];
};
};
age.secrets."data-access/ssh_host_rsa_key".file = ../../../secrets/data-access/ssh_host_rsa_key.age;
age.secrets."data-access/ssh_host_rsa_key.pub".file = ../../../secrets/data-access/ssh_host_rsa_key.pub.age;
age.secrets."data-access/ssh_host_ed25519_key".file = ../../../secrets/data-access/ssh_host_ed25519_key.age;
age.secrets."data-access/ssh_host_ed25519_key.pub".file = ../../../secrets/data-access/ssh_host_ed25519_key.pub.age;
age.secrets."passwords/services/data-basic-auth" = {
file = ../../../secrets/passwords/services/data-basic-auth.age;
owner = "nginx";
};
};
}

Binary file not shown.

View file

@ -0,0 +1,13 @@
{ ... }:
{
imports = [
./accentor
./containers
./data-access
./deluge
./nextcloud
./nginx
./syncthing
];
}

View file

@ -0,0 +1,67 @@
{ config, lib, pkgs, ... }:
{
options.chvp.services.deluge = {
enable = lib.mkOption {
default = false;
example = true;
};
count = lib.mkOption {
default = 1;
example = 6;
};
};
config = lib.mkIf config.chvp.services.deluge.enable {
chvp.services.nginx.hosts = builtins.genList
(n: {
fqdn = "del${toString (n + 1)}.vanpetegem.me";
basicProxy = "http://localhost:${toString (8112 + n)}";
})
config.chvp.services.deluge.count;
networking.firewall = {
allowedTCPPortRanges = [
{ from = 60000; to = 60000 + config.chvp.services.deluge.count - 1; }
{ from = 58846; to = 58846 + config.chvp.services.deluge.count - 1; }
];
};
systemd.services = builtins.foldl' (x: y: x // y) { } (builtins.genList
(n:
let num = toString (n + 1); in
{
"del${num}" = {
after = [ "network-online.target" ];
requires = [ "network-online.target" ];
description = "Deluge daemon ${num}";
wantedBy = [ "multi-user.target" ];
path = [ pkgs.deluge ];
serviceConfig = {
ExecStart = ''
${pkgs.deluge}/bin/deluged --do-not-daemonize --config /data/var/lib/deluge/del${toString (n + 1)}
'';
Restart = "on-success";
User = "charlotte";
Group = "users";
UMask = "022";
};
};
"del${num}-web" = {
after = [ "network.target" "del${num}.service" ];
requires = [ "del${num}.service" ];
description = "Deluge Web UI for daemon ${num}";
wantedBy = [ "multi-user.target" ];
path = [ pkgs.deluge ];
serviceConfig = {
ExecStart = ''
${pkgs.deluge}/bin/deluge-web --do-not-daemonize --config /data/var/lib/deluge/del${toString (n + 1)} --port ${toString (8112 + n)}
'';
User = "charlotte";
Group = "users";
};
};
})
config.chvp.services.deluge.count);
};
}

View file

@ -0,0 +1,49 @@
{ config, lib, pkgs, ... }:
{
options.chvp.services.nextcloud.enable = lib.mkOption {
default = false;
example = true;
};
config = lib.mkIf config.chvp.services.nextcloud.enable {
services = {
nextcloud = {
home = "${config.chvp.dataPrefix}/var/lib/nextcloud";
https = true;
hostName = "nextcloud.vanpetegem.me";
enable = true;
autoUpdateApps.enable = true;
package = pkgs.nextcloud21;
config = {
dbuser = "nextcloud";
dbname = "nextcloud";
dbtype = "pgsql";
dbhost = "/run/postgresql";
adminuser = "admin";
adminpassFile = config.age.secrets."passwords/services/nextcloud-admin".path;
};
};
nginx.virtualHosts."nextcloud.vanpetegem.me" = {
forceSSL = true;
useACMEHost = "vanpetegem.me";
};
postgresql = {
enable = true;
dataDir = "${config.chvp.dataPrefix}/var/lib/postgresql/${config.services.postgresql.package.psqlSchema}";
ensureDatabases = [ "nextcloud" ];
ensureUsers = [{
name = "nextcloud";
ensurePermissions = { "DATABASE nextcloud" = "ALL PRIVILEGES"; };
}];
};
};
age.secrets."passwords/services/nextcloud-admin" = {
file = ../../../secrets/passwords/services/nextcloud-admin.age;
owner = "nextcloud";
};
systemd.services."nextcloud-setup" = {
requires = [ "postgresql.service" ];
after = [ "postgresql.service" ];
};
};
}

View file

@ -0,0 +1,95 @@
{ config, lib, ... }:
{
options.chvp.services.nginx = {
enable = lib.mkOption {
readOnly = true;
default = (builtins.length config.chvp.services.nginx.hosts) > 0;
};
hosts = lib.mkOption {
default = [ ];
example = [
{
fqdn = "data.vanpetegem.me";
options = {
default = true;
root = "/srv/data";
locations = {
"/".extraConfig = ''
autoindex on;
'';
"/public".extraConfig = ''
autoindex on;
auth_basic off;
'';
};
};
}
];
};
extraPostACMEScripts = lib.mkOption {
default = [ ];
example = [
''
cp fullchain.pem /data/home/charlotte/synapse/slack/cert.crt
cp privkey.pem /data/home/charlotte/synapse/slack/key.pem
pushd /data/home/charlotte/synapse
''${pkgs.docker-compose}/bin/docker-compose restart slack
popd
''
];
};
};
config = lib.mkIf config.chvp.services.nginx.enable {
networking.firewall.allowedTCPPorts = [ 80 443 ];
security.acme = {
certs."vanpetegem.me" = {
dnsProvider = "cloudflare";
credentialsFile = config.age.secrets."passwords/services/acme".path;
extraDomainNames = [
"*.vanpetegem.me"
"cvpetegem.be"
"*.cvpetegem.be"
"chvp.be"
"*.chvp.be"
];
postRun = lib.concatStrings config.chvp.services.nginx.extraPostACMEScripts;
};
email = "webmaster@vanpetegem.me";
acceptTerms = true;
preliminarySelfsigned = false;
};
age.secrets."passwords/services/acme" = {
file = ../../../secrets/passwords/services/acme.age;
owner = "acme";
};
chvp.base.zfs.systemLinks = [
{ type = "data"; path = "/var/lib/acme"; }
];
services.nginx = {
enable = true;
recommendedTlsSettings = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
virtualHosts = builtins.listToAttrs
(map
(elem: {
name = elem.fqdn;
value = {
forceSSL = true;
useACMEHost = "vanpetegem.me";
locations."/" = lib.mkIf (builtins.hasAttr "basicProxy" elem) {
proxyPass = elem.basicProxy;
extraConfig = ''
proxy_set_header X-Forwarded-Ssl on;
'' + (elem.extraProxySettings or "");
};
} // (elem.options or { });
})
config.chvp.services.nginx.hosts);
};
users.users.nginx.extraGroups = [ "acme" ];
};
}

View file

@ -0,0 +1,31 @@
{ config, lib, ... }:
{
options.chvp.services.syncthing.enable = lib.mkOption {
default = false;
example = true;
};
config = lib.mkIf config.chvp.services.syncthing.enable {
services.syncthing = {
enable = true;
dataDir = "${config.chvp.dataPrefix}/var/lib/syncthing";
configDir = "${config.chvp.dataPrefix}/var/lib/syncthing/.config";
openDefaultPorts = true;
guiAddress = "127.0.0.1:8384";
};
chvp.services.nginx.hosts = [
{
fqdn = "syncthing.vanpetegem.me";
basicProxy = "http://localhost:8384";
options.basicAuthFile = config.age.secrets."passwords/services/syncthing-basic-auth".path;
}
];
age.secrets."passwords/services/syncthing-basic-auth" = {
file = ../../../secrets/passwords/services/syncthing-basic-auth.age;
owner = "nginx";
};
};
}