Files
AWS/mini-dropbox/CODE/README.md
2026-03-20 12:01:02 +05:30

376 lines
9.0 KiB
Markdown

# AWS Cloud Drive
A modern, full-stack cloud file storage application — a mini Dropbox clone built with Python Flask and AWS services. Users can sign in with Google, upload files to S3, manage them via a beautiful dark-themed UI, and share files with others.
![AWS Cloud Drive](https://img.shields.io/badge/AWS-Cloud%20Drive-blue)
![Python](https://img.shields.io/badge/Python-3.11-green)
![Flask](https://img.shields.io/badge/Flask-3.0-red)
![License](https://img.shields.io/badge/License-MIT-yellow)
---
## 🚀 Features
- **Google OAuth Authentication** — Secure sign-in with Google accounts
- **File Upload & Storage** — Upload files up to 100MB, stored securely on AWS S3
- **File Management** — View, download, delete, and organize your files
- **File Sharing** — Generate shareable links with 7-day expiration
- **File Preview** — Preview images and PDFs directly in browser
- **Modern UI** — Dark theme with smooth animations and responsive design
- **Cloud Infrastructure** — Built on AWS S3, RDS PostgreSQL, and CloudFront
---
## 🏗️ Tech Stack
### Backend
- **Python 3.11** — Core programming language
- **Flask 3.0** — Web framework
- **PostgreSQL (RDS)** — Relational database for metadata
- **AWS S3** — Object storage for files
- **AWS CloudFront** — CDN for fast file delivery
- **Gunicorn** — Production WSGI server
### Frontend
- **HTML5** — Semantic markup
- **Tailwind CSS** — Utility-first CSS framework
- **Vanilla JavaScript** — No frameworks, pure JS
### Authentication
- **Google OAuth 2.0** — Via Authlib
### Python Libraries
- `Flask` — Web framework
- `Authlib` — OAuth client
- `boto3` — AWS SDK for Python
- `psycopg2` — PostgreSQL adapter
- `python-dotenv` — Environment variable management
- `gunicorn` — Production server
---
## 📁 Project Structure
```
aws-cloud-drive/
├── app/
│ ├── __init__.py # Flask app factory
│ ├── config.py # Configuration loader
│ ├── auth.py # Google OAuth blueprint
│ ├── files.py # File management blueprint
│ ├── db.py # Database operations
│ ├── s3.py # S3 operations
│ │
│ ├── templates/
│ │ ├── base.html # Base template with navbar
│ │ ├── login.html # Login page
│ │ └── dashboard.html # Main dashboard
│ │
│ └── static/
│ ├── css/
│ │ └── style.css # Custom styles
│ └── js/
│ └── dashboard.js # Frontend logic
├── sql/
│ └── schema.sql # Database schema
├── .env.example # Environment variables template
├── requirements.txt # Python dependencies
├── run.py # Application entry point
├── gunicorn.conf.py # Gunicorn configuration
└── README.md # This file
```
---
## 🔧 Setup Instructions
### Prerequisites
- Python 3.11+
- PostgreSQL database (AWS RDS recommended)
- AWS account with S3 bucket
- Google Cloud project with OAuth credentials
### 1. Clone the Repository
```bash
git clone https://github.com/yourusername/aws-cloud-drive.git
cd aws-cloud-drive
```
### 2. Install Dependencies
```bash
pip install -r requirements.txt
```
### 3. Configure Environment Variables
Copy `.env.example` to `.env` and fill in your credentials:
```bash
cp .env.example .env
```
Edit `.env`:
```env
FLASK_SECRET_KEY=your-secret-key-here
FLASK_ENV=production
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GOOGLE_REDIRECT_URI=http://your-domain.com/auth/callback
AWS_REGION=us-east-1
S3_BUCKET_NAME=your-s3-bucket-name
CLOUDFRONT_DOMAIN=your-cloudfront-domain.cloudfront.net
DB_HOST=your-rds-endpoint.amazonaws.com
DB_PORT=5432
DB_NAME=clouddrive
DB_USER=dbadmin
DB_PASSWORD=your-db-password
```
### 4. Set Up AWS Resources
#### S3 Bucket
1. Create an S3 bucket in your AWS console
2. Note the bucket name for `.env`
3. Configure IAM role with S3 permissions
#### RDS PostgreSQL
1. Create a PostgreSQL instance in RDS
2. Note the endpoint, port, database name, and credentials
3. Ensure security group allows connections from your EC2 instance
#### CloudFront (Optional)
1. Create a CloudFront distribution pointing to your S3 bucket
2. Note the CloudFront domain for `.env`
#### EC2 IAM Role
Attach an IAM role to your EC2 instance with these policies:
- `AmazonS3FullAccess` (or custom S3 policy)
- `AmazonRDSDataFullAccess` (or custom RDS policy)
### 5. Set Up Google OAuth
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project
3. Enable Google+ API
4. Create OAuth 2.0 credentials:
- Application type: Web application
- Authorized redirect URIs: `http://your-domain.com/auth/callback`
5. Copy Client ID and Client Secret to `.env`
### 6. Initialize Database
The database will be initialized automatically on first run, or manually:
```bash
python -c "from app.db import init_db; init_db()"
```
### 7. Run the Application
#### Development
```bash
python run.py
```
#### Production (with Gunicorn)
```bash
gunicorn -c gunicorn.conf.py run:app
```
---
## 🚀 Deployment on AWS EC2
### 1. Launch EC2 Instance
- **AMI:** Ubuntu 22.04 LTS
- **Instance Type:** t2.micro (free tier) or t2.small
- **Security Group:**
- Allow SSH (port 22)
- Allow HTTP (port 80)
- Allow HTTPS (port 443)
- Allow Custom TCP (port 5000) for testing
### 2. SSH into Instance
```bash
ssh -i your-key.pem ubuntu@your-ec2-public-ip
```
### 3. Install Dependencies
```bash
sudo apt update
sudo apt install python3-pip python3-venv nginx -y
```
### 4. Clone and Set Up Application
```bash
git clone https://github.com/yourusername/aws-cloud-drive.git
cd aws-cloud-drive
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
### 5. Configure Nginx (Optional)
Create `/etc/nginx/sites-available/clouddrive`:
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
Enable the site:
```bash
sudo ln -s /etc/nginx/sites-available/clouddrive /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
### 6. Run with Gunicorn
Install and configure Gunicorn:
```bash
pip install gunicorn
```
Create a systemd service `/etc/systemd/system/clouddrive.service`:
```ini
[Unit]
Description=Cloud Drive Flask App
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/aws-cloud-drive
Environment="PATH=/home/ubuntu/aws-cloud-drive/venv/bin"
ExecStart=/home/ubuntu/aws-cloud-drive/venv/bin/gunicorn -c gunicorn.conf.py run:app
[Install]
WantedBy=multi-user.target
```
Start the service:
```bash
sudo systemctl daemon-reload
sudo systemctl start clouddrive
sudo systemctl enable clouddrive
```
---
## 🔒 Security Best Practices
1. **Never commit `.env` file** — Use `.env.example` as a template
2. **Use IAM roles** — Avoid hardcoding AWS credentials
3. **HTTPS only** — Use SSL certificates (Let's Encrypt)
4. **Secure session cookies** — Already configured in app
5. **File size limits** — 100MB enforced
6. **Input validation** — Filenames sanitized with `secure_filename`
7. **User isolation** — All file operations verify ownership
---
## 📝 API Endpoints
### Authentication
- `GET /auth/login` — Redirect to Google OAuth
- `GET /auth/callback` — Handle OAuth callback
- `GET /auth/logout` — Log out user
### Files
- `GET /files/` — Dashboard (requires login)
- `POST /files/upload` — Upload file (requires login)
- `GET /files/download/<id>` — Download file (requires login)
- `POST /files/delete/<id>` — Delete file (requires login)
- `POST /files/share/<id>` — Generate share link (requires login)
- `GET /files/preview/<id>` — Preview file (requires login)
---
## 🎨 UI Screenshots
### Login Page
Clean, modern login with Google OAuth
### Dashboard
Dark-themed file manager with upload, download, share, and delete actions
---
## 🛠️ Development
### Run in Development Mode
```bash
export FLASK_ENV=development
python run.py
```
### Database Schema
The schema is defined in `sql/schema.sql`:
- **users** — User accounts from Google OAuth
- **files** — File metadata with S3 keys and share tokens
---
## 📄 License
This project is licensed under the MIT License.
---
## 🤝 Contributing
Contributions are welcome! Please open an issue or submit a pull request.
---
## 📧 Contact
For questions or support, please open an issue on GitHub.
---
## 🙏 Acknowledgments
- Flask for the excellent web framework
- AWS for reliable cloud infrastructure
- Tailwind CSS for beautiful styling
- Google OAuth for secure authentication
---
**Built with ❤️ using Python, Flask, and AWS**