A production-ready, self-hosted alternative to Amazon S3
Vision Complete - All v1-v5 features implemented!
Quick Start β’ Features β’ Installation β’ Documentation β’ Contributing
OpenEndpoint is a fully S3-compatible object storage platform designed for developers who need:
- Full S3 API compatibility - Works with existing AWS SDKs and tools
- Self-hosted deployment - Complete control over your data
- Production-ready - 600+ tests, 90%+ coverage, security-hardened
- Developer-friendly - Simple setup, intuitive CLI, web dashboard
| Feature | Description |
|---|---|
| πΉ S3 Compatible API | Full compatibility with AWS S3 REST API |
| πΉ Multiple Backends | FlatFile storage, Pebble/BBolt metadata |
| πΉ Object Versioning | Keep multiple versions of objects |
| πΉ Multipart Uploads | Upload large files in parallel chunks |
| πΉ Object Locking | WORM compliance (GOVERNANCE/COMPLIANCE) |
| πΉ Object Tagging | Categorize and manage objects with tags |
| Feature | Description |
|---|---|
| π AWS Signature V4 | Industry-standard authentication |
| π AWS Signature V2 | Legacy client compatibility |
| π Presigned URLs | Time-limited access without credentials |
| π Server-Side Encryption | AES-256-GCM encryption at rest |
| π Bucket Policies | Fine-grained access control |
| π CORS Configuration | Cross-origin resource sharing |
| Feature | Description |
|---|---|
| π¦ Lifecycle Policies | Automated expiration and transitions |
| π¦ Replication | Cross-region data replication |
| π¦ Quota Management | Per-bucket storage limits |
| π¦ Data Deduplication | Content-aware storage optimization |
| Feature | Description |
|---|---|
| π Web Dashboard | Visual management interface |
| π Prometheus Metrics | Comprehensive monitoring |
| π Health Endpoints | Kubernetes-ready probes |
| π Audit Logging | Complete access tracking |
| π CLI Tools | Full command-line management |
| Metric | Value |
|---|---|
| Source Files | 80+ Go files |
| Test Files | 50+ |
| Test Functions | 600+ |
| Test Lines | 15,000+ |
| Package Coverage | 90%+ |
| Test Success Rate | 100% (49/49 packages) |
| Security Fixes | 23 |
curl -fsSL https://raw.githubusercontent.com/openendpoint/openendpoint/main/setup.sh | bashirm https://raw.githubusercontent.com/openendpoint/openendpoint/main/setup.ps1 | iexpowershell -Command "irm https://raw.githubusercontent.com/openendpoint/openendpoint/main/setup.ps1 | iex"Or download and run locally:
# Linux/macOS
git clone https://github.com/openendpoint/openendpoint.git
cd openendpoint
chmod +x setup.sh
./setup.sh
# Windows (PowerShell Admin)
git clone https://github.com/openendpoint/openendpoint.git
cd openendpoint
.\setup.ps1The setup script will:
- Detect your operating system and architecture
- Install Docker (if not present) or binary
- Generate secure random credentials
- Create configuration files
- Start the service
- Display access information
# Pull and run
docker run -d \
--name openendpoint \
-p 9000:9000 \
-e OPENEP_AUTH_ACCESS_KEY=minioadmin \
-e OPENEP_AUTH_SECRET_KEY=minioadmin \
-v /data/openendpoint:/data \
openendpoint/openendpoint:1.0.0
# Check status
docker logs openendpoint
# Access the API
curl http://localhost:9000# Download latest release
curl -sL https://github.com/openendpoint/openendpoint/releases/download/v1.0.0/openep-linux-amd64.tar.gz | tar xz
# Create config
cat > config.yaml << EOF
server:
host: "0.0.0.0"
port: 9000
auth:
access_key: "minioadmin"
secret_key: "minioadmin"
storage:
data_dir: "/data"
EOF
# Run
./openep server --config config.yaml# Clone
git clone https://github.com/openendpoint/openendpoint.git
cd openendpoint
# Build
go build -o bin/openep.exe ./cmd/openep
# Run
./bin/openep server --config config.example.yamlserver:
host: "0.0.0.0"
port: 9000
auth:
access_key: "your-access-key"
secret_key: "your-secret-key"
storage:
data_dir: "/data"server:
host: "0.0.0.0"
port: 9000
read_timeout: 30
write_timeout: 30
idle_timeout: 60
auth:
access_key: "your-access-key"
secret_key: "your-secret-key"
session_expiry: 24
storage:
data_dir: "/data"
max_object_size: 5368709120 # 5GB
max_buckets: 100
enable_compression: false
storage_backend: "flatfile"
logging:
level: "info"
format: "json"
output: "/var/log/openendpoint/app.log"
audit:
enabled: true
path: "/var/log/openendpoint/audit"
max_size: 10485760
max_backups: 10
rate_limit:
enabled: true
requests_per_second: 100
burst: 1000# Configure AWS CLI
aws configure set aws_access_key_id minioadmin
aws configure set aws_secret_access_key minioadmin
aws configure set default.region us-east-1
# Create bucket
aws --endpoint-url http://localhost:9000 s3 mb s3://my-bucket
# Upload file
aws --endpoint-url http://localhost:9000 s3 cp ./file.txt s3://my-bucket/
# List objects
aws --endpoint-url http://localhost:9000 s3 ls s3://my-bucket/
# Download file
aws --endpoint-url http://localhost:9000 s3 cp s3://my-bucket/file.txt ./
# Sync directory
aws --endpoint-url http://localhost:9000 s3 sync ./local-dir s3://my-bucket/remote-dir/import boto3
s3 = boto3.client(
's3',
endpoint_url='http://localhost:9000',
aws_access_key_id='minioadmin',
aws_secret_access_key='minioadmin',
)
# Create bucket
s3.create_bucket(Bucket='my-bucket')
# Upload file
s3.upload_file('local.txt', 'my-bucket', 'remote.txt')
# Download file
s3.download_file('my-bucket', 'remote.txt', 'local.txt')
# List objects
response = s3.list_objects_v2(Bucket='my-bucket')
for obj in response.get('Contents', []):
print(obj['Key'])package main
import (
"context"
"fmt"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String("http://localhost:9000")
})
// List buckets
resp, _ := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
for _, bucket := range resp.Buckets {
fmt.Println(*bucket.Name)
}
}All 49 packages pass tests with 100% success rate.
# Run all tests
go test ./...
# Run with coverage
go test ./... -cover
# Run with race detector
go test -race ./...
# Run specific package tests
go test -v ./internal/storage/flatfile/...
# Run benchmarks
go test -bench=. ./...| Category | Coverage |
|---|---|
| Overall | ~90% |
| Core Packages | 85-95% |
| CLI Commands | ~67% |
| API Handlers | ~73% |
| Management API | ~84% |
Note: Some functions like main(), runServer(), and runMonitorWatch() cannot be unit tested as they start actual servers or run infinite loops. These are tested through integration tests.
OpenEndpoint uses comprehensive GitHub Actions workflows for continuous integration and deployment.
| Workflow | Trigger | Purpose |
|---|---|---|
| CI | Push, PR | Lint, test, build, security scan |
| Release | Tag push | Multi-platform binaries, Docker images, signed releases |
| Deploy | Manual, Release | Staging/production deployment with canary |
| Changelog | PR merge | Auto-update CHANGELOG.md |
| Dependencies | Weekly | Automated dependency updates |
| Code Quality | Daily | Coverage, static analysis, benchmarks |
# Automatic release on tag push
git tag v1.0.0
git push origin v1.0.0
# Or manual via GitHub Actions
# Actions β Release β Run workflow- Staging: Auto-deploys on release completion
- Production: Manual trigger with confirmation
See .github/workflows/README.md for detailed configuration.
version: '3.8'
services:
openendpoint:
image: openendpoint/openendpoint:1.0.0
ports:
- "9000:9000"
environment:
- OPENEP_AUTH_ACCESS_KEY=minioadmin
- OPENEP_AUTH_SECRET_KEY=minioadmin
volumes:
- ./data:/data
- ./config.yaml:/app/config.yaml:ro
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/_mgmt/health"]
interval: 30s
timeout: 10s
retries: 3# Add Helm repository
helm repo add openendpoint https://charts.openendpoint.io
# Install
helm install openendpoint openendpoint/openendpoint \
--set auth.accessKey=your-access-key \
--set auth.secretKey=your-secret-key \
--set persistence.size=100Gi[Unit]
Description=OpenEndpoint Object Storage
After=network.target
[Service]
Type=simple
User=openendpoint
Group=openendpoint
ExecStart=/usr/local/bin/openep server --config /etc/openendpoint/config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetOpenEndpoint v1.0.0 includes comprehensive security measures:
| Vulnerability | Status |
|---|---|
| Path Traversal | β Protected |
| Signature Bypass | β Fixed |
| Timing Attacks | β Protected |
| XSS | β Protected |
| Header Injection | β Protected |
| DoS (Size) | β Protected |
| Memory Leaks | β Fixed |
| Race Conditions | β Fixed |
Do not report security vulnerabilities through public GitHub issues.
Email: security@openendpoint.com
We will respond within 48 hours.
| Document | Description |
|---|---|
| CHANGELOG.md | Release history and changes |
| CONTRIBUTING.md | How to contribute |
| docs/TESTING.md | Testing guide |
| docs/ERROR_CODES.md | Error codes reference |
| docs/QUICKREF.md | Quick reference |
| docs/ROADMAP.md | Development plans |
| docs/openendpoint-complete-vision.md | Complete technical vision |
| Version | Target | Focus | Status |
|---|---|---|---|
| v1.0 | Q1 2026 | Foundation - S3 Compatible Storage | β Complete |
| v2.0 | Q2 2026 | Enhanced clustering, multi-node | β Complete |
| v3.0 | Q3 2026 | Cross-region replication | β Complete |
| v4.0 | Q4 2026 | Enterprise features | β Complete |
| v5.0 | 2027 | Intelligence features | β Complete |
| v1.0.0 | 2026-02-21 | Production Certification | β Released |
| Version | Target | Focus |
|---|---|---|
| v1.1.0 | Q2 2026 | Performance optimizations |
| v1.2.0 | Q3 2026 | GraphQL API, Mobile SDKs |
| v2.0.0 | 2027 | Edge computing, AI/ML integration |
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
# Clone and setup
git clone https://github.com/openendpoint/openendpoint.git
cd openendpoint
# Install dependencies
go mod download
# Run tests
go test ./...
# Build
go build -o bin/openep.exe ./cmd/openep
# Run locally
./bin/openep server --config config.example.yamlApache License 2.0 - see LICENSE for details.
| Channel | Use For |
|---|---|
| GitHub Issues | Bug reports, feature requests |
| GitHub Discussions | Questions, ideas |
| security@openendpoint.com | Security vulnerabilities |
Maintainer: Ersin KOΓ β’ Twitter