Files
afilmory/apps/docs/contents/storage/providers/github.mdx
Innei e8550cee42 feat: enhance tenant management with pagination and sorting options
- Updated the SuperAdminTenantManager component to support pagination and sorting of tenant data.
- Introduced new parameters for fetching tenants, including page, limit, status, sortBy, and sortDir.
- Enhanced the UI to allow users to filter tenants by status and sort by name or creation date.
- Updated localization files to include new strings for tenant filtering and pagination.

Signed-off-by: Innei <tukon479@gmail.com>
2025-12-04 15:54:47 +08:00

137 lines
3.5 KiB
Plaintext

---
title: GitHub Storage
description: Use a GitHub repository as photo storage for simple deployments.
createdAt: 2025-11-14T22:10:00+08:00
lastModified: 2025-12-04T15:54:49+08:00
order: 34
---
# GitHub Storage
GitHub storage is perfect for small galleries, demos, or when you already keep assets in a repository. It's the simplest setup with no additional storage costs.
## Configuration
Configure GitHub storage in `builder.config.ts`:
```typescript
import { defineBuilderConfig } from '@afilmory/builder'
export default defineBuilderConfig(() => ({
storage: {
provider: 'github',
owner: 'your-username',
repo: 'photo-storage',
branch: 'main',
path: 'photos',
useRawUrl: true, // Use raw.githubusercontent.com CDN
},
}))
```
## Environment Variables
Add this to your `.env` file:
```bash
GIT_TOKEN=ghp_your_github_token
```
## Getting a GitHub Token
1. Go to GitHub Settings → Developer settings → Personal access tokens
2. Generate a new token (classic) or fine-grained token
3. For classic tokens, grant `repo` scope (or `public_repo` for public repos)
4. For fine-grained tokens, grant `Contents: Read` permission
5. Copy the token to your `.env` file
## Repository Setup
1. Create a new repository (or use an existing one)
2. Upload your photos to a folder (e.g., `photos/`)
3. Commit and push to your repository
4. Configure the builder with the repository details
## Limitations
**File size limits:**
- GitHub enforces ~100MB per file via API
- Repository size should stay under ~1GB for best performance
- Large collections may hit API rate limits
**Best practices:**
- Keep repositories focused and organized
- Use `path` to scope to a specific folder
- Consider using a separate repository for photos
## Raw URL CDN
Setting `useRawUrl: true` uses GitHub's CDN (`raw.githubusercontent.com`) for public access:
```typescript
useRawUrl: true
```
This provides faster access and better caching for public repositories.
## Custom CDN Domain
For faster access in regions where `raw.githubusercontent.com` is slow, you can configure a custom CDN:
```typescript
import { defineBuilderConfig } from '@afilmory/builder'
export default defineBuilderConfig(() => ({
storage: {
provider: 'github',
owner: 'your-username',
repo: 'photo-storage',
branch: 'main',
path: 'photos',
// Use jsDelivr CDN instead of raw.githubusercontent.com
customDomain: 'cdn.jsdelivr.net/gh/your-username/photo-storage@main',
},
}))
```
**Popular CDN options:**
- **jsDelivr**: `cdn.jsdelivr.net/gh/owner/repo@branch`
- **Statically**: `cdn.statically.io/gh/owner/repo/branch`
- **Custom proxy**: Your own CDN proxy domain
When `customDomain` is set, it takes precedence over `useRawUrl`. The generated URL will be:
```
https://{customDomain}/{path}/{filename}
```
## Private Repositories
For private repositories:
1. Use a classic token with `repo` scope, or
2. Use a fine-grained token with `Contents: Read` permission
3. Ensure the token has access to the repository
## Troubleshooting
**Authentication errors:**
- Verify `GIT_TOKEN` is correct and not expired
- Check that the token has the required permissions
- For private repos, ensure the token has `repo` scope
**Rate limiting:**
- GitHub API has rate limits (5,000 requests/hour for authenticated users)
- Large collections may hit limits during initial sync
- Consider using S3 or B2 for very large collections
**File size errors:**
- Ensure no individual file exceeds ~100MB
- Consider compressing large photos or using a different provider