feat(services): add ALTCHA Sentinel one-click template

Register Altcha Sentinel as a security service with compose, logo, and catalog entries so users can deploy bot protection on port 8080. Cover the compose image, healthcheck, volume, and generated URL/FQDN env vars in a unit test.
This commit is contained in:
Andras Bacsai
2026-09-14 14:23:23 +02:00
parent 08f68016dd
commit 5ff7b882bb
5 changed files with 105 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
<svg width="249" height="249" viewBox="0 0 249 249" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="249" height="249" rx="124.5" fill="#1D1DC9"/>
<path d="M44.6127 192.313C81.9557 236.946 148.306 242.768 192.81 205.316C214.291 187.239 226.755 162.386 229.705 136.489L209.228 129.015C208.02 151.533 197.871 173.513 179.287 189.153C143.684 219.114 90.6038 214.457 60.729 178.75C30.8544 143.043 35.4983 89.8088 71.1015 59.8473C106.705 29.8856 159.785 34.5432 189.66 70.2499C198.584 80.9159 204.428 93.1458 207.286 105.852L229.884 114.101C227.884 93.6669 219.929 73.6035 205.776 56.6874C168.433 12.054 102.082 6.23255 57.5783 43.6841C13.0743 81.136 7.26936 147.679 44.6127 192.313Z" fill="white"/>
<path d="M57.5783 43.6841C37.4385 60.6325 25.2241 83.5385 21.347 107.676L41.5288 115.423C43.7807 94.5209 53.775 74.4282 71.1015 59.8473C106.705 29.8856 159.785 34.5432 189.66 70.2499L165.485 90.5937L230 115.36C228.208 94.4917 220.22 73.9505 205.776 56.6874C168.433 12.054 102.082 6.23255 57.5783 43.6841Z" fill="white"/>
<path d="M93.6368 124.5H72.5984C72.5984 153.632 96.1465 177.249 125.194 177.249C154.242 177.249 177.79 153.632 177.79 124.5H156.752C156.752 141.98 142.624 156.149 125.194 156.149C107.765 156.149 93.6368 141.98 93.6368 124.5Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+25
View File
@@ -0,0 +1,25 @@
# documentation: https://altcha.org/docs/v2/sentinel/install/docker
# slogan: ALTCHA Sentinel protects websites and APIs from spam, bots, and abuse.
# category: security
# tags: captcha, anti-spam, bot protection, privacy, security
# logo: svgs/altcha.svg
# port: 8080
services:
altcha:
image: 'ghcr.io/altcha-org/sentinel:${ALTCHA_VERSION:-latest}'
environment:
- SERVICE_URL_ALTCHA_8080
volumes:
- altcha-data:/data
healthcheck:
test:
- CMD-SHELL
- "grep -q ':1F90 ' /proc/net/tcp /proc/net/tcp6"
interval: 10s
timeout: 5s
retries: 10
start_period: 10s
volumes:
altcha-data:
+17
View File
@@ -50,6 +50,23 @@
"template_last_updated_at": "2025-08-18T18:12:16+02:00",
"port": "3010"
},
"altcha": {
"documentation": "https://altcha.org/docs/v2/sentinel/install/docker?utm_source=coolify.io",
"slogan": "ALTCHA Sentinel protects websites and APIs from spam, bots, and abuse.",
"compose": "c2VydmljZXM6CiAgYWx0Y2hhOgogICAgaW1hZ2U6ICdnaGNyLmlvL2FsdGNoYS1vcmcvc2VudGluZWw6JHtBTFRDSEFfVkVSU0lPTjotbGF0ZXN0fScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfVVJMX0FMVENIQV84MDgwCiAgICB2b2x1bWVzOgogICAgICAtICdhbHRjaGEtZGF0YTovZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAiZ3JlcCAtcSAnOjFGOTAgJyAvcHJvYy9uZXQvdGNwIC9wcm9jL25ldC90Y3A2IgogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDEwCiAgICAgIHN0YXJ0X3BlcmlvZDogMTBzCnZvbHVtZXM6CiAgYWx0Y2hhLWRhdGE6IG51bGwK",
"tags": [
"captcha",
"anti-spam",
"bot protection",
"privacy",
"security"
],
"category": "security",
"logo": "svgs/altcha.svg",
"minversion": "0.0.0",
"template_last_updated_at": null,
"port": "8080"
},
"alexandrie": {
"documentation": "https://github.com/Smaug6739/Alexandrie/tree/main/docs?utm_source=coolify.io",
"slogan": "A powerful Markdown workspace designed for speed, clarity, and creativity.",
+17
View File
@@ -50,6 +50,23 @@
"template_last_updated_at": "2025-08-18T18:12:16+02:00",
"port": "3010"
},
"altcha": {
"documentation": "https://altcha.org/docs/v2/sentinel/install/docker?utm_source=coolify.io",
"slogan": "ALTCHA Sentinel protects websites and APIs from spam, bots, and abuse.",
"compose": "c2VydmljZXM6CiAgYWx0Y2hhOgogICAgaW1hZ2U6ICdnaGNyLmlvL2FsdGNoYS1vcmcvc2VudGluZWw6JHtBTFRDSEFfVkVSU0lPTjotbGF0ZXN0fScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9BTFRDSEFfODA4MAogICAgdm9sdW1lczoKICAgICAgLSAnYWx0Y2hhLWRhdGE6L2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gImdyZXAgLXEgJzoxRjkwICcgL3Byb2MvbmV0L3RjcCAvcHJvYy9uZXQvdGNwNiIKICAgICAgaW50ZXJ2YWw6IDEwcwogICAgICB0aW1lb3V0OiA1cwogICAgICByZXRyaWVzOiAxMAogICAgICBzdGFydF9wZXJpb2Q6IDEwcwp2b2x1bWVzOgogIGFsdGNoYS1kYXRhOiBudWxsCg==",
"tags": [
"captcha",
"anti-spam",
"bot protection",
"privacy",
"security"
],
"category": "security",
"logo": "svgs/altcha.svg",
"minversion": "0.0.0",
"template_last_updated_at": null,
"port": "8080"
},
"alexandrie": {
"documentation": "https://github.com/Smaug6739/Alexandrie/tree/main/docs?utm_source=coolify.io",
"slogan": "A powerful Markdown workspace designed for speed, clarity, and creativity.",
+40
View File
@@ -0,0 +1,40 @@
<?php
it('includes an ALTCHA Sentinel one-click service template', function () {
$templatePath = __DIR__.'/../../templates/compose/altcha.yaml';
expect($templatePath)->toBeFile();
$compose = file_get_contents($templatePath);
expect($compose)
->toContain('ghcr.io/altcha-org/sentinel:${ALTCHA_VERSION:-latest}')
->toContain('SERVICE_URL_ALTCHA_8080')
->toContain('altcha-data:/data')
->toContain("grep -q ':1F90 ' /proc/net/tcp /proc/net/tcp6")
->toContain("volumes:\n altcha-data:")
->not->toContain('busybox wget');
foreach (['service-templates.json', 'service-templates-latest.json'] as $templateFile) {
$templates = json_decode(
file_get_contents(__DIR__."/../../templates/{$templateFile}"),
associative: true,
flags: JSON_THROW_ON_ERROR,
);
expect($templates)->toHaveKey('altcha');
expect($templates['altcha']['port'] ?? null)->toBe('8080');
expect($templates['altcha']['logo'] ?? null)->toBe('svgs/altcha.svg');
expect($templates['altcha']['category'] ?? null)->toBe('security');
$generatedCompose = base64_decode($templates['altcha']['compose'], strict: true);
expect($generatedCompose)
->toContain('ghcr.io/altcha-org/sentinel:${ALTCHA_VERSION:-latest}')
->toContain("grep -q ':1F90 ' /proc/net/tcp /proc/net/tcp6")
->toContain("volumes:\n altcha-data:")
->toContain($templateFile === 'service-templates.json'
? 'SERVICE_FQDN_ALTCHA_8080'
: 'SERVICE_URL_ALTCHA_8080');
}
});