# Termcloud A simple file storage service with user buckets and usage limits. ## Setup 1. Set up PostgreSQL database and run the schema: ```bash psql -d termcloud -f internal/db/schema.sql ``` 2. Configure environment variables (copy `.env.example` to `.env` and customize): ```bash cp .env.example .env # Edit .env with your settings ``` ### Configuration Options | Variable | Default | Description | |----------|---------|-------------| | `DATABASE_URL` | - | PostgreSQL connection string | | `PORT` | 8080 | Server port | | `STORAGE_DIR` | storage | Directory for file storage | | `MAX_FILE_SIZE_MB` | 100 | Maximum file size in MB | | `RATE_LIMIT` | 20.0 | Requests per second limit | | `CORS_ORIGINS` | * | Allowed CORS origins | | `GZIP_LEVEL` | 5 | Gzip compression level (1-9) | | `DB_MAX_CONNECTIONS` | 100 | Maximum database connections | | `DB_MIN_CONNECTIONS` | 10 | Minimum database connections | | `DB_CONN_LIFETIME` | 1h | Connection lifetime | | `DB_CONN_IDLE_TIME` | 1m | Connection idle timeout | | `DB_HEALTH_CHECK_PERIOD` | 5s | Health check interval | | `DEFAULT_STORAGE_LIMIT_GB` | 1 | Default user storage limit | 3. Build and run: ```bash make build make run ``` ## Usage ### Create a user and get API key: ```bash make admin ARGS="create-user mai sakurajima@waifu.club 5" ``` ### API Endpoints All API endpoints require `X-API-Key` header. **Buckets:** - `GET /api/v1/buckets` - List user buckets - `POST /api/v1/buckets` - Create bucket `{"name": "my-bucket"}` - `DELETE /api/v1/buckets/:bucket` - Delete bucket **Objects:** - `GET /api/v1/buckets/:bucket/objects` - List objects in bucket - `PUT /api/v1/buckets/:bucket/objects/*` - Upload file (multipart form with "file" field) - `GET /api/v1/buckets/:bucket/objects/*` - Download file - `DELETE /api/v1/buckets/:bucket/objects/*` - Delete file **User Info:** - `GET /api/v1/user` - Get user info and usage stats ### Example Usage ```bash # Create bucket curl -X POST http://localhost:8080/api/v1/buckets \ -H "X-API-Key: your-api-key" \ -H "Content-Type: application/json" \ -d '{"name": "my-files"}' # Upload file curl -X PUT http://localhost:8080/api/v1/buckets/my-files/objects/test.txt \ -H "X-API-Key: your-api-key" \ -F "file=@test.txt" # Download file curl http://localhost:8080/api/v1/buckets/my-files/objects/test.txt \ -H "X-API-Key: your-api-key" \ -o downloaded.txt ```