{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":586265895,"defaultBranch":"main","name":"kamal","ownerLogin":"basecamp","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-01-07T14:32:08.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/13131?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1716906217.0","currentOid":""},"activityList":{"items":[{"before":"15edcdc5ea4e685ecbf19669a90ea0fa59768897","after":"debbad9cdc4604471c146a76cf531cce576bcc13","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T17:22:45.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Configuration validation\n\nValidate the Kamal configuration giving useful warning on errors.\nEach section of the configuraiton has its own config class and each\nembeds a YAML string that is an example configuration.\n\nYou can run `kamal docs` to see the example configuration, and\n`kamal docs
` to see the example configuration for a specific\nsection.\n\nThe validation matches the configuration to the example configuration\nchecking that there are no knownown keys and that the values are of\nmatching types.\n\nWhere there is more complex validation - e.g for envs and servers, we\nhave custom validators that implement those rules.","shortMessageHtmlLink":"Configuration validation"}},{"before":"364031ae3c5119fc1ae306097f0c7fae495aa51d","after":"15edcdc5ea4e685ecbf19669a90ea0fa59768897","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T16:19:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"763a0c4477c922d62589fc0a894a73749fe2e0ba","after":"364031ae3c5119fc1ae306097f0c7fae495aa51d","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T15:13:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"56ff23cae679c147cb4ec5bba551cd63d3b6414a","after":"763a0c4477c922d62589fc0a894a73749fe2e0ba","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T13:46:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"9e21a2cc852c94542d52cccd05a6ff78da91abbf","after":"56ff23cae679c147cb4ec5bba551cd63d3b6414a","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T13:44:11.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"c6340af2d5a23620ba73ebf0573a34dac1652736","after":"9e21a2cc852c94542d52cccd05a6ff78da91abbf","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T12:04:43.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"fa0062e7772dc2e9253e5b616053caf2f0efd701","after":"c6340af2d5a23620ba73ebf0573a34dac1652736","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-30T11:06:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"16dcb339fc68e6ebcdf01ba67518988cf347bfbd","after":"fa0062e7772dc2e9253e5b616053caf2f0efd701","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T15:22:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"08e5036ad993134b9855d0b58ec85ea1b757a393","after":"16dcb339fc68e6ebcdf01ba67518988cf347bfbd","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T15:17:24.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"3128cb3424972b236abc7e724f1f3ce3c47ad1c1","after":"08e5036ad993134b9855d0b58ec85ea1b757a393","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T13:25:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"85cc6f85e44ec89993a3f85b2feac10eda4d3e3c","after":"3128cb3424972b236abc7e724f1f3ce3c47ad1c1","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T13:09:43.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"88fd84eb1d4e3cded1e4c3508dba6f26b8201446","after":"85cc6f85e44ec89993a3f85b2feac10eda4d3e3c","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T11:25:05.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"a70128d4764b22d2a0517de1fcc2bbdba023d88d","after":"88fd84eb1d4e3cded1e4c3508dba6f26b8201446","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T11:11:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"462af0ecd29bf12de68336bde483666989c95d59","after":"a70128d4764b22d2a0517de1fcc2bbdba023d88d","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-29T09:46:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"a7db6187bd6d9cb6fcc3124d346f1b0d325ea989","after":"015c5a6f901c8d96dc8cce93e57c471b605cef3e","ref":"refs/heads/kamal-proxy","pushedAt":"2024-05-28T14:32:02.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Add kamal proxy update\n\nFor easy updates from Traefik to kamal-proxy, add `kamal proxy update`.\n\nThis stops and removes Traefik and kamal-proxy containers (just in case\nit is run after an update). Then it starts kamal-proxy and calls\n`kamal-proxy deploy` to route to any app containers that are already\nrunning.\n\nIt can be run with a rolling option and calls the `pre-proxy-reboot` and\n`post-proxy-reboot` hooks for each host.","shortMessageHtmlLink":"Add kamal proxy update"}},{"before":"2c2053558aa5e43425b411b4d5865970f35fc121","after":null,"ref":"refs/heads/retry-clone","pushedAt":"2024-05-28T14:23:37.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"}},{"before":"10b8c826d80ea5bd3b4775d73ebbc5124675c65e","after":"90ecb6a12a686ddf1767152c56ef9c555a634231","ref":"refs/heads/main","pushedAt":"2024-05-28T14:23:36.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Merge pull request #821 from basecamp/retry-clone\n\nHandle corrupt git clones","shortMessageHtmlLink":"Merge pull request #821 from basecamp/retry-clone"}},{"before":"82f62798a43bb2b0543ad49e9c83794195327d5d","after":"a7db6187bd6d9cb6fcc3124d346f1b0d325ea989","ref":"refs/heads/kamal-proxy","pushedAt":"2024-05-28T14:23:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Add kamal proxy update\n\nFor easy updates from Traefik to kamal-proxy, add `kamal proxy update`.\n\nThis stops and removes Traefik and kamal-proxy containers (just in case\nit is run after an update). Then it starts kamal-proxy and calls\n`kamal-proxy deploy` to route to any app containers that are already\nrunning.\n\nIt can be run with a rolling option and calls the `pre-proxy-reboot` and\n`post-proxy-reboot` hooks for each host.","shortMessageHtmlLink":"Add kamal proxy update"}},{"before":"a990c720b6bba47021e25a0766ce42fbeab5d085","after":"82f62798a43bb2b0543ad49e9c83794195327d5d","ref":"refs/heads/kamal-proxy","pushedAt":"2024-05-28T13:02:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Replace Traefik with kamal-proxy\n\n[kamal-proxy](https://github.com/basecamp/kamal-proxy) is a custom\nminimal proxy designed specifically for Kamal.\n\nIt has some advantages over Traefik:\n1. Imperative deployments - we tell it to switch from container A to\n container B, and it waits for container B to start then switches. No\n need to poll for health checks ourselves or mess around with forcing\n health checks to fail.\n2. Support for multiple apps - as much as possible, configuration is\n supplied at runtime by the deploy command, allowing us to have\n multiple apps share a proxy without conflicting config.\n3. First class support for Kamal operations - rather than trying to\n work out how to make Traefik do what we want, we can build features\n directly into the proxy, making configuration simpler and avoiding\n obscure errors","shortMessageHtmlLink":"Replace Traefik with kamal-proxy"}},{"before":null,"after":"a990c720b6bba47021e25a0766ce42fbeab5d085","ref":"refs/heads/kamal-proxy","pushedAt":"2024-05-28T09:23:58.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Rename parachute to kamal-proxy","shortMessageHtmlLink":"Rename parachute to kamal-proxy"}},{"before":null,"after":"462af0ecd29bf12de68336bde483666989c95d59","ref":"refs/heads/configuration-validation","pushedAt":"2024-05-28T08:25:46.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"7ffb3d38b25d4149ad939c81383a01f773c7f0d8","after":"822590dcf6dc9cc76de6a36e3c3be1a57f23ca9a","ref":"refs/heads/parachute","pushedAt":"2024-05-27T13:00:31.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Replace Traefik with parachute\n\n[mproxy](https://github.com/basecamp/parachute) is a custom minimal\nproxy designed specifically for Kamal.\n\nIt has two big advantages over Traefik:\n1. Imperative deployments - we tell it to switch from container A to\n container B, and it waits for container B to start then switches. No\n need to poll for health checks ourselves or mess around with forcing\n health checks to fail.\n2. Support for multiple apps - as much as possible, configuration is\n supplied at runtime by the deploy command, allowing us to have\n multiple apps share an instance of mproxy without conflicting config.","shortMessageHtmlLink":"Replace Traefik with parachute"}},{"before":"58449c4094c8a7d20b0ec04ce538ff6eff078a9a","after":"2c2053558aa5e43425b411b4d5865970f35fc121","ref":"refs/heads/retry-clone","pushedAt":"2024-05-27T10:17:54.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Handle corrupt git clones\n\nWhen cloning the git repo:\n1. Try to clone\n2. If there's already a build directory reset it\n3. Check the clone is valid\n\nIf anything goes wrong during that process:\n1. Delete the clone directory\n2. Clone it again\n3. Check the clone is valid\n\nRaise any errors after that","shortMessageHtmlLink":"Handle corrupt git clones"}},{"before":"1cd6f119c809cd3930cafa2a374efe83ed10355d","after":"58449c4094c8a7d20b0ec04ce538ff6eff078a9a","ref":"refs/heads/retry-clone","pushedAt":"2024-05-27T10:16:15.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Handle corrupt git clones\n\nWhen cloning the git repo:\n1. Try to clone\n2. If there's already a build directory reset it\n3. Check the clone is valid\n\nIf anything goes wrong during that process:\n1. Delete the clone directory\n2. Clone it again\n3. Check the clone is valid\n\nRaise any errors after that","shortMessageHtmlLink":"Handle corrupt git clones"}},{"before":null,"after":"1cd6f119c809cd3930cafa2a374efe83ed10355d","ref":"refs/heads/retry-clone","pushedAt":"2024-05-27T10:14:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Handle corrupt git clones\n\nWhen cloning the git repo:\n1. Try to clone\n2. If there's already a build directory reset it\n3. Check the clone is valid\n\nIf anything goes wrong during that process:\n1. Delete the clone directory\n2. Clone it again\n3. Check the clone is valid\n\nRaise any errors after that","shortMessageHtmlLink":"Handle corrupt git clones"}},{"before":"63e0db3f511f0819cd1a0eee6e0cb18e1bfcbb75","after":"7ffb3d38b25d4149ad939c81383a01f773c7f0d8","ref":"refs/heads/parachute","pushedAt":"2024-05-23T15:21:15.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Replace Traefik with parachute\n\n[mproxy](https://github.com/basecamp/parachute) is a custom minimal\nproxy designed specifically for Kamal.\n\nIt has two big advantages over Traefik:\n1. Imperative deployments - we tell it to switch from container A to\n container B, and it waits for container B to start then switches. No\n need to poll for health checks ourselves or mess around with forcing\n health checks to fail.\n2. Support for multiple apps - as much as possible, configuration is\n supplied at runtime by the deploy command, allowing us to have\n multiple apps share an instance of mproxy without conflicting config.","shortMessageHtmlLink":"Replace Traefik with parachute"}},{"before":"49fc54fd3eafaa8b64e7411a1e77586eb19ae019","after":"63e0db3f511f0819cd1a0eee6e0cb18e1bfcbb75","ref":"refs/heads/parachute","pushedAt":"2024-05-23T13:31:03.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Replace Traefik with parachute\n\n[mproxy](https://github.com/basecamp/parachute) is a custom minimal\nproxy designed specifically for Kamal.\n\nIt has two big advantages over Traefik:\n1. Imperative deployments - we tell it to switch from container A to\n container B, and it waits for container B to start then switches. No\n need to poll for health checks ourselves or mess around with forcing\n health checks to fail.\n2. Support for multiple apps - as much as possible, configuration is\n supplied at runtime by the deploy command, allowing us to have\n multiple apps share an instance of mproxy without conflicting config.","shortMessageHtmlLink":"Replace Traefik with parachute"}},{"before":"187861fa60b4a027dcc6d3fe3e485bb8a678c2db","after":null,"ref":"refs/heads/lock-less","pushedAt":"2024-05-21T11:33:46.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"}},{"before":"2c2d94c6d99fb8b350e3e5fff988b14a283e9683","after":"10b8c826d80ea5bd3b4775d73ebbc5124675c65e","ref":"refs/heads/main","pushedAt":"2024-05-21T11:33:45.000Z","pushType":"pr_merge","commitsCount":10,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Merge pull request #755 from basecamp/lock-less\n\nLock less","shortMessageHtmlLink":"Merge pull request #755 from basecamp/lock-less"}},{"before":"5ff1203c80a3c7c51c4650a5a9131bf13eb15fd1","after":"187861fa60b4a027dcc6d3fe3e485bb8a678c2db","ref":"refs/heads/lock-less","pushedAt":"2024-05-21T11:20:23.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djmb","name":"Donal McBreen","path":"/djmb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1734607?s=80&v=4"},"commit":{"message":"Space not tab","shortMessageHtmlLink":"Space not tab"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEWEQmJwA","startCursor":null,"endCursor":null}},"title":"Activity ยท basecamp/kamal"}