-
Notifications
You must be signed in to change notification settings - Fork 111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replace BullMQ with Graphile Worker + merge Webhooks and Emails into Transmission service #5327
base: main
Are you sure you want to change the base?
Conversation
|
💻 Website PreviewThe latest changes are available as preview in: https://9a3b0415.hive-landing-page.pages.dev |
🐋 This PR was built and pushed to the following Docker images (tag: Docker Bake metadata{
"app": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/in3l355lbqk9keawtijwizu05",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:456dd16bfe482c3702547cbc782b8be26afc55339db8ce004da4751a6a38ab55",
"size": 685
},
"containerimage.digest": "sha256:456dd16bfe482c3702547cbc782b8be26afc55339db8ce004da4751a6a38ab55",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/app:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/app:kamil_graphile_worker"
},
"buildx.build.warnings": [
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTEp",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 11
},
"end": {
"line": 11
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDE5KQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 19
},
"end": {
"line": 19
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRQT1JUJyAobGluZSAyMSk=",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 21
},
"end": {
"line": 21
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEwKQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 10
},
"end": {
"line": 10
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDExKQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 11
},
"end": {
"line": 11
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTQp",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 14
},
"end": {
"line": 14
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIwKQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 20
},
"end": {
"line": 20
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMik=",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 12
},
"end": {
"line": 12
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMik=",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 12
},
"end": {
"line": 12
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTMp",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 13
},
"end": {
"line": 13
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEyKQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 12
},
"end": {
"line": 12
}
}
]
},
{
"vertex": "sha256:230b5a7bbe77217c7845d8bac6179b901da4b76eac0a8cbf26b57d41bb6b6568",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTYp",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "migrations.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGNhLWNlcnRpZmljYXRlcwoKV09SS0RJUiAvdXNyL3NyYy9hcHAKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkVOViBFTlZJUk9OTUVOVCBwcm9kdWN0aW9uCkVOViBOT0RFX0VOViBwcm9kdWN0aW9uCkVOViBSRUxFQVNFICRSRUxFQVNFCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pbGtpc2llbGEvZ3JhcGhxbC1oaXZlIgoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 16
},
"end": {
"line": 16
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAyMCk=",
"detail": [
"VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
],
"url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 20
},
"end": {
"line": 20
}
}
]
},
{
"vertex": "sha256:5d93175d453b618337b0c2502f6c510b14bfe82ea28d9ecb4b7826e65fd86f5e",
"level": 1,
"short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIxKQ==",
"detail": [
"TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
],
"url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
"sourceInfo": {
"filename": "services.dockerfile",
"data": "RlJPTSBub2RlOjIyLjguMC1zbGltCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHdnZXQgY2EtY2VydGlmaWNhdGVzICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKQVJHIFNFUlZJQ0VfRElSX05BTUUKV09SS0RJUiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUKCkNPUFkgLS1mcm9tPWRpc3QgLiAvdXNyL3NyYy9hcHAvJFNFUlZJQ0VfRElSX05BTUUvCkNPUFkgLS1mcm9tPXNoYXJlZCAuIC8KCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20va2FtaWxraXNpZWxhL2dyYXBocWwtaGl2ZSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2thbWlsa2lzaWVsYS9ncmFwaHFsLWhpdmUiCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQpFTlYgUE9SVCAkUE9SVAoKSEVBTFRIQ0hFQ0sgLS1pbnRlcnZhbD01cyBcCiAgLS10aW1lb3V0PTVzIFwKICAtLXN0YXJ0LXBlcmlvZD01cyBcCiAgLS1yZXRyaWVzPTYgXAogIENNRCAkSEVBTFRIQ0hFQ0tfQ01ECgpFTlRSWVBPSU5UIFsgIi9lbnRyeXBvaW50LnNoIiBdCg==",
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 21
},
"end": {
"line": 21
}
}
]
}
],
"composition-federation-2": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/jl043zf4kmjay901ln1612h9l",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:28a5a1b3b42723d39ddd523d15e0546ddb002c49e9fd23d67462ee41d932c060",
"size": 685
},
"containerimage.digest": "sha256:28a5a1b3b42723d39ddd523d15e0546ddb002c49e9fd23d67462ee41d932c060",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/composition-federation-2:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/composition-federation-2:kamil_graphile_worker"
},
"policy": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/hwk07egwj7yk0faszxkbzdn9b",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:177dc9914c5360d7bd4a98aa554d9bea7a0ad0db1b2cc0c37e683fb31f0f81f1",
"size": 685
},
"containerimage.digest": "sha256:177dc9914c5360d7bd4a98aa554d9bea7a0ad0db1b2cc0c37e683fb31f0f81f1",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/policy:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/policy:kamil_graphile_worker"
},
"rate-limit": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/11iq2q5ebf742fyrlfuph3ux5",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:e75b8bf8b4396f4fbde958323fe4f1784f6691d1b8f4272046c1d6bb52ac1905",
"size": 685
},
"containerimage.digest": "sha256:e75b8bf8b4396f4fbde958323fe4f1784f6691d1b8f4272046c1d6bb52ac1905",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/rate-limit:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/rate-limit:kamil_graphile_worker"
},
"schema": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/kte0blcjwa6myu8iycklc7x9c",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:62720659d815b3d2e14ef9489007ad2883edcab2650f96428fb776b7a71b0efe",
"size": 685
},
"containerimage.digest": "sha256:62720659d815b3d2e14ef9489007ad2883edcab2650f96428fb776b7a71b0efe",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/schema:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/schema:kamil_graphile_worker"
},
"server": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/hvdbr2buhpl2bt4qvye4uyl6u",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:0694a1f29f62083c943aa623f127fc8bb572c140f98b1638f39e98a3920a996e",
"size": 685
},
"containerimage.digest": "sha256:0694a1f29f62083c943aa623f127fc8bb572c140f98b1638f39e98a3920a996e",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/server:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/server:kamil_graphile_worker"
},
"storage": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/phalwtyjwmjlcxorgsofw46f9",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:ea9d7bf37973e216d03bfa7ff7028faa976b5d41e406384df46f608fc4b671fb",
"size": 685
},
"containerimage.digest": "sha256:ea9d7bf37973e216d03bfa7ff7028faa976b5d41e406384df46f608fc4b671fb",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/storage:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/storage:kamil_graphile_worker"
},
"stripe-billing": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/5pmolthj0l0lys0bcz3u7mmau",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:a5b50370d07ab57512ec073231ed1ff533618f5d324bb371424c5c07bed52873",
"size": 685
},
"containerimage.digest": "sha256:a5b50370d07ab57512ec073231ed1ff533618f5d324bb371424c5c07bed52873",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/stripe-billing:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/stripe-billing:kamil_graphile_worker"
},
"tokens": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/xltz8mcy7gserbzrizlzw9hg5",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:de610abe34f8aefcb9e685ba158a34acb7e03a11a237db9920101f96d30ec7f7",
"size": 685
},
"containerimage.digest": "sha256:de610abe34f8aefcb9e685ba158a34acb7e03a11a237db9920101f96d30ec7f7",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/tokens:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/tokens:kamil_graphile_worker"
},
"transmission": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/ruoyq2jk7knad2jj0m8myvrnj",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:58319140eebff329b4e38bd98437fa55018a76a404a80d40314344a7ba9f057b",
"size": 685
},
"containerimage.digest": "sha256:58319140eebff329b4e38bd98437fa55018a76a404a80d40314344a7ba9f057b",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/transmission:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/transmission:kamil_graphile_worker"
},
"usage": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/b6d11ujurgnp7gt4ogjnnce20",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:a4386a4e51cdf5e7b66bbb57542a3c495e471b6bde45bcbc780bf20dac035117",
"size": 685
},
"containerimage.digest": "sha256:a4386a4e51cdf5e7b66bbb57542a3c495e471b6bde45bcbc780bf20dac035117",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/usage:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/usage:kamil_graphile_worker"
},
"usage-estimator": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/yyuaqyjsggpvctehp890ejt6q",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:17030b39dc6eacf0c7543f3a8c88a22543541a8fc6eb62df102480823e06440c",
"size": 685
},
"containerimage.digest": "sha256:17030b39dc6eacf0c7543f3a8c88a22543541a8fc6eb62df102480823e06440c",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/usage-estimator:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/usage-estimator:kamil_graphile_worker"
},
"usage-ingestor": {
"buildx.build.ref": "builder-df7bbb63-b78e-4a71-b268-eca4e94a0d91/builder-df7bbb63-b78e-4a71-b268-eca4e94a0d910/rh8lqem10a72ialsupj6p2181",
"containerimage.descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:6f573beeab23b8e6501b18e64a8b49158a4cb7ea9109b2591c74b68bac4de7a3",
"size": 685
},
"containerimage.digest": "sha256:6f573beeab23b8e6501b18e64a8b49158a4cb7ea9109b2591c74b68bac4de7a3",
"image.name": "ghcr.io/kamilkisiela/graphql-hive/usage-ingestor:66e6b57b78d1b1b0431e9fcd740564918775e3f6,ghcr.io/kamilkisiela/graphql-hive/usage-ingestor:kamil_graphile_worker"
}
} |
3afd346
to
2b0afd4
Compare
2b0afd4
to
e6da8df
Compare
BullMQ -> Graphile Worker
As part of introducing #253 I needed a job queue that is reliable (jobs are persisted - BullMQ lacked here) and with cron support (to avoid scheduling in k8s or in a node process). I played with Temporal and loved it, but it's a new component to self-host (not ideal for self-hosted Hive) and scale, but we may introduce Temporal at some point (after the alerts work, the migration will be smooth as everything will be broken into small units). Both Temporal and Graphile-Worker relies on Postgres.
Plus, we can always talk to Benji :)
One thing that we rely on that is missing in graphile-worker, but is available in BullMQ, is deduplication of successfully completed jobs. When a job of id 1 is finished, BullMQ does not delete it, so next time a job of id 1 is added, BullMQ ignores it.
We rely on this behavior when sending emails about rate limits.
I implemented it, in this new setup, in postgres, by storing job ids for 30 days (we really use it only for this one use case anyway).
I tried to make the DX of it easy enough, so when we add more tasks, we don't have to think that much about trpc, zod, pg connections and things like that.
Here's how you define a task:
How we add tasks and expose them to tRPC:
And this is how you schedule a job with tRPC:
Webhooks + Emails = Transmission
In order to simplify the setup and make it ready for #253 (the goal is to move slack, msteams, webhooks and email sending to one service instead of doing it in graphql-api and also making them reusable), I merged two services into one.
Now, everything that is part of a job queue (like notifications) is managed within a single service (that can have many replicas).
Easier to manage, less resources, no reason to have two services running...