{"id":13581277,"url":"https://github.com/leighmacdonald/uncletopia","last_synced_at":"2026-02-22T03:12:55.077Z","repository":{"id":36993930,"uuid":"277452437","full_name":"leighmacdonald/uncletopia","owner":"leighmacdonald","description":"Ansible playbook for uncletopia server cluster","archived":false,"fork":false,"pushed_at":"2026-01-26T05:55:50.000Z","size":173912,"stargazers_count":51,"open_issues_count":7,"forks_count":10,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-01-26T20:10:52.492Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"SourcePawn","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leighmacdonald.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-07-06T05:41:21.000Z","updated_at":"2026-01-26T05:55:53.000Z","dependencies_parsed_at":"2023-09-23T16:56:28.884Z","dependency_job_id":"9ba2dee4-4456-4907-901d-ca9a91d5da6e","html_url":"https://github.com/leighmacdonald/uncletopia","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/leighmacdonald/uncletopia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leighmacdonald%2Funcletopia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leighmacdonald%2Funcletopia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leighmacdonald%2Funcletopia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leighmacdonald%2Funcletopia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leighmacdonald","download_url":"https://codeload.github.com/leighmacdonald/uncletopia/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leighmacdonald%2Funcletopia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29704410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T23:35:04.139Z","status":"online","status_checked_at":"2026-02-22T02:00:08.193Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-08-01T15:01:59.926Z","updated_at":"2026-02-22T03:12:55.071Z","avatar_url":"https://github.com/leighmacdonald.png","language":"SourcePawn","funding_links":[],"categories":["SourcePawn"],"sub_categories":[],"readme":"# Uncletopia\n\nThis repo contains [Ansible](https://docs.ansible.com) playbooks and roles for\nconfiguring and administering the uncletopia server cluster.\n\n## Roles\n\nThere is several roles that can be installed. Some are just additional tools that are hosted by us (bd-api, tf2bdd, uncledane) \nand are not required at all. \n\n### bd-api\n\nInstalls the [bd-api](https://github.com/leighmacdonald/bd-api) service.\n\n### caddy\n\nThe [caddy](https://caddyserver.com/) role configures the frontend http proxy that exposes all the internal services such as the \ngbans website, grafana and sentry.\n\n### demostats\n\nThe [demostats](https://github.com/leighmacdonald/tf2_demostats) role handles configuring the demostats docker container\nweb service for processing incoming demos.\n\n### gbans\n\nThe gbans roles downloads and configures the [gbans](https://github.com/leighmacdonald/gbans) (and postgres) docker instances. gbans is a tools that provides \ncentralized bans, appeals and other simple community components. This role expects the demostats role as well.\n\n### metrics\n\nThe metrics role is responsible for configuring the grafana monitoring stack. Installs the grafana web service \nand associated backend agents loki, prometheus and promtail.\n\n### sentry (self-hosted)\n\nThis role is responsible for setting up the [sentry.io self-hosted] error tracking/tracing/instrumentation. This is fairly \nhigh resource usage, so be careful if you are going to use this. You can attempt to try running this in \n[errors only](https://develop.sentry.dev/self-hosted/experimental/errors-only/) mode if you wanted to attempt to use it on\na lower capacity machine. If you are small scale you should probably just stick to the free hosted tier at sentry.io, it should\nbe more than sufficient.\n\n### sourcemod (+metamod)\n\nThe sourcemod role is responsible for configuring the [metamod](https://www.sourcemm.net/) and [sourcemod](https://www.sourcemod.net/) installation used in the srcds role. It will \nautomatically download the latest metamod and source versions and fully rebuild the entire plugin tree to ensure \ncompatibility.\n\nNote that all plugins which to not comply with sourcemods newer syntax `newdecls` have had their source updated with `#pragma newdecls required` and all subsequent \nrequired changes.\n\nThere is no pre-existing compiled plugins, you will need to compile anything you need yourself if you use any of these. We compile all plugins during\nthe deployment stage.\n\n### srcds\n\nInstalls the baseline SRCDS instance using steamcmd (dd will work too, but it was disabled temporarily due to an auth problem and needs to be re-enabled).\n\nThese do *not* currently run under docker containers due to some painful ergonomics at the time and dealing with some other external problems.\nBut they may again in the future as things have improved.\n\n- Downloads and installs metamod and sourcemod.\n- Builds *all* sourcemod plugins from source. This is done to help reduce bitrot and ensure correctness.\n- Configures the services specific plugins and extensions.\n\n### tf2bdd\n\nInstalls an instance of [tf2bdd](https://github.com/leighmacdonald/tf2bdd), which is used to manage bot a detector list \nvia discord.\n\n### uncledane\n\nHandles building and running the [uncledane.com](https://uncletdane.com) [src](https://github.com/leighmacdonald/uncledane-web) website. \n\n## Playbooks\n\nThese are largely in the order they should be executed in except for, adduser.yml, which must be run first. \n\n### adduser.yml (once)\n\nCreates the user used for running the services. This only should be run once. A new user will be created and will be used for future playbooks instead as root logins over ssh will be disabled. \n\n### vpn.yml\n\nSetups a P2P wireguard based vpn network. These playbooks and services are designed to listen and otherwise use internal vpn network traffic\neverywhere possible. This is not strictly required, but not using a vpn is 100% untested/unsupported and will require fixing things yourself.\n\nNote: This required the `python3-netaddr` package to be installed on the *ansible controller host*.\n\n### system.yml\n\nInstalls base OS runtime requirements and services.\n\n- Set timezone\n- Enable i386 arch for steam_cmd/srcds\n- Installs apt repos and install docker, rsyslog\n- Enable firewall in deny mode\n\n### update.yml\n\nA helper playbook that will update all systems and reboot them if required.\n\n### tune.yml\n\nAn *optional* playbook that contains tasks that will tune the underlying OS. You *must* not run this without understanding\nthe repercussions of the changes. You should also adjust them accordingly to your hardware specs \u0026 needs.\n\n## Requirements\n\nTo install the required additional collections and roles you can use the provided requirements.yml file.\n\n    ansible-galaxy install -r requirements.yml\n\n## Troubleshooting\n\n### spcomp fails to execute\n\nIf you are on a 64bit machine you will want 32bit libs for spcomp.\n\n    sudo apt get install libc6:i386 lib32stdc++6\n\n\n## Manual Setup Steps\n\nThere is a few steps that are not entirely automated yet. These are generally going to be one time setup type of steps.\n\nThese will eventually get automated, but are quite low priority.\n\n- (One time) Create sentry admin user\n  - ssh {{ caddy.hosts.sentry.dns }} -C \"cd ~/sentry \u0026\u0026 docker compose run --rm web createuser\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleighmacdonald%2Funcletopia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleighmacdonald%2Funcletopia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleighmacdonald%2Funcletopia/lists"}