From cda65a1f036d583cdde948fcfd4f2d917ba55c21 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 9 Aug 2024 22:27:59 -0400 Subject: [PATCH] archives/mastodon: new aport --- archives/mastodon/APKBUILD | 202 +++++++++++++++++++++ archives/mastodon/bin-wrapper.in | 15 ++ archives/mastodon/mastodon.initd | 41 +++++ archives/mastodon/mastodon.logrotate | 11 ++ archives/mastodon/mastodon.post-install | 27 +++ archives/mastodon/mastodon.post-upgrade | 1 + archives/mastodon/mastodon.pre-install | 54 ++++++ archives/mastodon/mastodon.sidekiq.initd | 32 ++++ archives/mastodon/mastodon.streaming.initd | 33 ++++ archives/mastodon/mastodon.web.initd | 29 +++ 10 files changed, 445 insertions(+) create mode 100644 archives/mastodon/APKBUILD create mode 100644 archives/mastodon/bin-wrapper.in create mode 100644 archives/mastodon/mastodon.initd create mode 100644 archives/mastodon/mastodon.logrotate create mode 100644 archives/mastodon/mastodon.post-install create mode 120000 archives/mastodon/mastodon.post-upgrade create mode 100644 archives/mastodon/mastodon.pre-install create mode 100644 archives/mastodon/mastodon.sidekiq.initd create mode 100644 archives/mastodon/mastodon.streaming.initd create mode 100644 archives/mastodon/mastodon.web.initd diff --git a/archives/mastodon/APKBUILD b/archives/mastodon/APKBUILD new file mode 100644 index 0000000..954ff0b --- /dev/null +++ b/archives/mastodon/APKBUILD @@ -0,0 +1,202 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=mastodon +_pkgname=$pkgname +pkgver=4.2.10 +_gittag=v$pkgver +pkgrel=1 +pkgdesc="Self-hosted social media and network server based on ActivityPub and OStatus" +arch="x86_64" +url="https://github.com/mastodon/mastodon" +license="AGPL-3.0-only" +depends=" + $pkgname-assets=$pkgver-r$pkgrel + ffmpeg + file + gcompat + imagemagick + nodejs + npm + protobuf + py3-elasticsearch + redis + ruby3.2 + ruby3.2-bundler + yarn + " +makedepends=" + gnu-libiconv-dev + icu-dev + libffi-dev + libidn-dev + libxml2-dev + libxslt-dev + openssl-dev + postgresql-dev + protobuf-dev + ruby3.2-dev + yaml-dev + zlib-dev + " +install=" + $pkgname.pre-install + $pkgname.post-upgrade + $pkgname.post-install + " +source=" + mastodon-$_gittag.tar.gz::https://github.com/mastodon/mastodon/archive/$_gittag.tar.gz + mastodon.initd + mastodon.web.initd + mastodon.sidekiq.initd + mastodon.streaming.initd + mastodon.logrotate + bin-wrapper.in + " +subpackages="$pkgname-openrc $pkgname-assets::noarch" +options="!check" # No test suite + +_prefix="usr/lib/bundles/$_pkgname" + +export BUNDLE_DEPLOYMENT=true +export BUNDLE_FORCE_RUBY_PLATFORM=true +export BUNDLE_FROZEN=true +export BUNDLE_JOBS=${JOBS:-2} + +prepare() { + default_prepare + + # Allow use of any bundler + sed -i -e '/BUNDLED/,+1d' Gemfile.lock + + # Allow use of higher Node versions + sed -i 's/"node": .*"/"node": ">=14.15"/' package.json + + mkdir -p "$srcdir"/gem-cache +} + +build() { + local bundle_without='exclude development' + + msg "Installing Ruby gems..." + bundle config --local build.nokogiri --use-system-libraries \ + --with-xml2-include=/usr/include/libxml2 \ + --with-xslt-include=/usr/include/libxslt + bundle config --local build.ffi --enable-system-libffi + bundle config --local build.idn --enable-system-libidn + bundle config --local path "vendor/bundle" + bundle config --local set deployment 'false' + bundle config --local set without "$bundle_without" + + bundle install --no-cache -j"$(getconf _NPROCESSORS_ONLN)" + + msg "Installing npm modules..." + yarn install --production --frozen-lockfile + + ( + msg "Compiling assets..." + export NODE_ENV=production + export RAILS_ENV=production + export NODE_OPTIONS="--openssl-legacy-provider" + + OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile + ) + + msg "Cleaning assets gems..." + bundle config --local without "$bundle_without" + bundle clean + + # Create executables in bin/*. + # See also https://github.com/bundler/bundler/issues/6149. + bundle binstubs --force bundler puma sidekiq +} + +package() { + local destdir="$pkgdir"/$_prefix + local datadir="$pkgdir/var/lib/gitlab" + # directory creation + install -dm 755 \ + "$destdir" \ + "$datadir" \ + "$pkgdir"/etc/init.d + + + # Install application files. + rmdir "$destdir" + cp -a "$builddir" "$destdir" + + install -m755 -t "$destdir"/bin/ \ + bin/bundle \ + bin/rails \ + bin/rake \ + bin/sidekiq \ + bin/sidekiqmon \ + bin/tootctl \ + bin/puma + + cd "$destdir"/vendor/bundle/ruby/*/ + + # Remove tests, documentations and other useless files. + find gems/ \( -name 'doc' \ + -o -name 'spec' \ + -o -name 'test' \) \ + -type d -maxdepth 2 -exec rm -fr "{}" + + find gems/ \( -name 'README*' \ + -o -name 'CHANGELOG*' \ + -o -name 'CONTRIBUT*' \ + -o -name '*LICENSE*' \ + -o -name 'Rakefile' \ + -o -name '.*' \) \ + -type f -delete + + # Remove assets, they are already compiled. + rm -r gems/doorkeeper-*/app/assets + rm -r gems/pghero-*/app/assets + + # Remove build logs and cache. + rm -rf build_info/ cache/ + find extensions/ \( -name gem_make.out -o -name mkmf.log \) -delete + + cat > "$datadir"/.profile <<-EOF + export RAILS_ENV=production + export NODE_ENV=production + export EXECJS_RUNTIME=Disabled + EOF + + # Install wrapper scripts to /usr/bin. + local name; for name in rake rails tootctl; do + sed "s/__COMMAND__/$name/g" "$srcdir"/bin-wrapper.in \ + > "$builddir"/mastodon-$name + install -m755 -D "$builddir"/mastodon-$name "$pkgdir"/usr/bin/mastodon-$name + done + + # Put the config file in /etc and link to it + touch "$pkgdir"/etc/mastodon.conf + ln -s /etc/mastodon.conf "$destdir"/.env.production + ln -s /usr/bin/node "$destdir"/node + + for file in $_pkgname $_pkgname.sidekiq $_pkgname.web $_pkgname.streaming; do + install -m755 -D "$srcdir"/$file.initd "$pkgdir"/etc/init.d/$file + done + + # Removing all prebuilt artifacts + rm -R "$destdir"/node_modules/*/prebuilds 2>&1 || true + + install -m644 -D "$srcdir"/$_pkgname.logrotate \ + "$pkgdir"/etc/logrotate.d/$_pkgname +} + +assets() { + depends="" + + amove $_prefix/public/assets +} + +sha512sums=" +1fe5417136bc020a83b83eaccef7f1f46c13fc8318681f12ba556b1b6b03e25ef7b6335c28f4e6722101e97b63020cbd0d3fbacdaf9b3b5a4b73c3cf3e230813 mastodon-v4.2.10.tar.gz +d49fea9451c97ccefe5e35b68e4274aeb427f9d1e910b89c1f6c810489c3bec1ccff72952fdaef95abf944b8aff0da84a52347540d36ff1fba5ccc19e1d935c6 mastodon.initd +eefe12a31268245f802222c0001dac884e03adb0d301e53a1512a3cd204836ca03ad083908cd14d146cf0dce99e3a4366570efd0e40a9a490ccd381d4c63c32f mastodon.web.initd +8fc9249c01693bb02b8d1a6177288d5d3549addde8c03eb35cc7a32dde669171872ebc2b5deb8019dc7a12970098f1af707171fa41129be31b04e1dc1651a777 mastodon.sidekiq.initd +03433a2f58600ca0d58e7c3713df2146ccdfc92033ccfe801dbd38bac39b66d6297f2b5ca02300caa36455b484eab2caa68c912c2f72150203bfa0e106c375fc mastodon.streaming.initd +83b3bae5b6fdb4d0dbc1cbe546c62c0aa77397b97d1a5d5377af032466677de188065b556710c0d96576bbae89cc76800f1ffb8cd718155eb2784da818f27619 mastodon.logrotate +dfd0e43ac6c28387bd4aa57fd98ae41aeb5a098b6deb3e44b89f07818e2470773b025364afee7ef6fd0f664cb86bbbbe8796c9f222f5436c256a787282fbe3e1 bin-wrapper.in +" diff --git a/archives/mastodon/bin-wrapper.in b/archives/mastodon/bin-wrapper.in new file mode 100644 index 0000000..eb1d637 --- /dev/null +++ b/archives/mastodon/bin-wrapper.in @@ -0,0 +1,15 @@ + +#!/bin/sh + +BUNDLE_DIR='/usr/lib/bundles/mastodon' +export RAILS_ENV='production' +export NODE_ENV='production' +export EXECJS_RUNTIME='Disabled' + +cd $BUNDLE_DIR + +if [ "$(id -un)" != 'mastodon' ]; then + exec su mastodon -c '"$0" "$@"' -- bin/__COMMAND__ "$@" +else + exec bin/__COMMAND__ "$@" +fi diff --git a/archives/mastodon/mastodon.initd b/archives/mastodon/mastodon.initd new file mode 100644 index 0000000..1454603 --- /dev/null +++ b/archives/mastodon/mastodon.initd @@ -0,0 +1,41 @@ +#!/sbin/openrc-run + +name="Mastodon" +description="Meta script for starting/stopping all the Mastodon components" + +subservices="mastodon.sidekiq mastodon.streaming mastodon.web" + +depend() { + need redis postgresql + use net +} + +start() { + local ret=0 + + ebegin "Starting all Mastodon components" + local svc; for svc in $subservices; do + service $svc start || ret=1 + done + eend $ret +} + +stop() { + local ret=0 + + ebegin "Stopping all Mastodon components" + local svc; for svc in $subservices; do + service $svc stop || ret=1 + done + eend $ret +} + +status() { + local ret=0 + + local svc; for svc in $subservices; do + echo "$svc:" + service $svc status || ret=1 + done + eend $ret +} diff --git a/archives/mastodon/mastodon.logrotate b/archives/mastodon/mastodon.logrotate new file mode 100644 index 0000000..cbfecfc --- /dev/null +++ b/archives/mastodon/mastodon.logrotate @@ -0,0 +1,11 @@ +/var/log/mastodon/*.log { + compress + copytruncate + delaycompress + maxsize 10M + minsize 1M + missingok + sharedscripts + rotate 10 + weekly +} diff --git a/archives/mastodon/mastodon.post-install b/archives/mastodon/mastodon.post-install new file mode 100644 index 0000000..9387d45 --- /dev/null +++ b/archives/mastodon/mastodon.post-install @@ -0,0 +1,27 @@ +#!/bin/sh +set -eu + +if [ "${0##*.}" = 'post-upgrade' ]; then + cat >&2 <<-EOF + * + * To finish Mastodon upgrade run: + * + * mastodon-rails db:migrate + * + EOF +else + cat >&2 <<-EOF + * + * 1. Adjust settings in /etc/mastodon.conf + * + * 2. Create database for Mastodon: + * + * psql -c "CREATE ROLE mastodon PASSWORD 'top-secret' INHERIT LOGIN;" + * psql -c "CREATE DATABASE mastodon OWNER mastodon ENCODING 'UTF-8';" + * psql -d mastodon -c "CREATE EXTENSION pg_trgm; CREATE EXTENSION btree_gist;" + * psql -c "ALTER DATABASE name OWNER TO new_owner;" + * + * 3. Run "mastodon-rake db:migrate" + * + EOF +fi diff --git a/archives/mastodon/mastodon.post-upgrade b/archives/mastodon/mastodon.post-upgrade new file mode 120000 index 0000000..0fcc8b2 --- /dev/null +++ b/archives/mastodon/mastodon.post-upgrade @@ -0,0 +1 @@ +mastodon.post-install \ No newline at end of file diff --git a/archives/mastodon/mastodon.pre-install b/archives/mastodon/mastodon.pre-install new file mode 100644 index 0000000..c869177 --- /dev/null +++ b/archives/mastodon/mastodon.pre-install @@ -0,0 +1,54 @@ +#!/bin/sh +# It's very important to set user/group correctly. + +mastodon_dir='/var/lib/mastodon' + +if ! getent group mastodon 1>/dev/null; then + echo '* Creating group mastodon' 1>&2 + + addgroup -S mastodon +fi + +if ! id mastodon 2>/dev/null 1>&2; then + echo '* Creating user mastodon' 1>&2 + + adduser -DHS -G mastodon -h "$mastodon_dir" -s /bin/sh \ + -g "added by apk for mastodon" mastodon + passwd -u mastodon 1>/dev/null # unlock +fi + +if ! id -Gn mastodon | grep -Fq redis; then + echo '* Adding user mastodon to group redis' 1>&2 + + addgroup mastodon redis +fi + +if [ "$(id -gn mastodon)" != 'mastodon' ]; then + cat >&2 <<-EOF + !! + !! User mastodon has primary group $(id -gn mastodon). We strongly recommend to change + !! mastodon's primary group to mastodon. + !! + EOF + + # Add it at least as a supplementary group. + adduser mastodon mastodon +fi + +user_home="$(getent passwd mastodon | cut -d: -f6)" + +if [ "$user_home" != "$mastodon_dir" ]; then + cat >&2 <<-EOF + !! + !! User mastodon has home directory in $user_home, but this package assumes + !! $mastodon_dir. Although it's possible to use a different directory, + !! it's really not easy. + !! + !! Please change mastodon's home directory to $mastodon_dir, or adjust settings + !! and move files yourself. Otherwise Mastodon will not work! + !! + EOF +fi + +exit 0 + diff --git a/archives/mastodon/mastodon.sidekiq.initd b/archives/mastodon/mastodon.sidekiq.initd new file mode 100644 index 0000000..98c0377 --- /dev/null +++ b/archives/mastodon/mastodon.sidekiq.initd @@ -0,0 +1,32 @@ +#!/sbin/openrc-run + +name="Mastodon background workers Service" +root="/usr/lib/bundles/mastodon" +pidfile="/run/mastodon-sidekiq.pid" +logfile="/var/log/mastodon/sidekiq.log" + +depend() { + use net + need redis +} + +start() { + ebegin "Starting Mastodon background workers" + + cd $root + + start-stop-daemon --start --background \ + --chdir "${root}" \ + --user="mastodon" \ + --make-pidfile --pidfile="${pidfile}" \ + -1 "${logfile}" -2 "${logfile}" \ + --exec /usr/bin/env -- RAILS_ENV=production DB_POOL=25 MALLOC_ARENA_MAX=2 bundle exec sidekiq -c 25 + eend $? +} + +stop() { + ebegin "Stopping Mastodon background workers" + start-stop-daemon --stop \ + --pidfile=${pidfile} \ + eend $? +} diff --git a/archives/mastodon/mastodon.streaming.initd b/archives/mastodon/mastodon.streaming.initd new file mode 100644 index 0000000..b41adc2 --- /dev/null +++ b/archives/mastodon/mastodon.streaming.initd @@ -0,0 +1,33 @@ +#!/sbin/openrc-run + +name="Mastodon streaming API service" +root="/usr/lib/bundles/mastodon" +pidfile="/run/mastodon-streaming.pid" +logfile="/var/log/mastodon/streaming.log" + +depend() { + use net +} + +start() { + ebegin "Starting Mastodon streaming API" + + cd $root + + start-stop-daemon --start \ + --background --quiet \ + --chdir "${root}" \ + --user="mastodon" \ + --make-pidfile --pidfile="${pidfile}" \ + --stdout "${logfile}" --stderr "${logfile}" \ + --exec /usr/bin/env -- NODE_ENV=production PORT=4000 /usr/bin/node ./streaming/index.js + eend $? +} + +stop() { + ebegin "Stopping Mastodon streaming API" + start-stop-daemon --stop \ + --pidfile="${pidfile}" \ + eend $? +} + diff --git a/archives/mastodon/mastodon.web.initd b/archives/mastodon/mastodon.web.initd new file mode 100644 index 0000000..42eace6 --- /dev/null +++ b/archives/mastodon/mastodon.web.initd @@ -0,0 +1,29 @@ +#!/sbin/openrc-run + +name="Mastodon Web Service" +root="/usr/lib/bundles/mastodon" +pidfile="/run/mastodon-web.pid" +logfile="/var/log/mastodon/web.log" + +depend() { + use net +} + +start() { + ebegin "Starting Mastodon web workers" + cd $root + start-stop-daemon --start --background \ + --chdir "${root}" \ + --user="mastodon" \ + --pidfile="${pidfile}" --make-pidfile \ + --stdout="${logfile}" --stderr="${logfile}" \ + --exec /usr/bin/env -- RAILS_ENV=production PORT=3000 bundle exec puma -C config/puma.rb + eend $? +} + +stop() { + ebegin "Stopping Mastodon web workers" + start-stop-daemon --stop \ + --pidfile=${pidfile} \ + eend $? +}