{"id":34667400,"url":"https://github.com/comnam90/veeam-data-cloud-services-map","last_synced_at":"2026-05-25T04:05:07.042Z","repository":{"id":327559868,"uuid":"1108812705","full_name":"comnam90/veeam-data-cloud-services-map","owner":"comnam90","description":"Interactive map visualizing Veeam Data Cloud service availability across AWS and Azure regions. Built with Hugo \u0026 Leaflet.js.","archived":false,"fork":false,"pushed_at":"2025-12-05T22:21:21.000Z","size":126,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-07T17:19:12.736Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://comnam90.github.io/veeam-data-cloud-services-map/","language":"HTML","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/comnam90.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-03T00:31:50.000Z","updated_at":"2025-12-05T04:39:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/comnam90/veeam-data-cloud-services-map","commit_stats":null,"previous_names":["comnam90/veeam-data-cloud-services-map"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/comnam90/veeam-data-cloud-services-map","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comnam90%2Fveeam-data-cloud-services-map","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comnam90%2Fveeam-data-cloud-services-map/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comnam90%2Fveeam-data-cloud-services-map/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comnam90%2Fveeam-data-cloud-services-map/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/comnam90","download_url":"https://codeload.github.com/comnam90/veeam-data-cloud-services-map/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comnam90%2Fveeam-data-cloud-services-map/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28006569,"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","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-12-24T19:19:51.925Z","updated_at":"2026-05-25T04:05:07.036Z","avatar_url":"https://github.com/comnam90.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Veeam Cloud Service Map 🗺️\n\n\u003e ⚠️ **Community Project Disclaimer:** This is an unofficial, community-maintained project and is **not affiliated with, endorsed by, or supported by Veeam Software**. The information provided may be incomplete or outdated. Always refer to [official Veeam documentation](https://www.veeam.com/) for authoritative service availability information. Use at your own risk—no warranty or liability is provided.\n\nA lightweight, interactive map to visualize Veeam Data Cloud (VDC) services across AWS and Azure regions. Designed to quickly answer \"Where is X available?\" without navigating complex spreadsheets.\n\n**🎉 New:** Now includes a REST API for programmatic access to service availability data! See the [API Documentation](#-api-documentation) section below.\n\n## 🚀 Tech Stack\n\n* **Framework:** [Hugo](https://gohugo.io/) (Static Site Generator)\n* **Styling:** [Tailwind CSS](https://tailwindcss.com/) (via CDN for simplicity)\n* **Map Engine:** [Leaflet.js](https://leafletjs.com/) (OpenStreetMap/CartoDB Dark Matter tiles)\n* **Data Source:** YAML files in `data/regions/` (No database required)\n\n## 🛠️ Quick Start\n\n### 1. Prerequisites\n\nYou need **Hugo** installed on your machine.\n\n* **Windows (Chocolatey):** `choco install hugo-extended`\n* **macOS (Brew):** `brew install hugo`\n* **Linux:** `sudo apt-get install hugo`\n\n### 2. Run Locally\n\nClone this repo and run the server:\n\n```bash\nhugo server\n````\n\nNavigate to `http://localhost:1313/`. The site will auto-reload when you edit files.\n\n## 📝 Managing Data (The Important Part)\n\nThe map is data-driven. You do not need to touch the HTML to add a new location. Just add a new YAML file to `data/regions/`.\n\n### Adding a New Region\n\n1. Copy the template file: `.github/region-template.yaml`\n2. Place it in the appropriate folder: `data/regions/aws/` or `data/regions/azure/`\n3. Rename following the convention: `{provider}_{region_code}.yaml` (e.g., `aws_us_east_1.yaml`)\n4. Fill in the details and delete any services not available in that region\n\n```yaml\nid: \"aws-us-east-1\"                 # Unique ID\nname: \"US East (N. Virginia)\"       # Display Name\nprovider: \"AWS\"                     # \"AWS\" or \"Azure\" (Case sensitive for icon/color)\ncoords: [38.0339, -78.5079]         # [Latitude, Longitude]\naliases:                            # Optional: searchable alternative names\n  - \"Virginia\"\n  - \"US East\"\n\nservices:\n  # Boolean Service - just mark as available (editions are universal)\n  vdc_m365: true\n\n  # Tiered Service - editions and tiers vary by region\n  vdc_vault:\n    - edition: \"Advanced\"\n      tier: \"Core\"\n    - edition: \"Foundation\"\n      tier: \"Non-Core\"\n```\n\n### Available Keys\n\n**Tiered Services** (edition + tier per region):\n* `vdc_vault` - Veeam Data Cloud Vault (Core/Non-Core pricing tiers)\n\n**Boolean Services** (just `true` if available):\n* `vdc_m365` - VDC for Microsoft 365 (Flex/Express/Premium editions available in all M365 regions)\n* `vdc_entra_id` - VDC for Entra ID\n* `vdc_salesforce` - VDC for Salesforce\n* `vdc_azure_backup` - VDC for Azure\n\n*Note: New service keys will automatically appear in the popup, but you may need to add a matching SVG icon in `layouts/index.html` if you want a custom logo for it.*\n\n## ⚙️ How it Works\n\n1. **Data Injection:** Hugo reads all YAML files in `data/regions` and injects them into the HTML as a JavaScript object `const regions = [...]`.\n2. **Normalization:** A script runs on page load to fix common data entry errors (like strings wrapped in quotes) so the map doesn't crash.\n3. **Rendering:** Leaflet.js loops through this data. If a region matches the active filters (Provider/Service/Tier), it draws a circle marker.\n4. **Popups:** Clicking a marker generates an HTML popup on the fly using the data attributes.\n\n## 🤝 Contributing\n\nFound incorrect or missing data? We have issue templates to make reporting easy:\n\n* **[Report Missing Service](../../issues/new?template=missing-service.yml)** - Service missing from an existing region\n* **[Report Missing Region](../../issues/new?template=missing-region.yml)** - Entire region not on the map\n* **[Report Incorrect Info](../../issues/new?template=incorrect-information.yml)** - Wrong coordinates, tier, etc.\n\nWant to submit a fix directly? PRs welcome! The PR template will guide you through providing source verification.\n\n## 🤖 Automated Region Maintenance\n\nTo keep the map data up-to-date, we've implemented automated scraping and validation of Veeam's official documentation.\n\n### How It Works\n\nA weekly GitHub Actions workflow automatically:\n\n1. **Scrapes** official Veeam Data Cloud pages for service availability:\n   - [Microsoft 365 Protection regions](https://helpcenter.veeam.com/docs/vdc/userguide/m365_region_availability.html)\n   - [Azure Protection regions](https://helpcenter.veeam.com/docs/vdc/userguide/azure_regions.html)\n   - [Entra ID Protection regions](https://helpcenter.veeam.com/docs/vdc/userguide/entra_id_regions.html)\n   - [Salesforce regions](https://helpcenter.veeam.com/docs/vdc/userguide/sf_regions.html)\n   - [Vault regions](https://www.veeam.com/products/veeam-data-cloud/cloud-storage-vault.html) (with edition/tier information)\n\n2. **Compares** scraped data with the repository's region YAML files\n\n3. **Creates GitHub issues** automatically for:\n   - Missing regions found in Veeam docs but not in the repo\n   - Missing services in existing regions\n   - Services that may have been removed (for verification)\n\n4. **Includes VDC Vault** scraping from the Veeam product page with edition (Foundation/Advanced) and tier (Core/Non-Core) information\n\n### Running Locally\n\nYou can test the scraper and issue generator locally:\n\n```bash\n# Scrape Veeam documentation and compare with current data\nnpm run scrape:regions\n\n# Generate issue data from discrepancies (dry run)\nnpm run scrape:issues -- --dry-run\n\n# View the results\ncat region-discrepancies.json\n```\n\n### Workflow Schedule\n\n- **Automated run:** Every Monday at 9:00 AM UTC\n- **Manual trigger:** Available via GitHub Actions UI for testing\n\nIssues created by the automation are labeled with `automated` for easy identification and filtering.\n\n## 🎨 Customization\n\n* **Icons:** defined in the `getServiceIcon()` function in `layouts/index.html`. They are inline SVGs.\n* **Colors:** Provider badge colors are set in `getProviderBadgeColor()`.\n* **Map Style:** The base map is \"CartoDB Dark Matter\". You can change the `L.tileLayer` URL in `index.html` if you want a light mode map.\n\n## 📡 API Documentation\n\nThe map data is also exposed as a REST API for programmatic access. Perfect for CI/CD pipelines, monitoring systems, mobile apps, or automation.\n\n### Base URL\n\n```\nhttps://vdcmap.bcthomas.com\n```\n\n### Interactive Documentation\n\n- **Scalar API Reference:** [/api/docs](https://vdcmap.bcthomas.com/api/docs)\n- **OpenAPI Spec:** [/api/openapi.json](https://vdcmap.bcthomas.com/api/openapi.json)\n\n### Endpoints\n\n#### `GET /api/v1/health`\n\nHealth check with statistics.\n\n**Response:**\n```json\n{\n  \"status\": \"healthy\",\n  \"version\": \"1.0.0\",\n  \"timestamp\": \"2025-01-03T10:30:00Z\",\n  \"environment\": \"production\",\n  \"stats\": {\n    \"totalRegions\": 63,\n    \"awsRegions\": 27,\n    \"azureRegions\": 36\n  }\n}\n```\n\n#### `GET /api/v1/ping`\n\nSimple connectivity test (no data dependencies).\n\n#### `GET /api/v1/services`\n\nList all available VDC services with metadata.\n\n**Response:**\n```json\n{\n  \"services\": [\n    {\n      \"id\": \"vdc_vault\",\n      \"name\": \"Veeam Data Cloud Vault\",\n      \"type\": \"tiered\",\n      \"description\": \"Immutable backup storage with configurable pricing tiers\",\n      \"editions\": [\"Foundation\", \"Advanced\"],\n      \"tiers\": [\"Core\", \"Non-Core\"]\n    },\n    {\n      \"id\": \"vdc_m365\",\n      \"name\": \"VDC for Microsoft 365\",\n      \"type\": \"boolean\",\n      \"description\": \"Backup and recovery for Microsoft 365 data\"\n    }\n    // ... more services\n  ],\n  \"count\": 5\n}\n```\n\n#### `GET /api/v1/regions`\n\nList all cloud regions with optional filters.\n\n**Query Parameters:**\n- `provider` - Filter by cloud provider (`AWS` | `Azure`)\n- `country` - Filter by country name (searches region name and aliases)\n- `service` - Filter by VDC service availability (`vdc_vault` | `vdc_m365` | `vdc_entra_id` | `vdc_salesforce` | `vdc_azure_backup`)\n- `tier` - Filter by pricing tier (`Core` | `Non-Core`) - only for `vdc_vault`\n- `edition` - Filter by edition (`Foundation` | `Advanced`) - only for `vdc_vault`\n\n**Examples:**\n\n```bash\n# All regions\ncurl https://vdcmap.bcthomas.com/api/v1/regions\n\n# All AWS regions\ncurl https://vdcmap.bcthomas.com/api/v1/regions?provider=AWS\n\n# Regions with VDC Vault\ncurl https://vdcmap.bcthomas.com/api/v1/regions?service=vdc_vault\n\n# Japanese regions with VDC Vault Core tier\ncurl https://vdcmap.bcthomas.com/api/v1/regions?country=Japan\u0026service=vdc_vault\u0026tier=Core\n\n# Azure regions with M365 protection\ncurl https://vdcmap.bcthomas.com/api/v1/regions?provider=Azure\u0026service=vdc_m365\n```\n\n**Response:**\n```json\n{\n  \"data\": [\n    {\n      \"id\": \"aws-us-east-1\",\n      \"name\": \"US East 1 (N. Virginia)\",\n      \"provider\": \"AWS\",\n      \"coords\": [38.9, -77.4],\n      \"aliases\": [\"Virginia\", \"N. Virginia\", \"US East\", \"IAD\"],\n      \"services\": {\n        \"vdc_vault\": [\n          {\n            \"edition\": \"Foundation\",\n            \"tier\": \"Core\"\n          },\n          {\n            \"edition\": \"Advanced\",\n            \"tier\": \"Core\"\n          }\n        ]\n      }\n    }\n    // ... more regions\n  ],\n  \"count\": 63,\n  \"filters\": {\n    \"provider\": null,\n    \"country\": null,\n    \"service\": null,\n    \"tier\": null,\n    \"edition\": null\n  }\n}\n```\n\n#### `GET /api/v1/regions/{id}`\n\nGet details for a specific region by ID.\n\n**Example:**\n```bash\ncurl https://vdcmap.bcthomas.com/api/v1/regions/aws-us-east-1\n```\n\n### Response Codes\n\n- `200 OK` - Successful request\n- `400 Bad Request` - Invalid query parameter\n- `404 Not Found` - Region not found\n- `500 Internal Server Error` - Server error\n\n### CORS\n\nAll endpoints support CORS with `Access-Control-Allow-Origin: *` for public access.\n\n### Rate Limiting\n\nCurrently no rate limiting. Please be respectful of the free hosting.\n\n### Development \u0026 Testing\n\n```bash\n# Install dependencies\nnpm install\n\n# Start local development server with API\nnpm run dev\n\n# Run API tests\nnpm test\n\n# Build for production\nnpm run build\n```\n\nThe API is built with Cloudflare Pages Functions and automatically deployed on every push to `main`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomnam90%2Fveeam-data-cloud-services-map","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomnam90%2Fveeam-data-cloud-services-map","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomnam90%2Fveeam-data-cloud-services-map/lists"}