From 734e0304b640b8919bb7a546276158da56d24576 Mon Sep 17 00:00:00 2001 From: Dominic Reich Date: Sat, 25 Mar 2023 20:09:37 +0000 Subject: [PATCH] adds README.md --- README.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ admin.png | Bin 0 -> 14056 bytes 2 files changed, 145 insertions(+) create mode 100644 README.md create mode 100644 admin.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..b90b0fc --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# mastodon-styles + +Some styles for a mastodon server. + +Should work on the root path of your mastodon instance. (/home/mastodon/live). + +## My instance + +I had a single-user instance running for about 4 months and I shut it down on +March 25 2023 because of different reasons. + +I've been testing and playing around with that mastodon software but I only used +version 4.0.2 (I think) up to 4.1.1. Upgrades went very well, just read the release +docs. + +I moved servers two times, first time only geographically but second time I went +to use a server with a smaller configuration setup (ram, harddisk size). This is +not something you do in your webinterface, you gonna move the files and database +by hand (an upgrade of harddisk size and RAM would be much easier on VPS systems). + +Finally, I'd like to show you some stats and maybe some useful information. + +### Some statistics + +for a single user instance with 4 relais (1 of them was only ham radio related, so +the traffic on that one was very low). The other three relais made sidekiq to work +~8x more than before the relais. + +```console +$ bin/tootctl media usage +Attachments: 16.1 GB (1.94 MB local) +Custom emoji: 87.2 MB (450 KB local) +Preview cards: 1.02 GB +Avatars: 2.3 GB (48.5 KB local) +Headers: 5.33 GB (429 KB local) +Backups: 0 Bytes +Imports: 0 Bytes +Settings: 0 Bytes +``` + +![admin dashboard showing usage](admin.png) + +### (Hopefully) helpful snippets + +#### clear media files + + + +```bash +#!/bin/bash +export PATH="$HOME/.rbenv/bin:$PATH" +eval "$(rbenv init -)" +export RAILS_ENV=production + +exec > /home/mastodon/live/log/prune.log 2>&1 + +/home/mastodon/live/bin/tootctl statuses remove +/home/mastodon/live/bin/tootctl media remove --days=5 +/home/mastodon/live/bin/tootctl media remove --prune-profiles --days=60 +/home/mastodon/live/bin/tootctl preview_cards remove --days=15 +/home/mastodon/live/bin/tootctl media remove-orphans +/home/mastodon/live/bin/tootctl cache clear +/home/mastodon/live/bin/tootctl media usage +date +``` + +#### profile pics + + + +```bash +#!/usr/bin/env bash +# Kept only the accounts compression and jpeg optimization + +cd /home/mastodon/live/public/system/cache +find -name '*.jpg' -print0 | xargs -0 jpegoptim --verbose --preserve --threshold=1 --max=45 +find -name '*.jpeg' -print0 | xargs -0 jpegoptim --verbose --preserve --threshold=1 --max=45 + +cd /home/mastodon/live/public/system/cache/accounts +find -name '*.png' -print0 | xargs -0 pngquant --verbose --ext=.png --force --speed 10 --quality 45-50 --skip-if-larger +``` + +#### managing media in rails console + + + +There are several scripts executable with `RAILS_ENV=production bundle exec rails c`, +for convenience laid out here with minor corrections. **Do not execute these +without understanding what they do!**: + +Deleting all cached media attachments from external servers to allow web app +to refetch them when they are queried. At least on my instance this is reaaally +slow, takes tens of seconds per attachment (is this the same as tootctl media +remove?): + +```ruby +MediaAttachment.cached.where.not(remote_url: '').each do |attachment| + attachment.file.destroy + attachment.thumbnail.destroy + attachment.save +end +``` + +Deleting and redownloading all cached remote emojis. This apparently has a +problem that the local URLs for the cached emojis change, and the URLs aren't +updated to the fetched profile headers. I suppose this should be done before +the next steps, assuming the cached local emoji URLs are set up correctly to +the profile headers and names at the time of fetching. This doesn't seem to +work though, maybe tootctl emoji purge --remote-only would be better: + +```ruby +CustomEmoji.remote.where.not(image_file_name: nil).where.not(image_remote_url: '').each do |emoji| + emoji.image.destroy + emoji.image.save + emoji.download_image! +end +``` + +Deleting all remote profile avatars, and refetching them. Are these two the +same as tootctl accounts refresh --all?: + +```ruby +Account.remote.where.not(avatar_file_name: nil).where.not(avatar_remote_url: '').each do |a| + a.avatar.destroy + a.save + a.download_avatar! +end +``` + +Deleting all remote profile headers, and refetching them. Hopefully this +uses/updates the newly fetched local cached emoji URLs, and also includes the +profile name as they often contain emojis: + +```ruby +Account.remote.where.not(header_file_name: nil).where.not(header_remote_url: '').each do |a| + a.header.destroy + a.save + a.download_header! +end +``` + +It would be awesome to get tooling for these to tootctl. That said, I'm not +entirely sure if destroying the entities is necessary before downloading them +again, and perhaps we could use remove_entity_cache instead. I'm not very well +acquainted with the codebase. diff --git a/admin.png b/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..02834a2b827618c52d22238a3fc9fce7dd960405 GIT binary patch literal 14056 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