https://github.com/rzaf/youtube-clone
backend clone of youtube - media storage and sharing api written in go using microservice architecture
https://github.com/rzaf/youtube-clone
media-sharing microservice video-streaming youtube-clone
Last synced: 12 months ago
JSON representation
backend clone of youtube - media storage and sharing api written in go using microservice architecture
- Host: GitHub
- URL: https://github.com/rzaf/youtube-clone
- Owner: rzaf
- License: mit
- Created: 2024-08-26T17:54:34.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2025-03-29T20:52:55.000Z (about 1 year ago)
- Last Synced: 2025-04-12T02:12:34.146Z (12 months ago)
- Topics: media-sharing, microservice, video-streaming, youtube-clone
- Language: Go
- Homepage:
- Size: 562 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# youtube-clone
media storage and sharing api written in go using microservice architecture.
- for simplicity and data integrity used a central database for user related data except media files
- written in a request-response architecture
- services communicate to each other using gRPC
## microservices
### auth service
authentication microservice used for registering user and retrieving user JWT token and refreshing it
### gateway service
main api of app for user related data (users,medias,comments,playlists,likes,tags,followings)
### file service
- has a Rest api for recieving and uploading media files (photo,video,music)
- stores all media files and its meta data (other services communicate with file service to know media file url exist and belong to which user)
- media files are stored in system files and meta data is stored in a mongodb database
- handles video,music formating and compression (using ffmpeg)
### database service
- central database (postgres) for storing all user user related data (users,medias,comments,playlists,likes,tags,followings)
- other services communicate with database service to get user related data
### notification service
- recieves notifications from other services to send to user
- send emails to users for verifications and notifications
## api endpoints
protected routes require authentication with bearer tokens
### auth service routes
| type | url |protected|
|------|--------------------|-------|
| GET |`api/login` |✗|
| GET |`api/register` |✗|
| GET |`api/refresh` |✗|
### gateway service routes
#### USERS
| type | url |protected|
|------|------------------------------------|-------|
| GET |`api/users/{username}` |✗|
| GET |`api/users` |✗|
| GET |`api/users/search/{term}` |✗|
| POST |`api/users/{username}/verify/{code}`|✗|
| POST |`api/users/resend-email` |✓|
| PUT |`api/users/{username}/profile-photo`|✓|
| GET |`/users/{username}/followings` |✓|
| PUT |`api/users/{username}/channel-photo`|✓|
| PUT |`api/users/{username}` |✓|
|DELETE|`api/users/{username}` |✓|
| POST |`api/follows/{username}` |✓|
|DELETE|`api/follows/{username}` |✓|
#### MEDIAS
| type | url |protected|
|------|------------------------------------------|-------|
| GET |`api/medias` |✗|
| GET |`api/medias/search/{term}` |✗|
| GET |`api/medias/{url}` |✗|
| POST |`api/medias` |✓|
| PUT |`api/medias/{url}` |✓|
|DELETE|`api/medias/{url}` |✓|
| POST |`api/medias/{url}/tag/{name}` |✓|
|DELETE|`api/medias/{url}/tag/{name}` |✓|
| POST |`api/medias/{url}/playlists/{playlistUrl}`|✓|
| PUT |`api/medias/{url}/playlists/{playlistUrl}`|✓|
|DELETE|`api/medias/{url}/playlists/{playlistUrl}`|✓|
#### COMMENTS
| type | url |protected|
|------|------------------------------------------|-------|
| GET |`api/comments/{commentUrl}` |✗|
| GET |`api/comments/medias/{url}` |✗|
| GET |`/comments/{commentUrl}/replies` |✗|
| POST |`api/comments/medias/{url}` |✓|
| PUT |`api/comments/{commentUrl}` |✓|
|DELETE|`api/comments/{commentUrl}` |✓|
#### LIKES
| type | url |protected|
|------|------------------------------------------|-------|
| POST |`api/medias/{url}/likes` |✓|
|DELETE|`api/medias/{url}/likes` |✓|
| POST |`api/comments/{url}/likes` |✓|
|DELETE|`api/comments/{url}/likes` |✓|
#### PLAYLISTS
| type | url |protected|
|------|------------------------------------------|-------|
| GET |`api/playlists` |✗|
| GET |`api/playlists/search/{term}` |✗|
| GET |`api/playlists/{url}` |✗|
| GET |`api/playlists/{url}/medias` |✗|
| POST |`api/playlists` |✓|
| PUT |`api/playlists/{url}` |✓|
|DELETE|`api/playlists/{url}` |✓|
### file service routes
| type | url |protected|
|------|--------------------|-------|
| GET |`api/photos/{url}` |✗|
| GET |`api/videos/{url}` |✗|
| GET |`api/musics/{url}` |✗|
| POST |`api/photos/upload` |✓|
| POST |`api/videos/upload` |✓|
| POST |`api/musics/upload` |✓|
## Prerequisites
- ***Go*** (1.20)
- ***docker*** and ***docker compose***
- Protobuf compiler (`protoc`) & go plugins (optional):
- install protocol buffer compiler [link](https://grpc.io/docs/protoc-installation/)
- install protoc-gen-go and and protoc-gen-go-grpc by running `go install google.golang.org/protobuf/cmd/protoc-gen-go` and `go install google.golang.org/grpc/cmd/protoc-gen-go-grpc`
- have protoc and GOPATH in your PATH env
## build
### docker
1. Build Go Files and Docker Containers
To build the Go binaries and Docker containers, use:
```bash
make build
```
If protoc and the Go plugins are installed, you can generate Protocol Buffer files and build Swagger docs files along with the Go binaries:
```bash
make all
```
2. Create .env file
```bash
cp .env.example .env
```
3. Run Docker containers
Start the Docker containers using:
```bash
make run
```
or simply run `docker compose up`
### docker swarm
Deploy using Docker Swarm
```bash
make swarm
```
## features
- video,music,photo storage and sharing
- video and music streaming
- swagger documentations (at `/docs`)
- user subscribing (following)
- comment and reply on medias
- media and comment likes
- searching users,medias,playlists
- multi media playlists
- email verification
- user upload limit
- notifications:
- new media from following user (subscribing)
- new comment on users media
- new reply on users commnet
- new like on users media,comment,reply
- new follower (subscriber)
## todo
- image compression
- multiple video quality and bitrate
- video subtitle
- video thumbnail from video
- adding image to musics