Giter VIP home page Giter VIP logo

yuchiu / slack-clone Goto Github PK

View Code? Open in Web Editor NEW
36.0 4.0 23.0 3.2 MB

Full-Stack live chat application that recreate Slack's main features with SPA client and three tier monolithic backend

Home Page: http://yuchiu-slack.surge.sh/

License: MIT License

JavaScript 79.86% HTML 0.50% CSS 3.15% Dockerfile 0.04% TypeScript 16.46%
react reactjs redux slack javascript scss typescript nodejs express postgresql postgres sequelize socketio redis

slack-clone's Introduction

Slack Clone

Quick Links

Demo

Objectives

Tech Stack

System Architecture Diagram

Getting Started

Testing

Production Deployment

Author

License

Acknowledgments


Demo

Live Site Demo

Link

Video Demo

demogif


Objectives

  • single page application with React and its ecosystem
  • Flexbox and CSS Grid for UI layout
  • User authentications with sessions and OAuth2
  • Real time messaging and file sharing
  • cache SQL queries and static files for optimized performance
  • loading balancing for scalability
  • Containerized with Docker

User Stories

  • users can register and log in to their account
  • users can edit his/her profile info, including profile image & password
  • users can create team
  • teams description can be edited only by admin
  • users can invite people to join their team
  • users can create channel inside his/her team
  • channels can be public or private for invited members only
  • channels description can be edited by channel members
  • users can create direct message or group message with other team members
  • users can send real time message within channels or direct message
  • users can share images, audio or text files to other users

Future Expansions

  • Splitting different functionalities into its own services to maximize resource allocations
  • implemented more features in WebSocket instead of REST, similiar to Slack's implementation
  • Implements more test coverage
  • Optimization
    • More advanced webpack config
    • Prerendering

Tech Stack


System Architecture Diagram

Client Diagram

client

Server Diagram

server


Getting Started

Prerequisites

!important .env file is required for setting up environment variables for this project
an example of .env file client is using by default is located at ./client/.env
an example of .env file server is using by default is located at ./server/.env

Tools & Versions

Softwares Versions
npm 6.4.1
nodejs 10.10.0
postgres 10.5
redis-server 4.0.3

Server Development Environment

  • postgres client for Nodejs need to be installed globally

    npm install pg -global
    
  • we are using default value for redis's environment variables in this application, modify accordingly to your environment in .env file

  • postgres database needs to be setup first
    Postgres configuration is stored in .env file, modifiy .env variables for your own environment

  • install Slack-Clone server's dependencies

    cd slack-clone/server
    npm install
    
  • optional: populate/reset Postgres database with initial seed data
    seed configuration & schema is in dir ./server/seed

    npm run seed
    
  • for initial run on the machine, output a build directory
    build directory will output to ./server/build

    npm run build
    
  • start application in server
    server will be listening to [http://localhost:3030]

    npm start
    

Client Development Environment

  • install dependencies & start application in client
    application will be running on [http://localhost:3000]

    cd slack-clone/client
    npm install
    npm start
    

Testing

Client

  • Redux data flow are covered in the tests including actions, reducers, selectors

    cd slack-clone/client
    npm install
    npm run test
    

Production Deployment

Prerequisites

Tools & Versions

Softwares for Production Deployment Versions
nginx 1.14.0
docker 18.06.1-ce
docker-compose 1.22.0

Server Production Deployment

  • install dependencies & output production build in server
    production build directory will be output to ./server/build

    cd slack-clone/server
    npm install
    npm run build
    

Option A. Serve Application on Local Machine

  • start server application with production build locally
    server will be listening to [http://localhost:3030] by default

    npm run serve
    
  • !important: client API url's port is set to 80 by default in its production build
    change server port from 3030 to 80 in server's .env file

Option B. Serve Application with Nginx & Docker Container (Recommended)

  • build the Docker image as "slack-clone" with Dockerfile using the server's production build Docker build file is located at ./server/Dockerfile

    sudo docker build -t slack-clone .
  • start server application as Docker container locally using docker-compose
    docker-compose file is located at ./server/docker-compose.yml server will be listening to [http://localhost:80] by default

    docker-compose up

Client Production Deployment

  • install dependencies & output production build in client
    production build directory will be output to ./client/build

    cd slack-clone/client
    npm install
    npm run build
    
  • serve client application with static server locally
    static server will be running on [http://localhost:5000] by default

    npm i -g serve
    npm run serve
    

Author

  • Yu Chiu

License

This project is licensed under the MIT License - see the LICENSE file for details


Acknowledgments

  • Project inspired by Ben Awad's Slack Clone.

  • key differences are the followings:

    • Restructure Client and Server code base from ground zero
    • Use Redux as state management instead of Apollo
    • Use sessions and OAuth2 intead of JWT for authentications
    • Use RESTful and Socket.io instead of GraphQL and Redis Pub Sub for data transmission
    • Use TypeScript in Server instead of ES6 JavaScript
    • modified database schema for better performance
    • expanded functionalities including uploading profile image, sidebars, profile editing and so on

slack-clone's People

Contributors

yuchiu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.