{"id":20055066,"url":"https://github.com/pretix/monostat","last_synced_at":"2026-01-27T08:03:29.379Z","repository":{"id":221981737,"uuid":"737860304","full_name":"pretix/monostat","owner":"pretix","description":"Simple and opinionated status page","archived":false,"fork":false,"pushed_at":"2024-10-23T15:30:31.000Z","size":515,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-05T13:42:45.157Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pretix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-01T18:56:43.000Z","updated_at":"2024-10-23T15:30:35.000Z","dependencies_parsed_at":"2024-04-02T08:45:42.378Z","dependency_job_id":null,"html_url":"https://github.com/pretix/monostat","commit_stats":null,"previous_names":["pretix/monostat"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pretix/monostat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pretix%2Fmonostat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pretix%2Fmonostat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pretix%2Fmonostat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pretix%2Fmonostat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pretix","download_url":"https://codeload.github.com/pretix/monostat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pretix%2Fmonostat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28809337,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T07:41:26.337Z","status":"ssl_error","status_checked_at":"2026-01-27T07:41:08.776Z","response_time":168,"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-11-13T12:45:51.003Z","updated_at":"2026-01-27T08:03:29.361Z","avatar_url":"https://github.com/pretix.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# monostat – Highly opinionated minimal status page\n\nThis is the status page we use for pretix ([pretixstatus.com](https://pretixstatus.com/)).\nIt is tailor-made to our needs and might or might not be useful for others.\n\n## Opinions\n\n### No components\n\nUnlike *any* other status page software out there, this one does not have \"components\" that  can be marked as down individually.\npretix does not have a microservice architecture where system components like the API or other functional parts have independent operational failures.\nInstead, we have a monolithic application where failures usually either affect the whole system, or just one very specific area of functionality.\nSo we'd either end up with just one component, or with hundreds of them.\nHundreds of components are neither helpful to our operations team who needs to quickly assess an incident, nor is it useful to have users scroll through a very long list.\n\n### React to monitoring events …\n\nWhen our site goes down, we want the status page to reflect this as soon as possible such that customers know we are aware of the issue.\nAt the same time, we do not want \"update the status page\" to be the first thing on our on-call person's list, they should start looking into the actual issue first.\nTherefore, as soon as our monitoring system alerts our staff, we also want the status page to show something.\n\n### … but do not trust them\n\nHowever, we don't trust our monitoring, as it sometimes yields false-positives.\nTherefore, while we want the status page to *show* the status from our monitoring, we do want to handle it differently than a real \"incident\".\nFor example, we only want to alert subscribers of our status after a human has confirmed it to be an actual incident.\n\n### Require as few clicks as possible\n\nAn ongoing incident is a stressful situation for a small team.\nOur previous status page was not updated well enough, partly because it was too much effort.\nTherefore, this approach optimizes for the simplest possible user flows we could think of.\nTo take this to an extreme, we did not even want to have some kind of extra login for updating the status.\nTherefore, most of the backend actions of this software live somewhere we are logged in to already: Slack.\n\n### As little code as possible\n\nWe already maintain a big piece of software, we don't want this to grow into another one.\nTherefore, this integrates with a bunch of software that we already use:\n\n- Slack\n- OpsGenie\n\n## Process flow\n\n![Process flow chart](assets/flow.png)\n\n## Setup\n\nRequirements:\n\n- Docker (or Python 3.12 with a virtual environment, if you do not like Docker)\n- PostgreSQL database\n- redis database\n- Reverse proxy to terminate TLS connections\n\nBuild the docker image or pull it from ``pretix/monostat:main``. Run the docker container with a volume mounted to\n``/data`` that is readable and writable for uid 15372 and port 80 exposed to a reverse proxy. You can and should set\nthe following environment variables:\n\n- ``MONOSTAT_SITE_URL``: URL the site will be online at, e.g. ``https://pretixstatus.com``\n- ``MONOSTAT_DB_TYPE``: Database type, e.g. ``postgresql``\n- ``MONOSTAT_DB_NAME``: Database name\n- ``MONOSTAT_DB_USER``: Database user\n- ``MONOSTAT_DB_PASS``: Database password\n- ``MONOSTAT_DB_HOST``: Database host\n- ``MONOSTAT_DB_PORT``: Database port\n- ``MONOSTAT_REDIS_HOST``: Redis host\n- ``MONOSTAT_REDIS_PORT``: Redis port\n- ``MONOSTAT_REDIS_PASSWORD``: Redis ``AUTH`` password\n- ``MONOSTAT_MAIL_FROM``: Email address to use as sender for outgoing email\n- ``MONOSTAT_MAIL_HOST``: SMTP server\n- ``MONOSTAT_MAIL_PORT``: SMTP server port\n- ``MONOSTAT_MAIL_TLS``/``MONOSTAT_MAIL_SSL``: Set to ``\"True\"`` to use STARTTLS or SSL on SMTP connections \n- ``MONOSTAT_MAIL_USER``: SMTP authentication username\n- ``MONOSTAT_MAIL_PASSWORD``: SMTP authentication password\n- ``NUM_WORKERS``: Number of processes/threads for both the web worker and the task worker. Defaults to the number of CPUs.\n\nThe database migrations will automatically run on startup unless you set the environment variable ``AUTOMIGRATE=skip``.\nCreate a first user:\n\n    docker exec -it containername monostat createsuperuser\n\nAnd log in at ``https://SITE_URL/admin/``. Then, set up the remaining settings:\n\n1. Go to \"Site Configuration\" and adjust configuration as needed.\n2. Go to \"Notification Configuration\" and adjust configuration as needed.\n3. Go to \"OpsGenie Configuration\" and note down the webhook secret.\n   1. Open OpsGenie\n   2. Go to Integrations → Add integration → Webhook → Choose a name and team\n   3. Create the integration\n   4. Set the webhook URL to ``https://SITE_URL/integrations/opsgenie/hook/SECRET``\n   5. Activate \"Add Alert Description to Payload\"\n   6. Activate \"Post to Webhook URL for Opsgenie alerts\"\n   7. Activate at least the Alert actions \"Alert is created\", \"Alert is closed\", \"Alert description is updated\",\n      and \"Alert message is updated\".\n   8. Set up alert filters if wanted.\n   9. Turn on integration\n4. Go to the [Slack developer page](https://api.slack.com/apps)\n   1. Click \"Create New App\"\n   2. Choose \"From an app manifest\", pick a workspace and paste in the manifest from the file ``slack-app.json``\n      from this repository. Replace ``SITE_URL`` with your site's URL and create the app.\n   3. Go to \"Install App\" to install the app to your workspace\n   4. Note down the \"Bot User OAuth Token\"\n   5. Go to \"Basic Information\", note down the \"Signing Secret\"\n   6. Go to \"Slack Configuration\" in monostat admin, enter the bot token and signing secret as well as the\n      name of an existing, public channel (e.g. ``#statuspage``).\n5. Restart the docker container, as there is a known issue with caching of the slack secrets.\n6. You should be good to go!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpretix%2Fmonostat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpretix%2Fmonostat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpretix%2Fmonostat/lists"}