{"id":22859389,"url":"https://github.com/stevenjdh/aksupport","last_synced_at":"2025-03-31T08:20:17.640Z","repository":{"id":46298961,"uuid":"361578701","full_name":"StevenJDH/AKSupport","owner":"StevenJDH","description":"An automation tool that regularly checks for the current supported status of an AKS cluster to alert and maintain Microsoft support.","archived":false,"fork":false,"pushed_at":"2024-01-18T22:57:46.000Z","size":447,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-06T12:48:00.513Z","etag":null,"topics":["aks","automation","azure","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StevenJDH.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},"funding":{"github":"StevenJDH","custom":["https://www.paypal.me/stevenjdh","https://www.buymeacoffee.com/stevenjdh"]}},"created_at":"2021-04-26T01:12:58.000Z","updated_at":"2022-07-11T22:33:40.000Z","dependencies_parsed_at":"2025-02-06T12:51:37.308Z","dependency_job_id":null,"html_url":"https://github.com/StevenJDH/AKSupport","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenJDH%2FAKSupport","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenJDH%2FAKSupport/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenJDH%2FAKSupport/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenJDH%2FAKSupport/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StevenJDH","download_url":"https://codeload.github.com/StevenJDH/AKSupport/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246436340,"owners_count":20776995,"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","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":["aks","automation","azure","kubernetes"],"created_at":"2024-12-13T09:06:49.334Z","updated_at":"2025-03-31T08:20:17.618Z","avatar_url":"https://github.com/StevenJDH.png","language":"C#","readme":"# AKSupport\n\n[![build](https://github.com/StevenJDH/AKSupport/actions/workflows/dotnet-sonar-container-workflow.yml/badge.svg?branch=main)](https://github.com/StevenJDH/AKSupport/actions/workflows/dotnet-sonar-container-workflow.yml)\n![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/StevenJDH/AKSupport?include_prereleases)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/15ee917d85e94a3a95f213f923a0b7ba)](https://www.codacy.com/gh/StevenJDH/AKSupport/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=StevenJDH/AKSupport\u0026amp;utm_campaign=Badge_Grade)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Sonar Violations (long format)](https://img.shields.io/sonar/violations/StevenJDH_AKSupport?format=long\u0026server=https%3A%2F%2Fsonarcloud.io)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=StevenJDH_AKSupport\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=StevenJDH_AKSupport)\n![Maintenance](https://img.shields.io/maintenance/yes/2024)\n![GitHub](https://img.shields.io/github/license/StevenJDH/AKSupport)\n\nAKSupport is an automation tool that regularly checks for the current supported status of an AKS cluster to alert those interested that an upgrade is needed to maintain Microsoft support. In other words, rather than always manually checking different AKS clusters across multiple environments to keep up with the [Kubernetes version support policy](https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions#kubernetes-version-support-policy), AKSupport will manage all of this for you. This also covers situations where a supported version is pulled early by Microsoft due to security concerns or other critical issues, which they reserve the right to do. In the end, the goal is to free people up for other value-add tasks by keeping things simple for the many uses cases that can benefit from such a tool like general maintenance, Infrastructure as Code (IaC) deployments, etc.\n\n[![Buy me a coffee](https://img.shields.io/static/v1?label=Buy%20me%20a\u0026message=coffee\u0026color=important\u0026style=flat\u0026logo=buy-me-a-coffee\u0026logoColor=white)](https://www.buymeacoffee.com/stevenjdh)\n\nReleases: [https://github.com/StevenJDH/AKSupport/releases](https://github.com/StevenJDH/AKSupport/releases)\n\n## Features\n* Out of support and near end of support checking.\n* Works with all regions where AKS is available.\n* Azure Monitor integration via Container Insights.\n* Office Mail integration via Microsoft Graph API.\n* Teams integration via a channel's incoming webhook.\n* Customizable avatar image for local company branding.\n\n## Prerequisites\n* An Azure Kubernetes Service (AKS) cluster.\n* [Container Insights](https://docs.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-enable-new-cluster) enabled for Log alert rules only.\n* Latest version of [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli).\n* An Azure [Service Principal](https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az_ad_sp_create_for_rbac) for API access.\n* An Office 365 tenant with Service Principal for Mail and Teams features.\n* A [supported Office 365 version or Outlook client](https://docs.microsoft.com/en-us/outlook/actionable-messages/#outlook-version-requirements-for-actionable-messages) for actionable message cards.\n* [Helm v3](https://github.com/helm/helm/releases) installed to optionally deploy with the [AKSupport Helm Chart](https://github.com/StevenJDH/helm-charts/tree/main/charts/aksupport).\n* [Terraform](https://www.terraform.io/downloads.html) 1.30.x or above for POC only.\n\n## Container registries\nAKSupport container images are currently hosted on the following platforms:\n\n* [Docker Hub](https://hub.docker.com/r/stevenjdh/aksupport)\n* [Amazon Elastic Container Registry (ECR)](https://gallery.ecr.aws/stevenjdh/aksupport)\n* [GitHub Container Registry](https://github.com/users/StevenJDH/packages/container/package/aksupport)\n\nFor production use cases, it is not recommended to pull an image with the `:latest` tag, or no tag since these are equivalent. And yes, it is ironic storing an image meant for Azure on AWS, but they offer free storage.😏\n\n## App registration\nBefore deploying AKSupport, create an app registration along with the needed API permissions. To do this, open a console window, and type `az ad sp create-for-rbac -n \"AKSupport\" --role contributor` to create a [Service Principal](https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az_ad_sp_create_for_rbac) in Azure. Use `--skip-assignment` to skip the role assignment if a more specific role and or scope is needed, and then follow the [Steps to assign an Azure role](https://docs.microsoft.com/en-us/azure/role-based-access-control/role-assignments-steps) article. The output from the command should look similar to the following:\n\n```json\n{\n   \"appId\": \"...\",\n   \"displayName\": \"AKSupport\",\n   \"password\": \"...\",\n   \"tenant\": \"...\"\n}\n```\n\n## Helm chart\nAKSupport can be optionally deployed to an AKS cluster using the [AKSupport Helm Chart](https://github.com/StevenJDH/helm-charts/tree/main/charts/aksupport) that is managed in a separate repository. All of the features described below are supported by this chart and the [Terraform POC](#terraform).\n\n## Manual setup\nThe following are the steps needed to set up AKSupport manually in AKS:\n\n1. Create a Kubernetes Secret in AKS for the SP `password` by typing:\n\n   ```bash\n   kubectl create secret generic aksupport-secret --from-literal=AZURE_APP_PASSWORD=\u003cpassword\u003e\n   ```\n\n2. Create a Kubernetes ConfigMap in AKS for the SP appId and tenant fields along with the AKS subscription ID and region by typing:\n\n   ```bash\n   kubectl create configmap aksupport-config --from-literal=AZURE_SUBSCRIPTION_ID=\u003csubscriptionId\u003e \\\n       --from-literal=AZURE_APP_TENANT=\u003ctenant\u003e \\\n       --from-literal=AZURE_APP_ID=\u003cappId\u003e \\\n       --from-literal=AZURE_AKS_REGION=\u003cregion\u003e\n   ```\n\n3. Create a Kubernetes CronJob in AKS for AKSupport by using the following command and provided definition:\n\n   ```bash\n   kubectl create -f https://raw.githubusercontent.com/StevenJDH/AKSupport/main/YAML/aksupport-cronjob.yaml\n   ```\n\n4. Assuming everything was set up correctly, AKSupport will run at the default configured time via the CronJob at 8:00am every morning. You will also need to [configure at least one](#configuring-notifications) notification method to receive notifications. To confirm the creation of the AKSupport CronJob, type:\n\n   ```bash\n   kubectl get cronjobs\n   ```\n\nIn addition to the imperative commands used to create the Secret and the ConfigMap above, YAML versions have also been provided if a declarative approach is preferred. Just remember to [Base64 encode](https://www.base64encode.net/) any values defined in the Secret when using YAML.\n\n## Configuring notifications\nAKSupport currently supports integrating with Azure Monitor, Teams, and Office Mail as inclusive methods for issuing notifications when the support status of a cluster requires attention. The method or methods chosen will depend on preference and any security policies that an individual or organization must follow.\n\n### Azure Monitor integration\nThis integration is the most flexible because, although it uses Container Insights, it can use any third-party equivalent tool or service to implement any custom logic needed for the notifications, and it is easier to implement in terms of company security policies. To enable the integration support with Azure Monitor, perform the following steps:\n\n1. In the [Azure Portal](https://portal.azure.com), open the AKS cluster resource where AKSupport is installed.\n2. Select the `Logs` blade under the `Monitoring` section.\n3. Close the query suggestion window that appears, and paste the following Kusto (KQL) query:\n\n   ```kusto\n   ContainerInventory\n   | where TimeGenerated \u003e ago(1d)\n   | where Image == \"aksupport\" and ExitCode \u003e 0 and ContainerState == \"Failed\"\n   | top 10 by FinishedTime desc\n   | project Computer, ContainerHostname, Image, ImageTag, ContainerState, ExitCode, \n   StartedTime, FinishedTime\n   ```\n\n4. Click `New alert rule` located at the top of the query window.\n5. Configure the rule using following screenshot as an example:\n\n   \u003cimg src=\"Images/Create-Rule.jpg\" alt=\"Create Rule Screenshot\" title=\"Screenshot\" width=\"550\"/\u003e\n\n6. Click `Next: Actions \u003e` below, and select or create a new action group. If you are creating a new action group, under the `Notifications` tab, select the `Email\\SMS message\\Push\\Voice` option to get the window that will let you use any of these features.\n7. Finally, before finishing the rule creation process, make sure to enable `Mute actions` with the desired period of time in the `Advance options` section under the `Details` tab.\n\nOnce configured, the alert rule will trigger the logic defined in the action group anytime AKSupport detects a support related issue with the AKS cluster. Similar steps can be applied for other tool like [Grafana's Alert notifications](https://grafana.com/docs/grafana/latest/alerting/notifications/), which provides even more upstream integrations.\n\n### Teams integration \n\n\u003cimg src=\"Images/Teams.png\" alt=\"Teams Notification Screenshot\" title=\"Screenshot\" width=\"600\"/\u003e\n\nTo enable the integration support with Teams, [add an incoming webhook to a Teams channel](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook#add-an-incoming-webhook-to-a-teams-channel) for where you would like to receive the AKSupport notifications. Name the webhook `AKSupport`, and recreate the Secret created in the [Usage](#usage) section to include the `TEAMS_CHANNEL_WEBHOOK_URL` key with the generated webhook URL as its value. Add `AVATAR_IMAGE_URL`, `AZURE_AKS_CLUSTER_NAME`, and `AZURE_AKS_CLUSTER_URL` as additional keys to the ConfigMap from the same section to define the notification avatar image, cluster name, and Azure Portal URL for the cluster. The following is an example with the additional keys:\n\n**Secret:**\n\n   ```bash\n   kubectl create secret generic aksupport-secret --from-literal=AZURE_APP_PASSWORD=\u003cpassword\u003e \\\n       --from-literal=TEAMS_CHANNEL_WEBHOOK_URL=\u003cincoming-webhook-url\u003e\n   ```\n\n**ConfigMap:**\n\n   ```bash\n   kubectl create configmap aksupport-config --from-literal=AZURE_SUBSCRIPTION_ID=\u003csubscriptionId\u003e \\\n       --from-literal=AZURE_APP_TENANT=\u003ctenant\u003e \\\n       --from-literal=AZURE_APP_ID=\u003cappId\u003e \\\n       --from-literal=AZURE_AKS_REGION=\u003cregion\u003e \\\n       --from-literal=AVATAR_IMAGE_URL=https://raw.githubusercontent.com/StevenJDH/AKSupport/main/Avatars/aksupport-256x256-transparent-bg.png \\\n       --from-literal=AZURE_AKS_CLUSTER_NAME=\u003ccluster-name\u003e \\\n       --from-literal=AZURE_AKS_CLUSTER_URL=\u003ccluster-url\u003e\n   ```\n\nNotifications that arrive to the defined Teams channel will use the Message Card format, since Adaptive Cards are still not supported for incoming webhooks, but the experience is the same. As a reminder, the incoming webhook URL should not be shared outside of its intended use.\n\n### Office Mail integration\n\n\u003cimg src=\"Images/Mail.png\" alt=\"Mail Notification Screenshot\" title=\"Screenshot\" width=\"600\"/\u003e\n\nTo enable the integration with Office Mail, a separate Service Principal needs to be created first for an Office Tenant, not an Azure Tenant. The easiest way to do this is from the [Office 365 Active Directory](https://aad.portal.azure.com) page using the [App registrations](https://aad.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) blade if the tenant is not located in an Azure subscription. Perform the following steps to set up the Service Principal with the correct permissions:\n\n1. Register a new app to create the SP, and call it `AKSupport`.\n2. After the app is created, click on it, and under `Certificates \u0026 secrets`, generate an new client secret with `rbac` as the description and whatever is needed for the expiration time.\n3. Under `API permissions`, click `Add a permission`, and select `Microsoft Graph` followed by `Application permissions`.\n4. Search for `Mail.Send`, select it, and click `Add permission`. Admin consent is needed for the permission to take effect.\n\nWith the Application (Client) ID and Directory (Tenant) ID from the Overview blade, and the Client Secret (Password) created earlier, AKSupport can now be configured for mail. Recreate the Secret created in the [Usage](#usage) or the [Teams integration](#teams-integration) section to include the `MAIL_APP_PASSWORD` key with the client secret just created as its value. Add `MAIL_APP_TENANT`, `MAIL_APP_ID`, `MAIL_SENDER_ID`, `MAIL_RECIPIENT_ADDRESS`, `AVATAR_IMAGE_URL`, `AZURE_AKS_CLUSTER_NAME`, and`AZURE_AKS_CLUSTER_URL` as additional keys to the ConfigMap from the same section to define the remaining SP details, the sender and recipient email addresses for mail, and the avatar image and cluster details if not already present. The end result without the Teams configuration for brevity should look like the following:\n\n**Secret:**\n\n   ```bash\n   kubectl create secret generic aksupport-secret --from-literal=AZURE_APP_PASSWORD=\u003cpassword\u003e \\\n       --from-literal=MAIL_APP_PASSWORD=\u003cpassword\u003e\n   ```\n\n**ConfigMap:**\n\n   ```bash\n   kubectl create configmap aksupport-config --from-literal=AZURE_SUBSCRIPTION_ID=\u003csubscriptionId\u003e \\\n       --from-literal=AZURE_APP_TENANT=\u003ctenant\u003e \\\n       --from-literal=AZURE_APP_ID=\u003cappId\u003e \\\n       --from-literal=AZURE_AKS_REGION=\u003cregion\u003e \\\n       --from-literal=MAIL_APP_TENANT=\u003coffice-tenant\u003e \\\n       --from-literal=MAIL_APP_ID=\u003coffice-appId\u003e \\\n       --from-literal=MAIL_SENDER_ID=\u003cobjectId-or-email-address\u003e \\\n       --from-literal=MAIL_RECIPIENT_ADDRESS=\u003cemail-address\u003e \\\n       --from-literal=AVATAR_IMAGE_URL=https://raw.githubusercontent.com/StevenJDH/AKSupport/main/Avatars/aksupport-256x256-transparent-bg.png \\\n       --from-literal=AZURE_AKS_CLUSTER_NAME=\u003ccluster-name\u003e \\\n       --from-literal=AZURE_AKS_CLUSTER_URL=\u003ccluster-url\u003e\n   ```\n\u003e 📝**NOTE:** For `MAIL_SENDER_ID`, it is recommended to use the user's `Object ID` for privacy as opposed to their email address. See [Find the user object ID](https://docs.microsoft.com/en-us/partner-center/find-ids-and-domain-names#find-the-user-object-id) for more information.\n\nNotifications that arrive to the defined recipient email address will use the Adaptive Card format for [Actionable Messages](https://docs.microsoft.com/en-us/outlook/actionable-messages/#outlook-version-requirements-for-actionable-messages). Finally, as an additional security step, since this mail workflow uses the `Application permissions` approach instead of the `Delegated permissions` approach, an application security policy should be implemented to restrict access to one user account for sender as opposed to any user account, which is the default. See [Scoping application permissions to specific Exchange Online mailboxes](https://docs.microsoft.com/en-us/graph/auth-limit-mailbox-access) for steps on how to create the needed policy.\n\n## Exit codes\nEvery time that AKSupport finishes its checks, it will return one of three exit codes. To view the last exit code, type:\n\n```bash\nkubectl get pod \u003caksupport-cronjob-00-00\u003e --output=\"jsonpath={.status.containerStatuses[].state.terminated.exitCode}\"\n```\n\nExit codes can be useful for alert rules configured in Azure or other monitoring tools to perform additional tasks like triggering an action group that can send out an SMS or Email notification, or call an Azure Function that creates a ticket in Jira.\n\n|Exit Code  |Meaning                                                                       \n|:---------:|:--------------\n|0          |The version of Kubernetes in AKS is still supported.\n|1          |The application failed due to an error.\n|2          |The version of Kubernetes in AKS is not supported.\n|3          |The version of Kubernetes in AKS is about to lose support.\n\n## Testing\nTo test AKSupport with a specific version to see if it works correctly, edit the [CronJob definition](https://raw.githubusercontent.com/StevenJDH/AKSupport/main/YAML/aksupport-cronjob.yaml) by uncommenting the `args` section like below, and by adding the desired version in quotes.\n\n```yaml\n...\ncontainers:\n- name: aksupport\n  image: public.ecr.aws/stevenjdh/aksupport\n  # Uncomment below for testing a specific version.\n  args:\n  - \"1.17.0\"\n...\n```\n\nAlso, change the `schedule` field to `* * * * *` to run AKSupport every minute while testing or to any other [cron expression](https://crontab.guru/) as needed. Use `az aks get-versions --location \u003cregion\u003e --output table` to see what versions are currently supported for a particular region and their upgrade paths as a reference.\n\n## Additional information\nWhen AKSupport finishes checking the environment, the underlying Pod will either have a `Completed` status or an `Error` status by design. Only the last state will be visible at any given time. To view the logs for the last run of the Pod, type:\n\n```bash\nkubectl logs \u003caksupport-cronjob-00-00\u003e\n```\n\nIn the logs, there will be additional information for the result of the check or any errors that occurred.\n\n## Terraform\nIncluded is a POC created using Terraform for Infrastructure as Code (IaC) to quickly create a working test environment. The POC includes an AKS instance, Container Insights, an Action Group for email alerts, and all the Kubernetes resources, but the Azure Monitor [Log alert rule](#azure-monitor-integration) will have to be created manually if needed as this is [not yet supported](https://github.com/terraform-providers/terraform-provider-azurerm/issues/4395). To create the POC, perform the following steps:\n\n1. Change to the `Terraform` directory, and initialize the POC:\n   \n   ```bash\n   terraform init\n   ```\n\n2. Create a new plan with only Azure Monitor integration:\n\n   ```bash\n   terraform plan -var app_tenant_id=xxx -var app_id=xxx -var app_password=xxx -var mail_recipient_address=xxx -out aksupport.tfplan\n   ```\n\n3. Create the resources based on the plan:\n\n   ```bash\n   terraform apply \"aksupport.tfplan\"\n   ```\n\n4. Explore the POC, and when done, delete it using the same variables as before:\n\n   ```bash\n   terraform destroy -var app_tenant_id=xxx -var app_id=xxx -var app_password=xxx -var mail_recipient_address=xxx\n   ```\n\nThe `mail_recipient_address` variable controls whether an action group is created for the Azure Monitor integration, like Container Insights. If this is not needed, and the Office Mail configuration is not being used, then remove the `mail_recipient_address` variable from the commands above. The `variables.tf` file contains additional variables needed to enable other supported features. For example, to test with a specific version like in the [Testing](#testing) section, add `-var version_test=1.17.0` to the `terraform plan` and `terraform destroy` steps.\n\n## Disclaimer\nAKSupport is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\n## Contributing\nThanks for your interest in contributing! There are many ways to contribute to this project. Get started [here](https://github.com/StevenJDH/.github/blob/main/docs/CONTRIBUTING.md).\n\n## Do you have any questions?\nMany commonly asked questions are answered in the FAQ:\n[https://github.com/StevenJDH/AKSupport/wiki/FAQ](https://github.com/StevenJDH/AKSupport/wiki/FAQ)\n\n## Need to contact me?\nFeel free to contact me with any questions you may have, and I'll make sure to answer them as soon as possible!\n\n| Platform  | Link        |\n|:----------|:------------|\n| 💬 Instant Message Chat (preferred) | [![Discord Banner](https://discord.com/api/guilds/851210657318961233/widget.png?style=banner2)](https://discord.gg/VzzzjetTkT)\n\n## Want to show your support?\n\n|Method       | Address                                                                                                    |\n|------------:|:-----------------------------------------------------------------------------------------------------------|\n|PayPal:      | [https://www.paypal.me/stevenjdh](https://www.paypal.me/stevenjdh \"Steven's Paypal Page\")                  |\n|Bitcoin:     | 3GyeQvN6imXEHVcdwrZwKHLZNGdnXeDfw2                                                                         |\n|Litecoin:    | MAJtR4ccdyUQtiiBpg9PwF2AZ6Xbk5ioLm                                                                         |\n|Ethereum:    | 0xa62b53c1d49f9C481e20E5675fbffDab2Fcda82E                                                                 |\n|Dash:        | Xw5bDL93fFNHe9FAGHV4hjoGfDpfwsqAAj                                                                         |\n|Zcash:       | t1a2Kr3jFv8WksgPBcMZFwiYM8Hn5QCMAs5                                                                        |\n|PIVX:        | DQq2qeny1TveZDcZFWwQVGdKchFGtzeieU                                                                         |\n|Ripple:      | rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh\u003cbr /\u003eDestination Tag: 2357564055                                        |\n|Monero:      | 4GdoN7NCTi8a5gZug7PrwZNKjvHFmKeV11L6pNJPgj5QNEHsN6eeX3D\u003cbr /\u003e\u0026#8618;aAQFwZ1ufD4LYCZKArktt113W7QjWvQ7CWDXrwM8yCGgEdhV3Wt|\n\n\n// Steven Jenkins De Haro (\"StevenJDH\" on GitHub)\n","funding_links":["https://github.com/sponsors/StevenJDH","https://www.paypal.me/stevenjdh","https://www.buymeacoffee.com/stevenjdh"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevenjdh%2Faksupport","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevenjdh%2Faksupport","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevenjdh%2Faksupport/lists"}