Storage Configuration
AvantiPoint Packages stores the actual package files (.nupkg) and symbol files (.snupkg) using a configured storage provider. The database stores metadata only.
Supported Storage Providers
- File Storage - Local file system or network share
- Azure Blob Storage - Microsoft Azure cloud storage
- AWS S3 - Amazon Web Services cloud storage
- Google Cloud Storage - Google Cloud object storage
- S3-Compatible Providers - MinIO, LocalStack, Spaces, Wasabi, Backblaze B2, Alibaba OSS
- SFTP - SSH file transfer (legacy / low traffic)
- FTP / FTPS - FTP file transfer (legacy / low traffic)
Connection Strings
Every storage provider can be configured either with its individual settings (under the Storage section) or with a single connection string. A connection string can be supplied two ways:
- Inline — set
Storage:ConnectionString. - By name — set
Storage:ConnectionStringNameto reference an entry under the rootConnectionStringssection (for exampleConnectionStrings__Storage, as supplied by a hosting platform such as .NET Aspire).
When both are present, the inline Storage:ConnectionString wins. Individually configured Storage:* fields take precedence over values parsed from the connection string, so you can combine them.
Format by provider
| Provider | Connection string format |
|---|---|
| Azure Blob | Native Azure Storage connection string (DefaultEndpointsProtocol=...;AccountName=...;AccountKey=...). Container is still set via Storage:Container. |
| AWS S3 | s3://accessKey:secretKey@bucket?region=us-east-1 — for S3-compatible endpoints add &endpoint=http://host:9000&forcePathStyle=true (region defaults to us-east-1). Optional &prefix=. |
| Google Cloud Storage | gs://bucket?credentialsPath=/keys/sa.json&prefix=packages — or emulator gs://bucket?emulatorHost=http://localhost:4443&useEmulator=true. |
| FTP / FTPS | ftp://user:pass@host:21/remotePath (use ftps:// for SSL). Optional query: passive, passiveAddress, connectTimeout, readTimeout. |
| SFTP | sftp://user:pass@host:22/remotePath — optional query: privateKeyPath, privateKeyPassphrase, maxConnections, connectionTimeout, operationTimeout. |
Example (AWS S3 via a named connection string):
{
"ConnectionStrings": {
"Storage": "s3://AKIA...:secret@my-packages-bucket?region=us-east-1"
},
"Storage": {
"Type": "AwsS3",
"ConnectionStringName": "Storage"
}
}
Values with reserved characters (for example a password containing @ or /) must be URL-encoded.
Choosing a Storage Provider
| Feature | File Storage | Azure Blob | AWS S3 | GCS |
|---|---|---|---|---|
| Setup Complexity | Simple | Medium | Medium | Medium |
| Scalability | Limited | Unlimited | Unlimited | Unlimited |
| Multi-Instance | Network share required | Yes | Yes | Yes |
| Cost | Server storage | Pay-as-you-go | Pay-as-you-go | Pay-as-you-go |
| Best For | Development, small deployments | Azure-hosted apps | AWS-hosted apps | GCP-hosted apps |
Directory Structure
All storage providers organize packages in a similar structure:
packages/
newtonsoft.json/
12.0.1/
newtonsoft.json.12.0.1.nupkg
mypackage/
1.0.0/
mypackage.1.0.0.nupkg
symbols/
newtonsoft.json/
12.0.1/
newtonsoft.json.12.0.1.snupkg
This structure allows:
- Easy browsing and debugging
- Simple migration between providers
- Clear organization by package ID and version
Performance Tips
Cloud Storage (Azure Blob / AWS S3)
- Same Region: Use the same region as your application server to minimize latency
- CDN: Enable Azure CDN or CloudFront for global distribution and caching
- Storage Tiers: Use hot tier for frequently accessed packages, cool tier for archives
- Redundancy: Configure appropriate redundancy (LRS, GRS, etc.) based on durability requirements
File Storage
- Fast Disks: Use SSD storage for better I/O performance
- Dedicated Storage: Use dedicated storage to avoid contention with application files
- Network Shares: Use high-speed network connections for multi-instance deployments
- Backup: Implement regular backup procedures (snapshots, rsync, etc.)
Migrating Between Providers
To migrate packages from one storage provider to another:
- Set up the new storage provider with appropriate credentials and configuration
- Copy all files from the old storage to the new storage
- Maintain the same directory structure (
packages/andsymbols/) - Update your configuration to point to the new provider
- Test thoroughly before switching in production
Migration Tools
File to Cloud:
- Azure: Use Azure Storage Explorer or
azcopy - AWS: Use AWS CLI
aws s3 synccommand
Cloud to File:
- Azure: Use
azcopyor Storage Explorer - AWS: Use
aws s3 sync
Cloud to Cloud:
- Use provider-specific migration tools or intermediate file copy
Security Considerations
- Access Control: Ensure storage is not publicly accessible unless intentional
- Encryption: Enable encryption at rest (automatic in Azure and AWS)
- Credentials: Use managed identities (Azure) or instance profiles (AWS) instead of keys
- Network Security: Use private endpoints or VPC peering for internal-only feeds
- Audit Logging: Enable storage audit logs for compliance
Troubleshooting
"Unable to connect to storage"
Check:
- Storage credentials are correct
- Network connectivity to storage endpoint
- Firewall rules allow access
- Managed identity or instance profile permissions
"Permission denied"
Ensure the credentials have:
- Read permissions for package downloads
- Write permissions for package uploads
- List permissions for browsing
Slow Performance
Consider:
- Using storage in the same region as your app
- Enabling CDN for frequently accessed packages
- Upgrading storage tier or I/O limits
- Checking network bandwidth and latency