{"id":15940591,"url":"https://github.com/codl/chitter-ops","last_synced_at":"2026-02-07T08:03:37.873Z","repository":{"id":138204257,"uuid":"157810469","full_name":"codl/chitter-ops","owner":"codl","description":null,"archived":false,"fork":false,"pushed_at":"2021-04-29T20:10:23.000Z","size":25,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-03T22:45:45.140Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://chitter.xyz/","language":"NASL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codl.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-16T03:59:15.000Z","updated_at":"2021-04-29T20:10:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"20b43f16-6cb6-414b-8a45-1f8675c9baeb","html_url":"https://github.com/codl/chitter-ops","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codl/chitter-ops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codl%2Fchitter-ops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codl%2Fchitter-ops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codl%2Fchitter-ops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codl%2Fchitter-ops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codl","download_url":"https://codeload.github.com/codl/chitter-ops/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codl%2Fchitter-ops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29189675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T07:37:03.739Z","status":"ssl_error","status_checked_at":"2026-02-07T07:37:03.029Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-07T06:42:17.462Z","updated_at":"2026-02-07T08:03:32.865Z","avatar_url":"https://github.com/codl.png","language":"NASL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chitter operations 🦝🔧\n\nthis repository documents non-obvious parts of chitter's architecture\n\n⚠ **As of April 27, 2021, this is a bit outdated** as most things were migrated off of `parasect`. This document will be updated when the migration is done.\n\n## servers\n\nThere are two servers involved:\n\n* `tempo.chitter.xyz` or [`tempo`](https://www.mobygames.com/game/sega-32x/tempo)\n\n    * `10.235.0.4`\n      `176.9.92.130`\n      `2a01:4f8:151:337a::1`\n\n    * PostgreSQL, Redis, and media hosting / proxying\n\n    * Hetzner auction server in Falkenstein (FSN1)\n\n      Core i7-2600, 250 GB SATA SSD, 3+3 TB SATA HDD, 8+8 GiB DDR3 RAM\n\n    * Paid for by Patreon patrons (€36.30/mo) (Thank you!)\n\n* `parasect.codl.fr` or [`parasect`](https://bulbapedia.bulbagarden.net/wiki/Parasect_(Pok%C3%A9mon))\n\n    * `10.235.0.3`\n      `144.76.7.70`\n      `2a01:4f8:190:8245::2`\n\n    * Ingress traffic, Application server, Sidekiq queue workers, media hosting\n\n    * Hetzner auction server in Falkenstein (FSN1)\n\n    * Paid out of pocket by codl\n\n    * On its way out. `tempo` is more than capable of handling both it and\n      `parasect`'s jobs\n\n## app\n\nthe app server, streaming server, sidekiq, are all on `parasect`, running with docker-compose\n\nthe app and streaming server are behind a caddy instance, which handles serving static content, reverse proxying, and all the TLS stuff. the [Caddyfile](/Caddyfile) is in this repo\n\nThe PostgreSQL and Redis databases are on `tempo`.\n\nThe two servers are on a tinc VPN with name `chitter` and network `10.235.0.0/16`,\nPostgreSQL and Redis are set up to only accept connections from that network.\nA couple of my dev machines also have keys and connect to this network, which I\nknow isn't ideal security wise. (Reason being it started as an administrative\nnetwork and I didn't take the time to make another one)\n\n\u003e TODO document backups\n\n\u003e TODO document deployment procedure\n\n## media\n\nMedia is stored in three places, because we've moved media a bunch and I never\nbothered consolidating it afterwards. Some media is on Backblaze B2 in the\n`chitter-media` bucket, some media is served from a minio instance on\n`parasect`, and the rest, including all newly uploaded media, is on a minio\ninstance on `tempo`. Nginx on `tempo` takes care of trying all three locations (in\nreverse order) and caching responses from the first two. The [nginx config](/chitter-media.nginx.inc)\nis in this repo.\n\nIncoming requests to `media.chitter.xyz` go to BunnyCDN, which then goes to `tempo`.\n\nThe full public URL to the B2 bucket is `https://f001.backblazeb2.com/file/chitter-media/`\n\n`parasect`'s media is at `https://chitter-media.parasect.codl.fr`.\n\n`tempo`'s proxy/cache/media is at `https://tempo.orig.media.chitter.xyz`.\nInconsistent, I know.\n\nTest URLs:\n\n* \u003chttps://f001.backblazeb2.com/file/chitter-media/mascots/danfoxx.png\u003e\n* \u003chttps://tempo.orig.media.chitter.xyz/mascots/danfoxx.png\u003e\n* \u003chttps://media.chitter.xyz/mascots/danfoxx.png\u003e\n\n### historical media locations\n\nbecause toots are (indefinitely?) cached on remote servers with whatever media url was appropriate at the time, the following locations should continue serving or redirecting to the canonical location for media:\n\n* `https://media.chitter.xyz/` current canonical URL\n* `https://media-b.chitter.xyz/` was occasionally used when rotating servers. served by bunnycdn identically to the other one\n* `https://chitter-media.codl.fr/` points to `tempo`, which `301 Moved Permanently`s to `media.chitter.xyz`\n* `https://chitter.xyz/system/` currently 404s 😕\n\n## [status](https://github.com/codl/status.chitter.xyz)\n\n\u003chttps://status.chitter.xyz/\u003e is hosted on netlify\n\nupdown.io is set up to monitor chitter.xyz, specifically [the public timeline api endpoint][tl], and the index page of media.chitter.xyz. this page fetches statuses for both of those thru the updown.io api\n\nfor outage details, `updates.html` in the `chitter-outages` S3 bucket is loaded every 10 seconds and inserted in the page\n\nthis has been designed to not have any server component. everything is static html or third-party APIs and none of it is on our servers\n\n[tl]: https://chitter.xyz/api/v1/timelines/public?local=true\n\n`updates.html` can be updated by hand with `rclone` or in the AWS console.\nthere used to be a barebones form to update `updates.html` at \u003chttps://update.status.chitter.xyz/\u003e but the machine it was on was decommissioned.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodl%2Fchitter-ops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodl%2Fchitter-ops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodl%2Fchitter-ops/lists"}