{"id":26487764,"url":"https://github.com/sebagomez/azurestorageexplorer","last_synced_at":"2025-04-04T09:08:41.041Z","repository":{"id":13968621,"uuid":"16669186","full_name":"sebagomez/azurestorageexplorer","owner":"sebagomez","description":"☁💾 Manage your Azure Storage blobs, tables, queues and file shares from this simple and intuitive web application.","archived":false,"fork":false,"pushed_at":"2024-10-29T12:24:46.000Z","size":12017,"stargazers_count":130,"open_issues_count":3,"forks_count":67,"subscribers_count":16,"default_branch":"main","last_synced_at":"2024-10-29T16:21:36.139Z","etag":null,"topics":["angular","azure","azure-storage","azure-storage-explorer","c-sharp","docker-image","dotnet","hacktoberfest"],"latest_commit_sha":null,"homepage":"https://azurestorage.azurewebsites.net/","language":"C#","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/sebagomez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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":"sebagomez","ko_fi":"sebagomez","open_collective":"azure-storage-explorer"}},"created_at":"2014-02-09T15:41:49.000Z","updated_at":"2024-10-29T12:24:50.000Z","dependencies_parsed_at":"2023-12-19T05:15:07.059Z","dependency_job_id":"13ba7255-8991-4ff9-ba5b-0d809ff48ffe","html_url":"https://github.com/sebagomez/azurestorageexplorer","commit_stats":{"total_commits":425,"total_committers":15,"mean_commits":"28.333333333333332","dds":0.5082352941176471,"last_synced_commit":"71776bf0908ed95ff390435764af952168b06df0"},"previous_names":[],"tags_count":87,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebagomez%2Fazurestorageexplorer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebagomez%2Fazurestorageexplorer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebagomez%2Fazurestorageexplorer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebagomez%2Fazurestorageexplorer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sebagomez","download_url":"https://codeload.github.com/sebagomez/azurestorageexplorer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246660081,"owners_count":20813338,"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":["angular","azure","azure-storage","azure-storage-explorer","c-sharp","docker-image","dotnet","hacktoberfest"],"created_at":"2025-03-20T06:52:57.979Z","updated_at":"2025-04-04T09:08:41.010Z","avatar_url":"https://github.com/sebagomez.png","language":"C#","funding_links":["https://github.com/sponsors/sebagomez","https://ko-fi.com/sebagomez","https://opencollective.com/azure-storage-explorer"],"categories":[],"sub_categories":[],"readme":"[![.NET build](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/dotnet-build.yml/badge.svg)](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/dotnet-build.yml)\n[![Docker build](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/docker-build.yml/badge.svg?branch=main)](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/docker-build.yml)\n[![Helm release](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/helm-release.yml/badge.svg?branch=main)](https://github.com/sebagomez/azurestorageexplorer/actions/workflows/helm-release.yml)\n\n[![Docker Pulls](https://img.shields.io/docker/pulls/sebagomez/azurestorageexplorer.svg)](https://hub.docker.com/r/sebagomez/azurestorageexplorer)\n\n[![justforfunnoreally.dev badge](https://img.shields.io/badge/justforfunnoreally-dev-9ff)](https://justforfunnoreally.dev)\n\nTry it live at https://azurestorage.azurewebsites.net\n\nOr deploy it wherever you want thanks to [docker images](https://hub.docker.com/r/sebagomez/azurestorageexplorer/) (created with GitHub Actions)\n\n\u003cimg src=\"./res/AzureExplorerLogo.png\" alt=\"drawing\" width=\"50\"/\u003e\n\n# Azure Storage Explorer\n\nOriginal blog post from 2009! https://sgomez.blogspot.com/2009/11/mi-first-useful-azure-application.html\n\nAzure Storage Web Explorer makes it easier for developers to browse and manage Blobs, Queues and Tables from Azure Storage. You'll no longer have to install a local client to do that. It was originally developed in C# with asp.net and WebForms 2.0, but now it has been migrated to .NET ~~Core 2.1, 2.2, 3.1, 5.0, 6, 7~~ 8 and ~~Angular~~.  \n\n*Edit:* Sick and tired of all del npm module and dependency hell I moved this project to a Blazor Server app.\n\n\n## Login \n\nTo login just enter your account name and key or [Shared Access Signature](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview), or, a full [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string).  \n\nThe Connection String can also allow you to connect to a local Azurite or potentionally (I have not been able to test it) to Azure Government.\n\n![Login](res/ASE_Login.png)\n\n### Environment Varibales\n\nYou can also set up these fields in environment variables and Azure Storage Explorer will go straight to the home page if it could successfully authenticate.\n\nThese variables are `AZURE_STORAGE_CONNECTIONSTRING`, `AZURE_STORAGE_ACCOUNT`, `AZURE_STORAGE_KEY`, and `AZURE_STORAGE_ENDPOINT`. The connection string takes precedence over the others, meaning if you set it, no more variables will be read. On the other hand, if the connection string variable is not set, all the rest variables will be read and they all have to be present.\n\nIf you want to test it against [Azurite](https://github.com/Azure/Azurite) (either locally, via Docker, Docker Compose, or Kubernetes) you'll have to add the `AZURITE` variable set to `true`.\n\n#### AWS \u0026 GCP\n\nYou can now also manager your AWS and GCP buckets. Just make sure you set the environment variable `CLOUD_PROVIDER` to either `AWS` or `GCP` and you also need to set up a few other environments depending the cloud provider.  \nIf you want to connect to your AWS S3 account, you need to provider three environment variables `AWS_ACCESS_KEY`, `AWS_SECRET_KEY`, and `AWS_REGION`.  \nIf in the other hand you want to connect to GCP, you need to donload the credentials file for your service account and set the `GCP_CREDENTIALS_FILE` environment variable to the full path to that file. \n\n![](./res/AWSExplorer.png)\n\n**This feature is in beta so feel free to provide feedback**\n\n## Exploring\n\n**Blobs**: Create public or private Containers and Blobs (only BlockBlobs for now). Download or delete your blobs.\n\n**Queues**: Create Queues and messages.\n\n**File Shares**: Navigate across File Shares and directories.\n\n**Tables**: Create table and Entities. To create an Entity you'll have to add one property per line in the form of `\u003cPropertyName\u003e='\u003cPropertyValue\u003e'`\n\nIf you don't set PertitionKey or RowKey default values will be used (\"1\" for PartitionKey and a current timestamp for RowKey).  \nFor example to create a new movie:\n\u003e PartitionKey=Action  \nRowKey=1  \nTitle=Die Hard  \n\nYou can also set the desired data type for a specific property setting the desired EEdm datatype as follows:\n\u003e Year=1978   \nYear@odata.type=Edm.Int32\n\nThis will create the `Year` as a 32 bit integer in the table.\n\nAllowed datatypes are the following:\n```\nEdm.Int64\nEdm.Int32\nEdm.Boolean\nEdm.DateTime\nEdm.Double\nEdm.Guid\n```\nAnything else would be treated as a string.\n\nTo query the entities from a table use the following syntax: `\u003cPropertyName\u003e [operator] \u003cProepertyValue\u003e`\nWhere the valid operators are:  *eq* (equals), *gt* (greater than), *ge* (greater or equal), *lt* (less than), *le* (less or equal) and *ne* (not equal).   \nTake a look at the [supported comparaison operators](https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities#supported-comparison-operators)  \nTo query action movies use the following:\n\u003e PartitionKey eq 'Action'  \n\n*Please note there's a \u003ckbd\u003espace\u003c/kbd\u003e character before and after the **eq** operator.*\n\nIf you don't write a query the system will retrieve every Entity on the Table\n\n## Build\n\nTo build this repo make sure you install [.NET 8.0 SDK](https://dotnet.microsoft.com/en-us/download). I'm also using [just](https://github.com/casey/just) and this [justfile](./justfile) to make my life easier.\n\nAt the root of the project, just build ;)\n```sh\njust build\n```\n\n## Run locally\n\n`just publish` will publish the app to a bin folder in the root of the repo. Kestrell will kick in and you'll see in the terminal what port number was asigned, navigate to that port, in my case http://localhost:5000 and that's it!\n\n![CMD](res/local_run.png)\n\n\n## Docker\n\nThere's a docker image at [hub.docker.com](https://hub.docker.com/r/sebagomez/azurestorageexplorer/) that you can use to run this app on the environment of your choice. Keep reading for Kubernetes.\n\nTo spin up a container with the latest version just run the following command\n\n```sh\ndocker run --rm -it -p 8000:8080 sebagomez/azurestorageexplorer\n```\n\nThen open your browser and navigate to http://localhost:8000, et voila!\n\n## Docker Compose\n\nThere's now a Docker Compose manifest in this repo that allows you to spin [Azurite](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio%2Cblob-storage) and Azure Storage web Explorer. In the manifest you can see that the `AZURE_STORAGE_CONNECTIONSTRING` environment variable is already set up to connect to Azurite; so after spinning up the containers you can navigate to http://localhost:8080 and you should be already logged in to Azurite.\n\n\n```sh\njust compose\n```\n\n## Kubernetes\n\nA [deployment]() and a [service]() are available in the [k8s](./k8s/) folder. If you have `kubectl` locally configured with a cluster just apply them and you'll have an instance of Azure Storage Explorer running in your cluster.\n\n```sh\n kubectl apply -f ./k8s\n```\nPort-forward to a local host to easyly test your set up\n\n```sh\nkubectl port-forward svc/azurestorageexplorer 8080:8080\n```\nand access http://localhost:8080\n\n### Helm \n\nAs of version 2.7.1 there's a new Helm chart with this project ready to be deployed in your favorite K8s cluster.  \nIf you want this app to run in your cluster, make sure you have [helm](https://helm.sh/docs/intro/install/) installed on your system.\n\nAdd the repo\n\n```sh\nhelm repo add sebagomez https://sebagomez.github.io/azurestorageexplorer\n```\n\nInstall the chart\n\n```sh\nhelm install azurestorageexplorer sebagomez/azurestorageexplorer\n```\n\nThe helm chart provides a deployment and a service, you can enable port-forwarding to that service with the following command: \n```sh\nkubectl port-forward service/azurestorageexplorer 8080:8080\n```\n\nor, you can follow helm instructions the get the application URL:\n\n```sh\nexport POD_NAME=$(kubectl get pods --namespace default -l \"app.kubernetes.io/name=azurestorageexplorer,app.kubernetes.io/instance=azurestorageexplorer\" -o jsonpath=\"{.items[0].metadata.name}\")\nexport CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath=\"{.spec.containers[0].ports[0].containerPort}\")\necho \"Visit http://127.0.0.1:8080 to use your application\"\n\nkubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT\n```\n\nThanks to [this repo](https://github.com/int128/helm-github-pages) for the info and detailed steps on how to create your own Helm repo with GitHub pages.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebagomez%2Fazurestorageexplorer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsebagomez%2Fazurestorageexplorer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebagomez%2Fazurestorageexplorer/lists"}