From my notes, and a bit as a funny as our cat is named Pip.

apt-get update && apt-get -y upgrade && apt-get install python-pip && pip install --upgrade pip
![]()
Failed and working projects, notes etc.
From my notes, and a bit as a funny as our cat is named Pip.

apt-get update && apt-get -y upgrade && apt-get install python-pip && pip install --upgrade pip
![]()
sudo systemctl set-default multi-user.targetsudo systemctl set-default graphical.targetsudo systemctl isolate multi-user.targetsudo systemctl isolate graphical.targetStarting a virtual terminal: Press Ctrl+Alt+F2
To return: Press Ctrl+Alt+F1 or Ctrl+Alt+F7
![]()
Update for bot blocker as mentioned here: https://3xn.nl/projects/2023/09/20/crude-solution-to-ban-bots-by-their-user-agent/
My website is still being kicked around sometimes, but I’m winning D:
'ubermetrics-technologies', 'seokicks', 'ClaudeBot', 'serpstatbot', 'Barkrowler', 'YisouSpider', 'babbar.tech', 'AwarioBot', 'bytespider', 'amazonbot', 'MJ12bot', 'YandexBot', 'SemrushBot', 'dotbot', 'AspiegelBot', 'DataForSeoBot', 'DotBot', 'Pinterestbot', 'PetalBot', 'HeadlessChrome', 'GPTBot', 'Sogou', 'ALittle Client', 'fidget-spinner-bot', 'intelx.io_bot', 'Mediatoolkitbot', 'BLEXBot', 'AhrefsBot'
![]()
White : OUT
Red: VCC
Blue/Black: Wire mantle. Not sure if this was required, but I copied the initial setup, just to be sure. It looks a bit sloppy, but it works in the new situation and that’s all that mattered in this case.
Old situation:

New situation:

![]()
Updated on 26-08-2024. For the old version, click here.
Contents:
1. UPDATE
2. RUBY VERSION ISSUES
3. RUBY GEM ISSUES
4. CHARLOC_HOLMES GEM ISSUES
So a new release came out and it is important to get this update as soon as possible! This manual is a transcript of the way that I have updated my Mastodon instance. Please make sure you make proper backups and use your brain while updating things.
A guide to making a Mastodon backup can be found here.
Linux flavour: Debian
Update from: 4.2.xx
su - mastodon
cd /home/mastodon/live
git fetch --tags
git checkout v4.2.10
yarn install
RAILS_ENV=production bundle exec rails db:migrate #NOTE: You might get a ruby error which then suggests you to enter the command "bundle install". Do that and then run the RAILS command again.
RAILS_ENV=production bundle exec rails assets:precompile
exit
OPTIONAL:
After updating, you might get a notification to update the browserlist database. You can do that with the following command:
npx update-browserslist-db@latest
Okay, you can now choose to either reboot or restart the services.
REBOOT:
systemctl reboot
RESTART:
systemctl restart mastodon-sidekiq systemctl reload mastodon-web
Optional:
systemctl restart mastodon-streaming
My system was unable to find the required v3.2.3 of Ruby and I have fixed this by doing the following steps:
git -C ~/.rbenv/plugins/ruby-build pull
rbenv install 3.2.3
*WAIT TILL DONE* (it may take a little while)
rbenv versions
rbenv global 3.2.3
rbenv versions
This manual is a transcript of the way that I have updated my Mastodon instance. Please make sure you make proper backups and use your brain while updating things.
Sources: https://richstone.io/where-is-ruby-3-0-0-on-rbenv/
After entering…
RAILS_ENV=production bundle exec rails db:migrate
…you might get a ruby gem error like:
Could not find rexml-3.3.5, strscan-3.1.0 in locally installed gems Run `bundle install` to install missing gems.
Enter the command “bundle install” and after that run the RAILS command again.
The charlock_holmes gem may fail to build on some systems with recent versions of gcc. If you run into such an issue, try
BUNDLE_BUILD__CHARLOCK_HOLMES="--with-cxxflags=-std=c++17" bundle install.
![]()
It can happen that your TeamViewer instance is not starting any more after switching over to the new interface or that you really do not like the new looks of the new interface.
Computer\HKEY_CURRENT_USER\Software\TeamViewer
Done.
![]()
From Heston Blumenthal’s In Search of Perfection, Season 1, Episode 4 named “Fish and Chips”.
Enjoy!
![]()
Original post: https://3xn.nl/projects/2023/09/20/crude-solution-to-ban-bots-by-their-user-agent/
I’ve very much simplified the script that instantly redirects unwanted traffic away from the server. Currently, I am using a very cheap VPS to receive all that traffic.
Here ya go:
<?php
// CC-BY-NC (2023)
// Author: FoxSan - fox@cytag.nl
// This is a functional but dirty hack to block bots, spiders and indexers by looking at the HTTP USER AGENT.
// Traffic that meets the conditions is being yeeted away to any place of your choice.
//////////////////////////////////////////////////////////////
// Emergency bypass
// goto end;
//////////////////////////////////////////////////////////////
// attempt to basically just yeet all bots to another website
$targetURL = "https://DOMAIN.TLD/SUB/";
// Function to check if the user agent appears to be a bot or spider
function isBot()
{
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$bot_keywords = ['bytespider', 'amazonbot', 'MJ12bot', 'YandexBot', 'SemrushBot', 'dotbot', 'AspiegelBot', 'DataForSeoBot', 'DotBot', 'Pinterestbot', 'PetalBot', 'HeadlessChrome', 'GPTBot', 'Sogou', 'ALittle Client', 'fidget-spinner-bot', 'intelx.io_bot', 'Mediatoolkitbot', 'BLEXBot', 'AhrefsBot'];
foreach ($bot_keywords as $keyword) {
if (stripos($user_agent, $keyword) !== false) {
return true;
}
}
return false;
}
// Check if the visitor is a bot or spider
if (isBot()) {
// yeet
header("Location: $targetURL");
// Exit to prevent further processing
exit;
}
end:
// If the visitor is not a bot, spider, or crawler, continue with your website code.
//////////////////////////////////////////////////////////////////////
?>
![]()
Here’s a list of stuff that I have in my .htaccess files on various websites.
I want to work on my website, but any other visitor should be booted to another website so I can work in peace. Sidenote: It's forever since I last used this, so it might work. Or not.
---
# YOUR IP address goes here:
RewriteCond %{REMOTE_ADDR} !^000\.000\.000\.000$
# And provides you access to:
RewriteCond %{REQUEST_URI} !^https://DOMAIN.TLD$ [NC]
# Fine, go have all the media as well
RewriteCond %{REQUEST_URI} !\.(jpg|jpeg|png|gif|svg|swf|css|ico|js)$ [NC]
# Any other visitor can go visit the following website:
RewriteRule .* https://DOMAIN.TLD/ [R=302,L]
# Hey, no viewing access to this file <FilesMatch "^.ht"> Order deny,allow Deny from all </FilesMatch>
# Disable Server Signature ServerSignature Off
# SSL all the things!
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# No WWW
RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.TLD$
RewriteRule ^/?$ "https\:\/\/DOMAIN\.TLD\/" [R=301,L]
# Do we like Symlinks? Yeah we do. Options +FollowSymlinks
# No open directories or directory listings. What is this... 1998? Options All -Indexes IndexIgnore *
# Rewrite rules to block out some common exploits.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]
# PHP doohickies php_flag register_globals off php_flag safe_mode off php_flag allow_url_fopen off php_flag display_errors off php_value session.save_path '/tmp' php_value disable_functions "exec,passthru,shell_exec,system,curl_multi_exec,show_source,eval"
# File Injection Protection, or a code-condom. What.
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]
# /proc/self/environ? Go away!
RewriteCond %{QUERY_STRING} proc/self/environ [NC,OR]
# Disallow Access To Sensitive Files. Enter your own file names. RewriteRule ^(htaccess.txt|configuration.php(-dist)?|joomla.xml|README.txt|web.config.txt|CONTRIBUTING.md|phpunit.xml.dist|plugin_googlemap2_proxy.php)$ - [F]
# Don't allow any pages to be framed - Defends against CSRF <IfModule mod_headers.c> Header set X-Frame-Options SAMEORIGIN </IfModule>
# Disallow Php Easter Eggs
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC]
RewriteRule .* index.php [F]
# Libwww-perl Access Block
RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
RewriteRule .* ? [F,L]
# Uh. I forgot. <IfModule mod_autoindex.c> IndexIgnore * </IfModule>
# NO SNIFFYWIFFY OwO <IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" </IfModule>
# NEEDS TESTING # Turn on IE8-IE9 XSS prevention tools #Header set X-XSS-Protection "1; mode=block"
# NEEDS TESTING TOO # Only allow JavaScript from the same domain to be run. # Don't allow inline JavaScript to run. #Header set X-Content-Security-Policy "allow 'self';"
# Example if you don't like Russia and Turkey (Optional A1 is to block anonymous proxies)
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(RU|TR)$
RewriteRule .* https://DOMAIN.TLD/directorywithindexdothtml/ [R=302,L]
# Caching stuff <FilesMatch "\.(ico|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "public, max-age=3600" </FilesMatch>
# Compress text, html, javascript, css, xml! <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf AddOutputFilterByType DEFLATE font/truetype font/opentype </IfModule>
# Joomla! core SEF Section.
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
# PHP TWEAKS php_value upload_max_filesize 200M php_value post_max_size 200M php_value max_input_vars 2000 php_value max_execution_time 120 php_value memory_limit 1024M
## BEGIN EXPIRES CACHING <IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 month" ExpiresByType text/cache-manifest "access plus 0 seconds" ExpiresByType text/html "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/rss+xml "access plus 1 hour" ExpiresByType application/atom+xml "access plus 1 hour" ExpiresByType image/x-icon "access plus 1 week" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType audio/ogg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/webm "access plus 1 month" ExpiresByType text/x-component "access plus 1 month" ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" ExpiresByType text/css "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" <IfModule mod_headers.c> Header append Cache-Control "public" </IfModule> </IfModule> ## END EXPIRES CACHING
![]()
There is a very small difference between the two Git branches, so pay attention.
su - mastodon
Edit if your Mastodon instance is v4.1.x
nano live/app/javascript/mastodon/features/compose/components/compose_form.js
Edit if your Mastodon instance is v4.2.x
nano live/app/javascript/mastodon/features/compose/components/compose_form.jsx
In this file, you will find the number “500” twice. Replace that number with your desired character limit and save the file.
nano live/app/validators/status_length_validator.rb
In this file, you will find the number “500” once. Replace that number with your desired character limit and save the file.
nano live/app/serializers/rest/instance_serializer.rb
FIND the line that reads:
:languages, :registrations,
ADD the following to that line:
:max_toot_chars
Pay attention if a comma is used at the end or not.
Scroll down to the end of the file until you reach the “private” section.
ADD
def max_toot_chars [the number of your desired character limit without the brackets] end
EXAMPLE
def max_toot_chars 5000 end
Go back to the live directory and enter the following commands, one by one:
RAILS_ENV=production bundle exec rails assets:precompile exit systemctl restart mastodon-sidekiq systemctl reload mastodon-web [OPTIONAL] systemctl restart mastodon-streaming
Done.
![]()