{"id":13585629,"url":"https://github.com/blamebutton/disrupt","last_synced_at":"2025-04-07T10:31:16.452Z","repository":{"id":222370533,"uuid":"175879529","full_name":"blamebutton/disrupt","owner":"blamebutton","description":"Python script that updates Docker Swarm services, with optional notifications","archived":false,"fork":false,"pushed_at":"2020-07-29T22:58:51.000Z","size":45,"stargazers_count":25,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-02-13T21:13:29.998Z","etag":null,"topics":["discord-webhook-notifications","docker","docker-swarm","docker-swarm-mode","notifications","python","slack-webhook"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blamebutton.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-15T19:28:14.000Z","updated_at":"2024-08-01T16:31:36.848Z","dependencies_parsed_at":null,"dependency_job_id":"f4a8c54c-798b-474b-8c9a-2c2e42493778","html_url":"https://github.com/blamebutton/disrupt","commit_stats":null,"previous_names":["blamebutton/disrupt"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blamebutton%2Fdisrupt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blamebutton%2Fdisrupt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blamebutton%2Fdisrupt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blamebutton%2Fdisrupt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blamebutton","download_url":"https://codeload.github.com/blamebutton/disrupt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247636228,"owners_count":20970883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["discord-webhook-notifications","docker","docker-swarm","docker-swarm-mode","notifications","python","slack-webhook"],"created_at":"2024-08-01T15:05:03.055Z","updated_at":"2025-04-07T10:31:16.155Z","avatar_url":"https://github.com/blamebutton.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# Disrupt (Docker Swarm Service Updater)\n\n[![GitHub release](https://img.shields.io/github/v/release/BlameButton/disrupt?include_prereleases)](https://github.com/BlameButton/disrupt/releases)\n[![GitHub](https://img.shields.io/github/license/BlameButton/disrupt)](https://github.com/BlameButton/disrupt/blob/master/LICENSE)\n[![GitHub contributors](https://img.shields.io/github/contributors/blamebutton/disrupt?style=flat-square)](https://github.com/BlameButton/disrupt/graphs/contributors)\n\n[![Build Status](https://img.shields.io/travis/com/BlameButton/disrupt/master?style=flat-square)](https://travis-ci.com/BlameButton/disrupt)\n[![Docker Pulls](https://img.shields.io/docker/pulls/blamebutton/disrupt?style=flat-square)](https://hub.docker.com/r/blamebutton/disrupt)\n[![Discord Widget](https://img.shields.io/discord/556492964050763817?style=flat-square)](https://discord.gg/tDf2yBg)\n\n## Usage\n\n```yaml\nversion: '3'\n\nservices:\n  whoami:\n    image: jwilder/whoami\n    ports:\n      - 8080:8000\n\n  disrupt:\n    image: blamebutton/disrupt\n    volumes:\n      # Mount the Docker socket, this is required for interacting with the Docker API.\n      - /var/run/docker.sock:/var/run/docker.sock\n    deploy:\n      placement:\n        constraints:\n          # Disrupt needs permission to update services, only managers are allowed to do that.\n          - node.role == manager\n```\n\nFor more examples, check out the [examples folder](/.examples)\n\n**Note**: Docker Swarm does not support running locally built images, so neither does Disrupt.\n\n## Configuration\n\nConfiguration of Disrupt is done through environment variables. This is done to make the deployment of Disrupt\nenvironment-agnostic.\n\nBelow is a list of environment variables available to be configured.\n\n| Name | Type | Options |\n| - | - | - |\n| UPDATE_DELAY | Integer | default = 300 |\n| NOTIFICATION_URL | String | Any [Apprise](https://github.com/caronc/apprise#popular-notification-services) compatible URL |\n\n## Notifications\n\nDisrupt uses the [Apprise](https://github.com/caronc/apprise) notification library for Python.\nCheck out their documentation for more advanced usages.\n\nHere is a small list of notification providers that Apprise supports:\n\n- Slack\n- Discord\n- Telegram\n- PushBullet\n- Dbus\n- Mail\n- Custom notifications to a given URL in JSON or XML format\n\n## Contributing\n\nFeel free to make a feature request or if you have Python experience; pull requests are welcome\ntoo!\n\n## Troubleshooting\n\n### Could not connect to Docker Engine\n\nDid you mount the Docker socket to the container? Check out the [example](#usage) if you want\nto know how.\n\nIn the special case that you are accessing Docker over TCP, you should place Disrupt in the\nsame network as your TCP socket. Using a Docker socket proxy (like\n[docker-socket-proxy](https://hub.docker.com/r/tecnativa/docker-socket-proxy/), or\n[sockguard](https://github.com/buildkite/sockguard)) is recommended for enhanced security\nin this case. You could then configure the proxy to only allow `GET` requests for service info,\nfor example. That way, if the Disrupt container gets compromised it can't do any harm to the\ncluster in the form of modifications/destructive instructions.\n\n## Support\n\nIf you're having trouble getting Disrupt to work, we have a\n[Discord](https://discord.gg/tDf2yBg) for support and questions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblamebutton%2Fdisrupt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblamebutton%2Fdisrupt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblamebutton%2Fdisrupt/lists"}