Deploying Files Sharing
Introduction
Files Sharing is a straightforward, self-hosted file sharing application designed to make sharing files simple, secure, and private. Built with a focus on ease of use and minimal configuration, Files Sharing provides a clean web interface for uploading, managing, and sharing files without the complexity of heavyweight solutions or the privacy concerns of commercial cloud services.
Files Sharing excels at providing essential functionality with zero friction:
- Simple Upload: Drag-and-drop file uploads with instant shareable links
- Zero Configuration: Works out of the box with sensible defaults
- Clean Interface: Minimalist design that doesn’t get in your way
- Shareable Links: Generate unique links for each uploaded file
- No Account Required: Upload and share without user registration
- Self-Hosted Privacy: Complete control over your files and data
- Lightweight: Minimal resource usage for efficient operation
- Fast Performance: Quick uploads and downloads with no unnecessary overhead
- Mobile Responsive: Works seamlessly on phones, tablets, and desktops
- Direct Access: Recipients download files directly without barriers
- File Management: View, organize, and delete uploaded files
- Storage Limits: Set maximum file sizes and storage quotas
Whether you need a quick way to share files with colleagues, send documents to clients, or provide a simple upload portal for your team, Files Sharing delivers exactly what you need without unnecessary complexity. It’s perfect for individuals and small teams who want file sharing that just works.
This comprehensive guide walks you through deploying Files Sharing on Klutch.sh using Docker, including detailed installation steps, persistent storage configuration, customization options, and production-ready best practices.
What You’ll Learn
- How to deploy Files Sharing with a Dockerfile on Klutch.sh
- Setting up persistent storage for uploaded files
- Configuring environment variables for customization
- Implementing file size limits and storage management
- Best practices for production deployment and security
Prerequisites
Before you begin, ensure you have:
- A Klutch.sh account
- A GitHub account with a repository for your Files Sharing project
- Basic familiarity with Docker and file sharing concepts
- (Optional) Docker installed locally for testing
Understanding Files Sharing Architecture
Files Sharing consists of several key components:
- Web Server: Lightweight HTTP server handling uploads and downloads
- Web Interface: Simple HTML/CSS/JavaScript frontend for file operations
- Storage Layer: File system storage for uploaded files
- Link Generator: Creates unique shareable links for each file
- File Manager: Handles file metadata and organization
The application typically runs on a single HTTP port (usually 3000 or 8080), making it easy to deploy on Klutch.sh with automatic HTTPS.
Step 1: Prepare Your GitHub Repository
-
Create a new GitHub repository for your Files Sharing deployment.
-
Create a
Dockerfilein the root of your repository with the following content: - (Optional) Create an advanced Dockerfile with custom configuration:
- (Optional) Create a
.dockerignorefile: - Create a
README.mdfile with setup information: - Commit and push your changes to GitHub:
FROM node:18-alpine
# Set working directoryWORKDIR /app
# Install git to clone the repositoryRUN apk add --no-cache git
# Clone Files Sharing repositoryRUN git clone https://github.com/filessharing/files-sharing.git .
# Install dependenciesRUN npm install --production
# Create uploads directoryRUN mkdir -p /app/uploads && \ chown -R node:node /app/uploads
# Switch to non-root userUSER node
# Expose HTTP portEXPOSE 3000
# Set environment variablesENV NODE_ENV=productionENV PORT=3000ENV UPLOAD_DIR=/app/uploads
# Health checkHEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD node healthcheck.js || exit 1
# Start the applicationCMD ["npm", "start"]Note: This Dockerfile uses the official Node.js Alpine image for a minimal, secure deployment. Adjust the repository URL if using a different Files Sharing implementation.
FROM node:18-alpine
# Install system dependenciesRUN apk add --no-cache \ git \ ffmpeg \ imagemagick \ && rm -rf /var/cache/apk/*
# Set working directoryWORKDIR /app
# Clone applicationRUN git clone https://github.com/filessharing/files-sharing.git . && \ npm install --production && \ npm cache clean --force
# Create necessary directoriesRUN mkdir -p /app/uploads /app/config /app/logs && \ chown -R node:node /app
# Copy custom configuration if existsCOPY --chown=node:node config.json /app/config/ 2>/dev/null || true
# Switch to non-root userUSER node
# Expose HTTP portEXPOSE 3000
# Environment variablesENV NODE_ENV=productionENV PORT=3000ENV UPLOAD_DIR=/app/uploadsENV CONFIG_DIR=/app/configENV LOG_DIR=/app/logs
# Health checkHEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
# Start applicationCMD ["node", "server.js"].git.github*.mdREADME.md.env.env.localdocker-compose.ymlnode_modules.DS_Storenpm-debug.logyarn-error.log.vscode.idea# Files Sharing Deployment on Klutch.sh
This repository contains the Docker configuration for deploying Files Sharing on Klutch.sh.
## About Files Sharing
Files Sharing is a simple, self-hosted file sharing application with no unnecessary complexity.
## Features
- Simple drag-and-drop file uploads- Instant shareable links- No user registration required- Self-hosted privacy- Lightweight and fast- Mobile responsive design- File management interface
## Initial Setup
1. Deploy on Klutch.sh2. Attach persistent volume for uploads3. Configure environment variables (optional)4. Access the web interface5. Start uploading and sharing files
## Configuration
Set environment variables in Klutch.sh dashboard:- `MAX_FILE_SIZE`: Maximum upload size in bytes- `STORAGE_QUOTA`: Total storage limit- `UPLOAD_DIR`: Directory for uploaded files- `BASE_URL`: Public URL for your deployment
## Documentation
- Files Sharing: https://github.com/filessharing/files-sharing- Klutch.sh: https://docs.klutch.shgit add Dockerfile .dockerignore README.mdgit commit -m "Add Files Sharing Dockerfile for Klutch.sh deployment"git push origin mainStep 2: Create Your App on Klutch.sh
-
Log in to Klutch.sh and navigate to the dashboard.
-
Create a new project (if you don’t have one already) by clicking “New Project” and providing a project name like “File Sharing Platform”.
-
Create a new app within your project by clicking “New App”.
-
Connect your GitHub repository by selecting it from the list of available repositories.
-
Configure the build settings:
- Klutch.sh will automatically detect the Dockerfile in your repository root
- The build will use this Dockerfile automatically
-
Set the internal port to
3000(Files Sharing’s default HTTP port). This is the port that traffic will be routed to within the container. -
Select HTTP traffic for the app’s traffic type.
Step 3: Configure Persistent Storage
Files Sharing requires persistent storage to retain uploaded files across deployments.
-
In your app settings, navigate to the “Volumes” section.
-
Add a persistent volume for uploaded files:
- Mount Path:
/app/uploads - Size: Choose based on your file sharing needs (start with 10 GB, scale as needed)
- Mount Path:
-
(Optional) Add a second persistent volume for logs and configuration:
- Mount Path:
/app/logs - Size: 1 GB is typically sufficient
- Mount Path:
-
Save the volume configuration. This ensures all your uploaded files persist even when the container is restarted or redeployed.
The persistent volume stores:
/app/uploads: All user-uploaded files/app/logs: (Optional) Application logs and access records
For more details on managing persistent storage, see the Volumes Guide.
Step 4: Configure Environment Variables
Files Sharing can be customized using environment variables. Configure these in the Klutch.sh dashboard:
-
In your app settings, navigate to the “Environment Variables” section.
-
Add basic configuration variables:
- Add optional customization variables:
- Optional advanced configuration:
- Mark sensitive values as secrets in the Klutch.sh UI to prevent them from appearing in logs.
# Server configurationPORT=3000NODE_ENV=production
# Public URL (set to your actual app URL)BASE_URL=https://example-app.klutch.sh
# File storage settingsUPLOAD_DIR=/app/uploads
# Upload limits (in bytes)MAX_FILE_SIZE=104857600MAX_TOTAL_SIZE=10737418240
# Timezone configurationTZ=America/New_York# File retention settingsFILE_EXPIRY_DAYS=30AUTO_DELETE_EXPIRED=true
# Upload restrictionsALLOWED_EXTENSIONS=pdf,doc,docx,xls,xlsx,jpg,jpeg,png,gif,zip,tar,gzBLOCKED_EXTENSIONS=exe,bat,sh,ps1
# Rate limitingENABLE_RATE_LIMIT=trueMAX_UPLOADS_PER_HOUR=50
# Interface customizationAPP_TITLE=Files SharingAPP_DESCRIPTION=Simple file sharing platformTHEME_COLOR=#2563eb
# LoggingLOG_LEVEL=infoLOG_FORMAT=jsonENABLE_ACCESS_LOG=true# Storage managementENABLE_COMPRESSION=trueGENERATE_THUMBNAILS=trueTHUMBNAIL_SIZE=200
# Security settingsREQUIRE_PASSWORD=falseALLOW_PUBLIC_UPLOADS=trueENABLE_CAPTCHA=false
# Link generationLINK_LENGTH=8CUSTOM_DOMAIN=files.example.com
# Cleanup settingsCLEANUP_INTERVAL=3600DELETE_EMPTY_FOLDERS=trueImportant Configuration Notes:
- Never commit secrets or API keys to your repository
- Always use Klutch.sh environment variables for configuration
- Set appropriate file size limits to prevent abuse
- Configure retention policies to manage storage
- Enable rate limiting for public deployments
Step 5: Deploy Your Application
-
Review your configuration to ensure all settings are correct:
- Dockerfile is detected
- Internal port is set to
3000 - Persistent volume is mounted to
/app/uploads - Environment variables are configured
- Traffic type is set to HTTP
-
Click “Deploy” to start the build and deployment process.
-
Monitor the build logs to ensure the deployment completes successfully. The build typically takes 2-4 minutes.
-
Wait for the deployment to complete. Once done, you’ll see your app URL (e.g.,
https://example-app.klutch.sh).
Step 6: Getting Started with Files Sharing
-
Access your Files Sharing instance by navigating to your app URL (e.g.,
https://example-app.klutch.sh). -
Upload your first file:
- Click the upload button or drag and drop a file
- Wait for the upload to complete
- Receive your shareable link
-
Copy and share the link:
- Click the “Copy Link” button
- Share with recipients via email, chat, etc.
-
Test the download:
- Open the link in an incognito browser
- Verify the file downloads correctly
- Check file integrity
Sample Usage: Uploading and Sharing Files
Here’s how to use Files Sharing for common tasks:
Basic File Upload
Via Web Interface:
1. Navigate to your Files Sharing URL2. Click "Upload" or drag & drop file3. Wait for upload to complete4. Copy the generated link5. Share the link with recipientsUpload via cURL
Files Sharing provides a simple API for programmatic uploads:
# Upload a filecurl -X POST https://example-app.klutch.sh/upload \ -F "file=@/path/to/document.pdf"
# Response includes download link{ "success": true, "fileId": "abc123xyz", "downloadLink": "https://example-app.klutch.sh/d/abc123xyz", "filename": "document.pdf", "size": 1048576, "uploadedAt": "2025-12-21T15:00:00Z"}Download via cURL
# Download a filecurl -O https://example-app.klutch.sh/d/abc123xyz
# Download with custom filenamecurl -o mydocument.pdf https://example-app.klutch.sh/d/abc123xyz
# Get file informationcurl https://example-app.klutch.sh/api/info/abc123xyzJavaScript Integration
// Files Sharing Upload Clientclass FilesSharingClient { constructor(baseUrl) { this.baseUrl = baseUrl; }
async uploadFile(file, options = {}) { const formData = new FormData(); formData.append('file', file);
// Optional metadata if (options.description) { formData.append('description', options.description); }
if (options.expiryDays) { formData.append('expiryDays', options.expiryDays); }
try { const response = await fetch(`${this.baseUrl}/upload`, { method: 'POST', body: formData });
if (!response.ok) { throw new Error(`Upload failed: ${response.statusText}`); }
return await response.json(); } catch (error) { console.error('Upload error:', error); throw error; } }
async getFileInfo(fileId) { try { const response = await fetch(`${this.baseUrl}/api/info/${fileId}`);
if (!response.ok) { throw new Error(`Failed to get file info: ${response.statusText}`); }
return await response.json(); } catch (error) { console.error('Get info error:', error); throw error; } }
async deleteFile(fileId, deleteToken) { try { const response = await fetch(`${this.baseUrl}/api/delete/${fileId}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: deleteToken }) });
if (!response.ok) { throw new Error(`Delete failed: ${response.statusText}`); }
return await response.json(); } catch (error) { console.error('Delete error:', error); throw error; } }
getDownloadUrl(fileId) { return `${this.baseUrl}/d/${fileId}`; }}
// Usage exampleconst client = new FilesSharingClient('https://example-app.klutch.sh');
// Upload file with progress trackingconst fileInput = document.querySelector('#file-input');fileInput.addEventListener('change', async (e) => { const file = e.target.files[0]; const progressBar = document.querySelector('#progress');
try { const result = await client.uploadFile(file, { description: 'Project documentation', expiryDays: 7 });
console.log('Upload successful!'); console.log('Download link:', result.downloadLink);
// Display shareable link document.querySelector('#share-link').textContent = result.downloadLink; document.querySelector('#share-link').href = result.downloadLink; } catch (error) { console.error('Upload failed:', error); alert('Upload failed. Please try again.'); }});
// Copy link to clipboardfunction copyToClipboard(text) { navigator.clipboard.writeText(text).then(() => { console.log('Link copied to clipboard'); showNotification('Link copied!'); }).catch(err => { console.error('Failed to copy:', err); });}Python Integration
import requestsfrom pathlib import Path
class FilesSharingClient: def __init__(self, base_url): self.base_url = base_url
def upload_file(self, file_path, description=None, expiry_days=None): """ Upload a file to Files Sharing
Args: file_path: Path to the file to upload description: Optional file description expiry_days: Optional expiration in days """ url = f"{self.base_url}/upload"
files = { 'file': open(file_path, 'rb') }
data = {} if description: data['description'] = description
if expiry_days: data['expiryDays'] = expiry_days
try: response = requests.post(url, files=files, data=data) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"Upload failed: {e}") raise finally: files['file'].close()
def download_file(self, file_id, save_path): """ Download a file from Files Sharing
Args: file_id: The file ID from the share link save_path: Where to save the downloaded file """ url = f"{self.base_url}/d/{file_id}"
try: response = requests.get(url, stream=True) response.raise_for_status()
# Get filename from Content-Disposition header content_disposition = response.headers.get('Content-Disposition') if content_disposition: filename = content_disposition.split('filename=')[1].strip('"') else: filename = Path(save_path).name
with open(save_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
print(f"File downloaded successfully to {save_path}") return filename except requests.exceptions.RequestException as e: print(f"Download failed: {e}") raise
def get_file_info(self, file_id): """ Get information about a shared file """ url = f"{self.base_url}/api/info/{file_id}"
try: response = requests.get(url) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"Failed to get file info: {e}") raise
def delete_file(self, file_id, delete_token): """ Delete a file using the delete token """ url = f"{self.base_url}/api/delete/{file_id}"
try: response = requests.delete( url, json={'token': delete_token} ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"Delete failed: {e}") raise
# Usage exampleclient = FilesSharingClient('https://example-app.klutch.sh')
# Upload a fileresult = client.upload_file( 'report.pdf', description='Monthly report', expiry_days=30)
print(f"Upload successful!")print(f"File ID: {result['fileId']}")print(f"Download link: {result['downloadLink']}")print(f"Delete token: {result.get('deleteToken', 'N/A')}")
# Download a fileclient.download_file('abc123xyz', 'downloaded_report.pdf')
# Get file informationinfo = client.get_file_info('abc123xyz')print(f"Filename: {info['filename']}")print(f"Size: {info['size']} bytes")print(f"Uploaded: {info['uploadedAt']}")Production Best Practices
Security
- File Type Restrictions: Block potentially dangerous file types
- Size Limits: Set reasonable maximum file sizes to prevent abuse
- Rate Limiting: Enable rate limiting for public deployments
- HTTPS Only: Always use HTTPS (automatic on Klutch.sh)
- Regular Updates: Keep Files Sharing updated to the latest version
- Access Logs: Enable logging to monitor usage and detect abuse
- Virus Scanning: Consider integrating virus scanning for uploads
- Cleanup Policies: Implement automatic deletion of old files
- Secure Links: Use long, random file IDs to prevent guessing
- No Directory Listing: Ensure uploaded files aren’t browsable
Storage Management
-
Monitor Disk Usage: Regularly check volume capacity and usage
- Set up alerts for 80% capacity
- Plan for storage growth
- Implement quotas if needed
-
Storage Optimization:
- Enable compression for large files
- Set reasonable file size limits
- Implement automatic cleanup policies
- Archive old files if needed
-
Backup Strategy:
- Daily automated backups of upload volume
- Test restore procedures regularly
- Off-site backup storage
- Version control for important files
Performance
-
Resource Allocation: Allocate sufficient resources based on usage
- Small deployments (< 50 uploads/day): 512MB RAM, 1 CPU
- Medium deployments (50-500 uploads/day): 1GB RAM, 2 CPUs
- Large deployments (500+ uploads/day): 2GB+ RAM, 4+ CPUs
-
Optimization Settings:
Terminal window # Node.js memory limitsNODE_OPTIONS=--max-old-space-size=1024# Upload concurrencyMAX_CONCURRENT_UPLOADS=5# Request timeoutREQUEST_TIMEOUT=300000# Body parser limitsBODY_LIMIT=100mb -
Caching: Enable caching for static assets
-
CDN Integration: Consider CDN for serving downloads (optional)
Monitoring
Monitor these key metrics:
- Application Health: Response times, error rates, uptime
- Storage Metrics: Available disk space, total files, storage growth rate
- Resource Usage: CPU, memory, disk I/O, network bandwidth
- Upload Statistics: Number of uploads, file sizes, upload success rate
- Download Metrics: Download count, bandwidth usage, popular files
- Error Tracking: Failed uploads, 404s, server errors
- User Activity: Active users, peak usage times
Troubleshooting
Application Won’t Start
Issue: Container starts but application doesn’t respond
Solutions:
- Verify internal port is set to 3000
- Check application logs in Klutch.sh dashboard
- Ensure persistent volume is properly mounted
- Verify sufficient disk space in volume
- Check for Node.js errors in startup logs
- Verify all required dependencies are installed
Cannot Upload Files
Issue: File uploads fail or timeout
Solutions:
- Check
MAX_FILE_SIZEenvironment variable - Verify upload volume has sufficient free space
- Ensure volume permissions are correct (node user needs write access)
- Review network connectivity
- Check for rate limiting configuration
- Verify body parser limits are appropriate
- Test with smaller files first
Files Not Persisting
Issue: Uploaded files disappear after restart
Solutions:
- Verify persistent volume is attached to correct mount path
- Check volume permissions (node user needs write access)
- Ensure
UPLOAD_DIRenvironment variable matches mount path - Review volume mount configuration in Klutch.sh dashboard
- Check for disk space issues
- Verify volume is not being cleared on restart
Download Links Not Working
Issue: Generated links return 404 or errors
Solutions:
- Verify
BASE_URLenvironment variable is set correctly - Check that files haven’t been deleted or expired
- Ensure file IDs are correct
- Review link format is correct
- Check file permissions
- Verify files exist in upload directory
Slow Upload/Download Performance
Issue: File transfers are slow or timeout
Solutions:
- Increase instance CPU and memory resources
- Check network bandwidth limits
- Optimize upload buffer sizes
- Review concurrent upload limits
- Check volume I/O performance
- Consider using compression
- Monitor resource usage during transfers
Storage Full
Issue: Cannot upload files due to storage limits
Solutions:
- Increase volume size in Klutch.sh dashboard
- Implement automatic cleanup of old files
- Review and adjust retention policies
- Delete unnecessary files
- Enable compression
- Set more aggressive expiration times
High Memory Usage
Issue: Application consuming excessive memory
Solutions:
- Adjust
NODE_OPTIONSfor memory limits - Review concurrent upload settings
- Check for memory leaks in logs
- Restart application periodically
- Optimize file processing
- Increase instance memory allocation
Advanced Configuration
Custom Branding
Customize the interface appearance:
# Branding environment variablesAPP_TITLE=My File SharingAPP_LOGO_URL=https://example.com/logo.pngTHEME_PRIMARY_COLOR=#3b82f6THEME_SECONDARY_COLOR=#10b981FAVICON_URL=https://example.com/favicon.icoFile Expiration Policies
Configure automatic file deletion:
# Expiration settingsDEFAULT_EXPIRY_DAYS=7MAX_EXPIRY_DAYS=365MIN_EXPIRY_DAYS=1AUTO_DELETE_EXPIRED=trueCLEANUP_INTERVAL=3600
# Size-based expirationSMALL_FILE_EXPIRY=30LARGE_FILE_EXPIRY=7SIZE_THRESHOLD=52428800Upload Restrictions
Control what can be uploaded:
# File type restrictionsALLOWED_EXTENSIONS=pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,zip,tar,gz,mp4,mp3BLOCKED_EXTENSIONS=exe,bat,sh,ps1,cmd,scr,vbs,jar,dll
# Enable MIME type validationVALIDATE_MIME_TYPES=trueSTRICT_MIME_CHECK=true
# Size restrictions by typeIMAGE_MAX_SIZE=10485760VIDEO_MAX_SIZE=524288000DOCUMENT_MAX_SIZE=52428800Rate Limiting
Prevent abuse with rate limits:
# Rate limiting configurationENABLE_RATE_LIMIT=true
# Uploads per IPUPLOAD_LIMIT_PER_HOUR=20UPLOAD_LIMIT_PER_DAY=100
# Downloads per IPDOWNLOAD_LIMIT_PER_HOUR=50DOWNLOAD_LIMIT_PER_DAY=500
# API requestsAPI_LIMIT_PER_MINUTE=60
# Ban configurationBAN_AFTER_VIOLATIONS=3BAN_DURATION=3600Email Notifications
Configure email alerts:
# Email configurationENABLE_EMAIL=true
# SMTP settingsSMTP_HOST=smtp.example.comSMTP_PORT=587SMTP_SECURE=trueSMTP_USER=notifications@example.comSMTP_PASSWORD=your-smtp-passwordSMTP_FROM=Files Sharing <noreply@example.com>
# Notification settingsNOTIFY_ON_UPLOAD=falseNOTIFY_ADMIN_ON_UPLOAD=trueNOTIFY_ON_DOWNLOAD=falseADMIN_EMAIL=admin@example.comUpgrading Files Sharing
To upgrade Files Sharing to a new version:
Method 1: Update Dockerfile
-
Update the Dockerfile to use a specific version or latest:
# Pin to specific commit or tagRUN git clone --branch v2.0.0 https://github.com/filessharing/files-sharing.git . -
Commit and push the changes:
Terminal window git add Dockerfilegit commit -m "Upgrade Files Sharing to version 2.0.0"git push origin main -
Redeploy the application through Klutch.sh dashboard.
-
Verify the upgrade was successful:
- Check version in application footer
- Test file upload and download
- Verify existing files are accessible
Pre-Upgrade Checklist
- ✅ Backup persistent volume
- ✅ Review changelog for breaking changes
- ✅ Test upgrade in development environment
- ✅ Notify users of scheduled maintenance
- ✅ Document current configuration
- ✅ Monitor logs after upgrade
- ✅ Test all functionality
Use Cases
Team File Sharing
Quick file sharing within teams:
- Share project files with colleagues
- Distribute meeting recordings
- Exchange large design files
- No email attachment limits
- Track file downloads
Client File Delivery
Deliver files to clients professionally:
- Send project deliverables
- Share reports and documents
- Provide download links in emails
- Professional appearance
- No client account required
Temporary File Hosting
Host files for limited-time needs:
- Event materials and resources
- Conference presentations
- Workshop downloads
- Time-limited access
- Automatic cleanup
Internal File Portal
Provide upload portal for organization:
- Collect files from team members
- Receive documents from partners
- Simple upload interface
- Centralized storage
- Easy access management
Resources
- Files Sharing GitHub Repository
- Files Sharing Documentation
- Klutch.sh Quick Start Guide
- Klutch.sh Volumes Guide
- Klutch.sh Builds Guide
- Klutch.sh Deployments Guide
Conclusion
You now have a fully functional Files Sharing platform running on Klutch.sh with persistent storage, configured settings, and production-ready features. This setup allows you to:
- Upload and share files with simple links
- Manage files through a clean web interface
- Control access with expiration and limits
- Maintain privacy with self-hosted infrastructure
- Scale storage as your needs grow
- Track usage and downloads
Files Sharing on Klutch.sh provides a straightforward, privacy-focused alternative to commercial file sharing services while giving you complete control over your data. With automatic HTTPS, persistent storage, and easy scalability, you have a reliable platform for all your file sharing needs.
For questions or community support, refer to the Files Sharing GitHub Issues or the official documentation.