{"id":30756838,"url":"https://github.com/solidlabresearch/aggregator","last_synced_at":"2026-01-19T00:01:26.218Z","repository":{"id":311811688,"uuid":"942808475","full_name":"SolidLabResearch/aggregator","owner":"SolidLabResearch","description":"An aggregator with UMA as the authorization server.","archived":false,"fork":false,"pushed_at":"2026-01-13T21:42:13.000Z","size":852,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-13T23:58:00.885Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SolidLabResearch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-04T17:53:51.000Z","updated_at":"2026-01-13T10:03:11.000Z","dependencies_parsed_at":"2025-08-27T02:16:44.799Z","dependency_job_id":"0aa06b6b-ba5e-4413-b8c0-7604bf4b3a42","html_url":"https://github.com/SolidLabResearch/aggregator","commit_stats":null,"previous_names":["solidlabresearch/aggregator"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SolidLabResearch/aggregator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolidLabResearch%2Faggregator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolidLabResearch%2Faggregator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolidLabResearch%2Faggregator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolidLabResearch%2Faggregator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SolidLabResearch","download_url":"https://codeload.github.com/SolidLabResearch/aggregator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolidLabResearch%2Faggregator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28554368,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T23:48:35.235Z","status":"ssl_error","status_checked_at":"2026-01-18T23:47:49.178Z","response_time":98,"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":"2025-09-04T10:09:49.300Z","updated_at":"2026-01-19T00:01:26.212Z","avatar_url":"https://github.com/SolidLabResearch.png","language":"Go","readme":"# Aggregator\r\n\r\n[![Integration Tests](https://github.com/SolidLabResearch/aggregator/actions/workflows/integration-tests.yml/badge.svg)](https://github.com/SolidLabResearch/aggregator/actions/workflows/integration-tests.yml)\r\n\r\nAn aggregator using uma: https://github.com/SolidLabResearch/user-managed-access as the authorization server.\r\n\r\n## Requirements\r\n\r\n- Docker\r\n- Kind (Kubernetes in Docker)\r\n- kubectl\r\n- Helm\r\n- Make\r\n\r\n## Quick Start\r\n\r\n```bash\r\n# Full setup: Create cluster, build containers, deploy everything\r\nmake init\r\nmake deploy\r\n\r\n# Access at http://aggregator.local\r\n```\r\n\r\n## Setup\r\n\r\n### 1. Install Dependencies\r\n\r\n**Kind:**\r\n```bash\r\ncurl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64\r\nchmod +x ./kind\r\nsudo mv ./kind /usr/local/bin/kind\r\n```\r\n\r\n**kubectl:**\r\n```bash\r\ncurl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl\"\r\nchmod +x kubectl\r\nsudo mv kubectl /usr/local/bin/\r\n```\r\n\r\n**Helm:**\r\n```bash\r\ncurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash\r\n```\r\n\r\n### 2. Deploy the Aggregator\r\n\r\n```bash\r\n# Create Kind cluster and load containers\r\nmake init\r\n\r\n# Deploy aggregator with Traefik\r\nmake deploy\r\n```\r\n\r\nThe aggregator is now accessible at `http://aggregator.local`\r\n\r\n### 3. Stop/Clean-up the Deployment\r\n\r\n```bash\r\nmake stop             # Stop services (cluster stays alive)\r\nmake clean            # Delete everything including cluster\r\n```\r\n\r\n## Makefile Commands\r\n\r\n### Cluster Management\r\n```bash\r\nmake init          # Create cluster, build \u0026 load containers, start cleaner\r\nmake kind-start         # Create/start Kind cluster only\r\nmake kind-stop          # Delete Kind cluster\r\nmake kind-dashboard     # Deploy Kubernetes dashboard\r\n```\r\n\r\n### Container Management\r\n```bash\r\nmake containers-build              # Build all containers (parallel)\r\nmake containers-build CONTAINER=X  # Build specific container\r\nmake containers-load               # Load all images into Kind\r\nmake containers-load CONTAINER=X   # Load specific image\r\nmake containers-all                # Build and load all\r\nmake containers-all CONTAINER=X    # Build and load specific image\r\n```\r\n\r\n### Deployment\r\n```bash\r\nmake deploy            # Deploy Traefik + aggregator\r\nmake kind-deploy       # Deploy aggregator only\r\nmake kind-undeploy     # Remove aggregator (keep Traefik \u0026 cleaner)\r\nmake stop              # Stop aggregator + Traefik (keep cluster \u0026 cleaner)\r\n```\r\n\r\n### Cleanup\r\n```bash\r\nmake stop              # Stop services (cluster stays alive)\r\nmake kind-clean        # Remove all deployments (cluster stays alive)\r\nmake clean             # Delete everything including cluster\r\nmake docker-clean      # Clean up Docker images\r\n```\r\n\r\n### Testing\r\n```bash\r\nmake integration-test  # Run full integration test suite\r\n```\r\n\r\n### Utilities\r\n```bash\r\nmake hosts-add         # Add aggregator.local to /etc/hosts\r\nmake hosts-remove      # Remove aggregator.local from /etc/hosts\r\nmake enable-wsl        # Configure CoreDNS for WSL2\r\n```\r\n\r\n## Development Workflow\r\n\r\n### Making Changes\r\n\r\n```bash\r\n# Rebuild specific container\r\nmake containers-build CONTAINER=aggregator-server\r\nmake containers-load CONTAINER=aggregator-server\r\n\r\n# Restart deployment\r\nkubectl rollout restart deployment aggregator-server -n aggregator-app\r\n\r\n# Or rebuild everything\r\nmake stop\r\nmake containers-all\r\nmake deploy\r\n```\r\n\r\n### Quick Iteration\r\n\r\n```bash\r\n# After code changes\r\nmake stop              # Stop current deployment\r\nmake containers-all    # Rebuild \u0026 reload\r\nmake deploy            # Redeploy\r\n```\r\n\r\n## Architecture\r\n\r\n- **Kind Cluster**: Local Kubernetes cluster in Docker\r\n- **Traefik**: Ingress controller (HTTP port 80)\r\n- **Aggregator Server**: Registration and metadata service\r\n- **Aggregator Cleaner**: Auto-cleanup controller for actor namespaces\r\n- **Dynamic Actors**: Created per user in separate namespaces\r\n\r\n## Ports\r\n\r\n- **Port 80**: HTTP traffic to aggregator (via Traefik)\r\n- **Port 443**: HTTPS traffic (available but not configured)\r\n\r\nAccess: `http://aggregator.local`\r\n\r\n## Integration Tests\r\n\r\nAutomated tests run on GitHub Actions for Linux and Windows on every push and pull request.\r\n\r\n### Run Locally\r\n\r\nIntegration tests use the existing Kind cluster and deployment created by `make init` and `make deploy`.\r\n\r\n```bash\r\n# First-time setup\r\nmake init\r\nmake deploy\r\n\r\n# Run tests (uses existing cluster)\r\nmake integration-test\r\n```\r\n\r\nThe tests will:\r\n- Verify the existing `aggregator` cluster is running\r\n- Check that the aggregator is deployed\r\n- Run all integration tests against `http://aggregator.local`\r\n- Leave the cluster running after tests complete\r\n\r\n### CI/CD\r\n\r\nThe GitHub Actions workflow automatically:\r\n1. Creates a test cluster\r\n2. Builds and loads containers\r\n3. Deploys Traefik and the aggregator\r\n4. Runs the full test suite\r\n5. Cleans up the test cluster\r\n\r\n## Troubleshooting\r\n\r\n### Cluster Issues\r\n\r\n```bash\r\n# Recreate cluster\r\nmake clean\r\nmake init\r\nmake deploy\r\n```\r\n\r\n### Container Build Failures\r\n\r\n```bash\r\n# Build specific container with verbose output\r\ndocker build containers/aggregator-server -t aggregator-server:latest\r\n\r\n# Check logs\r\ndocker logs \u003ccontainer-id\u003e\r\n```\r\n\r\n## Contributing\r\n\r\nIntegration tests run automatically on all pushes and pull requests.\r\nEnsure tests pass before merging.\r\n\r\n## License\r\n\r\nSee LICENSE file for details.\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidlabresearch%2Faggregator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsolidlabresearch%2Faggregator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidlabresearch%2Faggregator/lists"}