Skip Navigation

User banner

Admiral Patrick

@ ptz @dubvee.org

Posts
227
Comments
1895
Joined
3 yr. ago

I learned to play the guitar growing up as a young rapscallion in Mississippi. But things didn't really take off until I moved to Memphis. There I met the Colonel and the hits just kept coming. Unfortunately, the fame went to my head, I gained a lot of weight, started wearing a white jumpsuit, and ate tranquilizers like they were trail mix. Then, in 1977, I died on the toilet.

Or did I?


I also develop Tesseract UI for Lemmy/Sublinks

  • You mean like if there's a community called !cats@example.com and your home instance no longer federates with the instance example.com?

    If so, I'll add that to Tesseract as it sounds useful.

  • Deleted

    Permanently Deleted

    Jump
  • Two in the same vein:

    1. Someone once assumed that I used a code prettier by asking for my .prettierrc. Nope. I just write pretty code and was legit offended at that.
    2. Multiple times I've been called an AI because I (checks notes) write out my thoughts in full sentences.

    There's been worse, but I'm quick to block, and I don't dwell on things. It's actually pretty easy when you step back and think about the kind of person who would go online make personal attacks like that. Once you have that mental image, you quickly realize you don't give a flying fuck what that person has to say about anything.

  • In my city, they just keep paving over the old asphalt, so the manhole covers are like 6 inches deep in some places. Hitting one of those in my sedan is not pleasant.

  • If it was a kitchen outlet, it may have been a 20A (2400 watt) circuit. Still, a kettle and space heater at the same time would still have been stressing that.

    Did it show you the combined wattage or max out at 1800?

  • I do!

    Kubernetes is a nightmare and overkill for most things we need to run, and Docker Swarm is super easy to setup and maintain.

    We only use it for one application, though. The app needs to scale horizontally and scale up and down with demand, so I put together a 6 node swarm cluster just for it. Works great, though the auto scaling required some helper scripting.

  • The thing about these deprecated tools is that the replacements either suck, are too convoluted, don't give you the same info, or are overly verbose/obtuse.

    ifconfig gave you the most relevant information for the network interfaces almost like a dashboard: IP, MAC address, link status, TX/RX packet counts and errors, etc. You can get that with ip but you've got to add a bunch of arguments, make multiple calls with different arguments, and it's still not quite what ifconfig was.

    Similarly, iwconfig gave you that same "dashboard" like information for your wireless adapters. I use iw to configure but iwconfig was my go-to for viewing useful information about it. Don't get me started on how much I hate iw's syntax and verbosity.

    They can pry scp out of my cold dead hands.

    At least nftables is syntax-compatible.

  • 1080p buffered generously but it worked :) The sweet spot was having it transcode to 720p (yay hardware acceleration). I wasn't sharing it with anyone at the time, so it was just me watching at work on one phone while using my second phone at home for internet.

  • Just about anything as long as you don't need to serve it to hundreds of people simultaneously. Hell, I once hosted Jellyfin over a 3G hotpot and it managed.

    Pretty much any web-based app will work fine. Streaming servers (Emby, Plex, Jellyfin, etc) work fine for a few simultaneous people as long as you're not trying to push 4K or something. 1080p can work fine at 4 Mbps or less (transcoding is your friend here). Chat servers (Matrix, XMPP, etc) are also a good candidate.

    I hosted everything I wanted with 30 Mbps upload before I got symmetric fiber.

  • Maybe I should flesh it out into an actual guide. The Nepenthes docs are "meh" at best and completely gloss over integrating it into your stack.

    You'll also need to give it corpus text to generate slop from. I used transcripts from 4 or 5 weird episodes of Voyager (let's be honest: shit got weird on Voyager lol), mixed with some Jack Handy quotes and a few transcripts of Married...with Children episodes.

    https://content.dubvee.org/ is where that bot traffic lands up if you want to see what I'm feeding them.

  • Thanks!

    Mostly there's three steps involved:

    1. Setup Nepenthes to receive the traffic
    2. Perform bot detection on inbound requests (I use a regex list and one is provided below)
    3. Configure traffic rules in your load balancer / reverse proxy to send the detected bot traffic to Nepenthes instead of the actual backend for the service(s) you run.

    Here's a rough guide I commented a while back: https://dubvee.org/comment/5198738

    Here's the post link at lemmy.world which should have that comment visible: https://lemmy.world/post/40374746

    You'll have to resolve my comment link on your instance since my instance is set to private now, but in case that doesn't work, here's the text of it:

    So, I set this up recently and agree with all of your points about the actual integration being glossed over.

    I already had bot detection setup in my Nginx config, so adding Nepenthes was just changing the behavior of that. Previously, I had just returned either 404 or 444 to those requests but now it redirects them to Nepenthes.

    Rather than trying to do rewrites and pretend the Nepenthes content is under my app's URL namespace, I just do a redirect which the bot crawlers tend to follow just fine.

    There's several parts to this to keep my config sane. Each of those are in include files.

    • An include file that looks at the user agent, compares it to a list of bot UA regexes, and sets a variable to either 0 or 1. By itself, that include file doesn't do anything more than set that variable. This allows me to have it as a global config without having it apply to every virtual host.
    • An include file that performs the action if a variable is set to true. This has to be included in the server portion of each virtual host where I want the bot traffic to go to Nepenthes. If this isn't included in a virtual host's server block, then bot traffic is allowed.
    • A virtual host where the Nepenthes content is presented. I run a subdomain (content.mydomain.xyz). You could also do this as a path off of your protected domain, but this works for me and keeps my already complex config from getting any worse. Plus, it was easier to integrate into my existing bot config. Had I not already had that, I would have run it off of a path (and may go back and do that when I have time to mess with it again).

    The map-bot-user-agents.conf is included in the http section of Nginx and applies to all virtual hosts. You can either include this in the main nginx.conf or at the top (above the server section) in your individual virtual host config file(s).

    The deny-disallowed.conf is included individually in each virtual hosts's server section. Even though the bot detection is global, if the virtual host's server section does not include the action file, then nothing is done.

    Files

    Note that I'm treating Google's crawler the same as an AI bot because....well, it is. They're abusing their search position by double-dipping on the crawler so you can't opt out of being crawled for AI training without also preventing it from crawling you for search engine indexing. Depending on your needs, you may need to comment that out. I've also commented out the Python requests user agent. And forgive the mess at the bottom of the file. I inherited the seed list of user agents and haven't cleaned up that massive regex one-liner.

     nginx
        
    # Map bot user agents
    ## Sets the $ua_disallowed variable to 0 or 1 depending on the user agent. Non-bot UAs are 0, bots are 1
    
    map $http_user_agent $ua_disallowed {
        default 		0;
        "~PerplexityBot"	1;
        "~PetalBot"		1;
        "~applebot"		1;
        "~compatible; zot"	1;
        "~Meta"		1;
        "~SurdotlyBot"	1;
        "~zgrab"		1;
        "~OAI-SearchBot"	1;
        "~Protopage"	1;
        "~Google-Test"	1;
        "~BacklinksExtendedBot" 1;
        "~microsoft-for-startups" 1;
        "~CCBot"		1;
        "~ClaudeBot"	1;
        "~VelenPublicWebCrawler"	1;
        "~WellKnownBot"	1;
        #"~python-requests"	1;
        "~bitdiscovery"	1;
        "~bingbot"		1;
        "~SemrushBot" 	1;
        "~Bytespider" 	1;
        "~AhrefsBot" 	1;
        "~AwarioBot"	1;
    #    "~Poduptime" 	1;
        "~GPTBot" 		1;
        "~DotBot"	 	1;
        "~ImagesiftBot"	1;
        "~Amazonbot"	1;
        "~GuzzleHttp" 	1;
        "~DataForSeoBot" 	1;
        "~StractBot"	1;
        "~Googlebot"	1;
        "~Barkrowler"	1;
        "~SeznamBot"	1;
        "~FriendlyCrawler"	1;
        "~facebookexternalhit" 1;
        "~*(?i)(80legs|360Spider|Aboundex|Abonti|Acunetix|^AIBOT|^Alexibot|Alligator|AllSubmitter|Apexoo|^asterias|^attach|^BackDoorBot|^BackStreet|^BackWeb|Badass|Bandit|Baid|Baiduspider|^BatchFTP|^Bigfoot|^Black.Hole|^BlackWidow|BlackWidow|^BlowFish|Blow|^BotALot|Buddy|^BuiltBotTough|
    ^Bullseye|^BunnySlippers|BBBike|^Cegbfeieh|^CheeseBot|^CherryPicker|^ChinaClaw|^Cogentbot|CPython|Collector|cognitiveseo|Copier|^CopyRightCheck|^cosmos|^Crescent|CSHttp|^Custo|^Demon|^Devil|^DISCo|^DIIbot|discobot|^DittoSpyder|Download.Demon|Download.Devil|Download.Wonder|^dragonfl
    y|^Drip|^eCatch|^EasyDL|^ebingbong|^EirGrabber|^EmailCollector|^EmailSiphon|^EmailWolf|^EroCrawler|^Exabot|^Express|Extractor|^EyeNetIE|FHscan|^FHscan|^flunky|^Foobot|^FrontPage|GalaxyBot|^gotit|Grabber|^GrabNet|^Grafula|^Harvest|^HEADMasterSEO|^hloader|^HMView|^HTTrack|httrack|HTT
    rack|htmlparser|^humanlinks|^IlseBot|Image.Stripper|Image.Sucker|imagefetch|^InfoNaviRobot|^InfoTekies|^Intelliseek|^InterGET|^Iria|^Jakarta|^JennyBot|^JetCar|JikeSpider|^JOC|^JustView|^Jyxobot|^Kenjin.Spider|^Keyword.Density|libwww|^larbin|LeechFTP|LeechGet|^LexiBot|^lftp|^libWeb|
    ^likse|^LinkextractorPro|^LinkScan|^LNSpiderguy|^LinkWalker|msnbot|MSIECrawler|MJ12bot|MegaIndex|^Magnet|^Mag-Net|^MarkWatch|Mass.Downloader|masscan|^Mata.Hari|^Memo|^MIIxpc|^NAMEPROTECT|^Navroad|^NearSite|^NetAnts|^Netcraft|^NetMechanic|^NetSpider|^NetZIP|^NextGenSearchBot|^NICErs
    PRO|^niki-bot|^NimbleCrawler|^Nimbostratus-Bot|^Ninja|^Nmap|nmap|^NPbot|Offline.Explorer|Offline.Navigator|OpenLinkProfiler|^Octopus|^Openfind|^OutfoxBot|Pixray|probethenet|proximic|^PageGrabber|^pavuk|^pcBrowser|^Pockey|^ProPowerBot|^ProWebWalker|^psbot|^Pump|python-requests\/|^Qu
    eryN.Metasearch|^RealDownload|Reaper|^Reaper|^Ripper|Ripper|Recorder|^ReGet|^RepoMonkey|^RMA|scanbot|SEOkicks-Robot|seoscanners|^Stripper|^Sucker|Siphon|Siteimprove|^SiteSnagger|SiteSucker|^SlySearch|^SmartDownload|^Snake|^Snapbot|^Snoopy|Sosospider|^sogou|spbot|^SpaceBison|^spanne
    r|^SpankBot|Spinn4r|^Sqworm|Sqworm|Stripper|Sucker|^SuperBot|SuperHTTP|^SuperHTTP|^Surfbot|^suzuran|^Szukacz|^tAkeOut|^Teleport|^Telesoft|^TurnitinBot|^The.Intraformant|^TheNomad|^TightTwatBot|^Titan|^True_Robot|^turingos|^TurnitinBot|^URLy.Warning|^Vacuum|^VCI|VidibleScraper|^Void
    EYE|^WebAuto|^WebBandit|^WebCopier|^WebEnhancer|^WebFetch|^Web.Image.Collector|^WebLeacher|^WebmasterWorldForumBot|WebPix|^WebReaper|^WebSauger|Website.eXtractor|^Webster|WebShag|^WebStripper|WebSucker|^WebWhacker|^WebZIP|Whack|Whacker|^Widow|Widow|WinHTTrack|^WISENutbot|WWWOFFLE|^
    WWWOFFLE|^WWW-Collector-E|^Xaldon|^Xenu|^Zade|^Zeus|ZmEu|^Zyborg|SemrushBot|^WebFuck|^MJ12bot|^majestic12|^WallpapersHD)" 1;
    
    }
    
    
      

     nginx
        
    # Deny disallowed user agents
    if ($ua_disallowed) { 
        # This redirects them to the Nepenthes domain. So far, pretty much all the bot crawlers have been happy to accept the redirect and crawl the tarpit continuously 
    	return 301 https://content.mydomain.xyz/;
    }
    
      

  • I was blocking them but decided to shunt their traffic to Nepenthes instead. There's usually 3-4 different bots thrashing around in there at any given time.

    If you have the resources, I highly recommend it.

  • Most of the requirements are going to be for the database, and that depends on:

    1. How many active users you expect
    2. How many large rooms you or your users join

    I left many of the large Matrix spaces I was in, and mine is now mostly just 1:1 chats or a group chat with a handful of friends. Given that low-usage case, I can run my server on a Pi 3 with 4 GB of RAM quite comfortably. I don't do that in practice, but I do have that setup as a backup server - it periodically syncs the database from my main server - and works fine. The bottleneck there, really, is the SD card storage since I didn't want an external SSD hanging off of it.

    Even when I was active in several large Matrix spaces/rooms, a USFF Optiplex with a quad core i5, 8 GB of RAM, and a 500GB SSD was more than enough to run it comfortably alongside some other services like LibreTranslate.

  • Ok, I'll bite: What MUD, and does it still exist?

    I used to play AVATAR MUD back in the day and, surprisingly, it's still online and has active users/quests as of this writing.

  • I disabled local thumbnail generation almost a year ago, and things mostly work the same.

    Instead of a local thumbnail image URL for things like news articles that get posted, it will be the direct URL value from the og:image metadata from the source. Usually those load fine, but sometimes they don't due to CORS settings on their side. Probably only 1-2% of posts have issues, though.

    For image posts that come in via federation, (memes, pics, etc), the thumbnail image URL is the same as the post URL. In other words, you're loading the full res version in the feed. Since I use a web client that has "card view", this actually works out better, visually. YMMV whether that's a drawback for you.

    The only pitfall is that you will lose thumbnails for image posts if an instance goes offline or shuts down.

    I'm sure that does increase load slightly on other instances, but no more than if the remote instance had image proxying turned on. And the full-res version always has to load from the remote instance (even if you have local thumbnail generation enabled). All in all, I'd say the additional load is acceptable given the benefits of disabling local thumbnail generation.

    To mitigate that, in my case anyway, I have my own image proxy/cache in place. My default UI is Tesseract and it's configured with the image proxy/cache on by default.. (I think I saw that Photon is also working on something similar). In this configuration, the first person to scroll past a remote image fetches it directly (via the proxy/cache) and it's now available locally in the cache for everyone else (unless they're connecting with a different client that doesn't use Tesseract's proxy). Granted, I shutdown my instance last year and it's just now a private testbed for development, but when I did have daily active users (plural), the proxy cache helped.

    Now the only images my instance stores are ones that are uploaded locally.

    Why did I disable local thumbnails?

    • I closed up my instance and didn't want potentially problematic thumbnails being generated while I wasn't actively modding it
    • Generated thumbnails go in, but they don't go out. There's no way to clean them up later other than the ephemerally generated ones (if someone requests a version in a custom size, for example)
    • Increasing storage costs. Like, I'd be scrolling the feed and see some of the dumbest shitposts while constantly thinking "Ugh, this is costing me money to store a copy".

  • Oh, you're right. It does work after updating. I was on 2025.12.08 which was the latest the last time I messed with it around that same time and saw that the SABR bug had been open since March of 2025. Still open so that was what I had been watching.

    The 2026.02.04 build worked fine.

    Still gonna keep my PT instance lol.

  • Huh. I'm on the latest release and every video I download fails with the SABR notice and link to the issue for it. Maybe it's regional?

  • I used to just yt-dlp any YT video links people share, but that doesn't work anymore and no ETA on a fix.

    My new favorite thing is my PeerTube instance. yt-dlp is basically broken for almost all YT videos now since it doesn't yet support SABR, and most videos are forcing that now. Peertube's importer seems to have no problem with it, so that's where I am.

    Someone shares a YT link? Copy, paste into Peertube, wait like 30 seconds for the transcode, and watch. No BS. And if I want to watch it later? Well, there it already is.

    Edit: It appears the wonderful people maintaining yt-dlp have fixed that since I last tried back in December.

  • FYI: I moved the allow rule for DNS to the top of the chain, so that should fix problems with DNS providers not being able to reach the authoritative name servers.

  • Ugh. Thanks. It's quite possible, though maybe just a regional one? I did inadvertently block one of the IPs Let's Encrypt uses for secondary validation, so this may be another case of that.

    I get a shitload of bad traffic from the southeast Asia area (mostly Philippines/Singapore AWS) and have taken to blanket blocking their whole routes rather than constantly playing whack-a-mole. Fail2ban only goes so far for case-by-case.

    Here's the image from the meme from an alternate source:

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    When I have family over for Thanksgiving, it often do be like this:

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    T'Pol DGAF about your Risian vacation

  • memes @lemmy.world

    Me when I put vitamin gummies in my vodka

  • Technology @lemmy.world

    Put your usernames and passwords in your will, Japan advises

    www.theregister.com /2024/11/21/japan_digital_end_of_life/
  • Today I Learned @lemmy.world

    TIL About Perpetual Stew

    en.wikipedia.org /wiki/Perpetual_stew
  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    Pretty much every Trip / Mayweather interaction in early season 1...

  • Technology @lemmy.world

    The 'morphing' wheel from South Korea that may transform lives and robots

    www.reuters.com /technology/morphing-wheel-south-korea-that-may-transform-lives-robots-2024-11-14/
  • politics @lemmy.world

    Public Trust in Scientists and Views on Their Role in Policymaking

    www.pewresearch.org /science/2024/11/14/public-trust-in-scientists-and-views-on-their-role-in-policymaking/
  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    Worst Transporter Accident in Federation History

  • Technology @lemmy.world

    Mods: The Community Icon and Banner are Both Broken

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    My "7 Stages of Mariner" This Week

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    Your Vote Matters

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    Bev ain't no slacker.

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    This could be us, but you playin' got out and voted today.

  • politics @lemmy.world

    Donald Trump’s Hatred of Free Speech

    www.theatlantic.com /politics/archive/2024/11/donald-trump-hates-free-speech/680515/
  • Science Memes @mander.xyz

    "This is the last class before winter break. How can you expect us to concentrate?"

  • memes @lemmy.world

    I mean, I'm glad we're growing here, but...

  • Ask Lemmy @lemmy.world

    What are some old-timey names that you think should make a comeback?

  • TenForward: Where Every Vulcan Knows Your Name @lemmy.world

    What would his Borg designation be?

  • Not The Onion @lemmy.world

    Permanently Deleted

    www.theguardian.com /us-news/2024/oct/31/donald-trump-women-protector-wisconsin-rally