{"id":14989798,"url":"https://github.com/phammings/airbnb-clone","last_synced_at":"2026-02-07T18:01:22.633Z","repository":{"id":246687117,"uuid":"821802474","full_name":"phammings/Airbnb-Clone","owner":"phammings","description":"Airbnb Clone with a CI/CD pipeline","archived":false,"fork":false,"pushed_at":"2024-10-24T03:00:19.000Z","size":69768,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T21:21:58.092Z","etag":null,"topics":["angular","auth0","aws-ec2","coolify","hetzner","postgresql","springboot"],"latest_commit_sha":null,"homepage":"https://airbnb.ryanlepham.com","language":"SCSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phammings.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-29T13:28:42.000Z","updated_at":"2024-08-15T02:41:17.000Z","dependencies_parsed_at":"2024-06-29T17:38:21.951Z","dependency_job_id":"6f9fd4d6-7e9f-4490-a085-92d6b1fca3b7","html_url":"https://github.com/phammings/Airbnb-Clone","commit_stats":{"total_commits":143,"total_committers":2,"mean_commits":71.5,"dds":0.006993006993006978,"last_synced_commit":"3591bb3c2cae85ac0b23ffec912519db6af53781"},"previous_names":["phammings/airbnb-clone"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phammings%2FAirbnb-Clone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phammings%2FAirbnb-Clone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phammings%2FAirbnb-Clone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phammings%2FAirbnb-Clone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phammings","download_url":"https://codeload.github.com/phammings/Airbnb-Clone/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248505742,"owners_count":21115352,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","auth0","aws-ec2","coolify","hetzner","postgresql","springboot"],"created_at":"2024-09-24T14:18:55.739Z","updated_at":"2026-02-07T18:01:17.581Z","avatar_url":"https://github.com/phammings.png","language":"SCSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Airbnb Clone\n\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n\n\u003ch3 align=\"center\"\u003eFull Stack Airbnb Clone\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    A full stack Airbnb clone application using Angular for the frontend, Spring Boot Java for the backend, PostgreSQL as the database, and Auth0 for authentication and authorization. The application includes booking management for travelers, reservation management for landlords, and comprehensive search functionalities.\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#instructions\"\u003eInstructions\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#screencaps\"\u003eScreencaps\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\n\nThe project focuses on creating a full stack Airbnb clone application. The backend is built with Spring Boot Java, interfacing with a PostgreSQL database. The frontend is developed with Angular, providing a dynamic and responsive user interface. The application includes full user authentication and authorization with Auth0, supporting role management. It features booking management for travelers, reservation management for landlords, and search functionalities by various criteria like location, date, and number of guests.\n\nThe project is deployed on an AWS EC2 instance self-hosted through Coolify. For the CI/CD process, I implemented Github actions to automatically create frontend and backend docker image is pushed to my docker hub and redeployed through Coolify.\n\n## [Live Demo 🔗](https://airbnb.ryanlepham.com/)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n### Built With\n\n* [![Java][Java.java]][Java-url]\n* [![SpringBoot][SpringBoot]][Spring-url]\n* [![Maven][Maven]][Maven-url]\n* [![PostgreSQL][PostgreSQL]][PostgreSQL-url]\n* [![Angular][Angular]][Angular-url]\n* [![Auth0][Auth0]][Auth0-url]\n* [![Docker][Docker]][Docker-url]\n* [![EC2][EC2]][EC2-url]\n* [![Hetzner][Hetzner]][Hetzner-url]\n* [![Coolify][Coolify]][Coolify-url]\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- ROADMAP --\u003e\n## Roadmap\n\n- ✔️ Implement user authentication and authorization with Auth0\n- ✔️ Develop a dynamic frontend using Angular\n- ✔️ Build a robust backend with Spring Boot and PostgreSQL\n- ✔️ Implement booking management for travelers\n- ✔️ Implement reservation management for landlords\n- ✔️ Develop search functionalities by location, date, guests, and other criteria\n- ✔️ Utilize Docker for containerized deployment and easy setup across different environments\n- ✔️ Deployed on AWS EC2 and self-hosted through Coolify\n- ️️✔️ Migrated cloud server to Hetzner Cloud to reduce costs by 50%\n- ✔️ Used Github Actions for CI/CD to automatically create and push docker image of app backend\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\u003c!-- INSTRUCTIONS --\u003e\n## Instructions for Local Setup\n\n#### 1) Setup .env file from .env.example\n\n```js\nAUTH0_CLIENT_ID=\nAUTH0_CLIENT_SECRET=\n```\n\n##### Auth0 Setup\n\n- Create a Java Sprinboot Auth0 application. Ensure the following details are added:\n  - Under application settings:\n    - Replace ```Domain```, ```Client ID```, ```Client Secret``` on ```application.yml``` (inside server/src/main/resources and .env above)\n    - Allowed Callback URLs: ```http://backend:8080/login/oauth2/code/okta```, ```http://localhost:8080/login/oauth2/code/okta```, ```http://localhost:4200/login/oauth2/code/okta```, ```http://frontend:4200/login/oauth2/code/okta```\n    - Allowed Logout URLs and Allowed Web Origins: ```http://localhost:4200```\n    - Allow Cross-Origin Authentication and CORS: ```http://localhost:4200```\n  - Under Application APIs Machine To Machine Applications:\n    - Ensure Permissions are on for:\n      - read:client_grants, create:client_grants, delete:client_grants, update:client_grants, read:users, update:users, delete:users, create:users, read:users_app_metadata, update:users_app_metadata, create:users_app_metadata, read:roles, update:roles, read:role_members\n  - Under User Management Roles:\n    - Ensure Roles are created for:\n      - ```ROLE_ADMIN```, ```ROLE_LANDLORD```, ```ROLE_TENANT```\n      - Under  ```ROLE_Landlord```, get the Role ID and replace that in the application.yml\n\n\n\n\u003cbr/\u003e\n\n#### 2a) Docker Installation (Recommended)\n- Ensure Docker is installed and running on your system\n    - See https://docs.docker.com/ for installation instructions\n1) Build the Docker image and ensure no previous cache is used:\n    - ```docker-compose build --no-cache```\n2) Compose the Docker image:\n    - ```docker-compose up```\n\n    \u003cbr/\u003e\n    \u003cbr/\u003e\n\n\n#### 2b) Manual Installation\n  - Client frontend:\n      1) ```npm install```\n      2) ```ng serve```\n  - Server backend:\n      1) ```maven clean install```\n      2) ```mvn spring-boot:run```\n\n\n- In the case that there are duplicate tables in the airbnb_clone database:\n  - In ```server/src/main/resources/application.yml``` uncomment \n    - ```drop-first: true```\n  - Run the application\n    - ```mvn spring-boot:run```\n  - Recomment ```drop-first: true``` for future runs\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- SCREENCAPS --\u003e\n## Screencaps\n\n![Image](screencaps/Home.png)\n![Image](screencaps/Search.png)\n![Image](screencaps/Listing.png)\n![Image](screencaps/Landlord.png)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n[Java.java]: https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white\n[Java-url]: https://www.java.com/en/\n[Maven]: https://img.shields.io/badge/Apache%20Maven-C71A36?style=for-the-badge\u0026logo=Apache%20Maven\u0026logoColor=white\n[Maven-url]: https://maven.apache.org/\n[SpringBoot]: https://img.shields.io/badge/spring-%236DB33F.svg?style=for-the-badge\u0026logo=spring\u0026logoColor=white\n[Spring-url]: https://spring.io/projects/spring-boot\n[PostgreSQL]: https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\n[PostgreSQL-url]: https://www.postgresql.org/\n[Angular]: https://img.shields.io/badge/angular-%23DD0031.svg?style=for-the-badge\u0026logo=angular\u0026logoColor=white\n[Angular-url]: https://angular.io/\n[Docker]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[Docker-url]: https://www.docker.com/\n[Auth0]: https://img.shields.io/badge/Auth0-%230A0A0A.svg?style=for-the-badge\u0026logo=Auth0\u0026logoColor=white\n[Auth0-url]: https://auth0.com/\n[EC2]: https://img.shields.io/badge/AWS%20EC2-FF9900.svg?style=for-the-badge\u0026logo=amazonec2\u0026logoColor=black\n[EC2-url]: https://aws.amazon.com/ec2/\n[Hetzner]: https://img.shields.io/badge/hetzner-D50C2D.svg?style=for-the-badge\u0026logo=hetzner\u0026logoColor=white\n[Hetzner-url]: https://www.hetzner.com/\n[Coolify]: https://img.shields.io/badge/Coolify-black.svg?style=for-the-badge\u0026logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNTAwIiB6b29tQW5kUGFuPSJtYWduaWZ5IiB2aWV3Qm94PSIwIDAgMzc1IDM3NC45OTk5OTEiIGhlaWdodD0iNTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2ZXJzaW9uPSIxLjAiPjxkZWZzPjxnLz48L2RlZnM+PGcgZmlsbD0iIzhjNTJmZiIgZmlsbC1vcGFjaXR5PSIwLjMwMiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODQuNjYzNzkzLCAzMTAuMDE2NDg0KSI+PGc+PHBhdGggZD0iTSA2MyAtMTY4IEwgMjEgLTE2OCBMIDIxIC00MiBMIDYzIC00MiBaIE0gNjMgMCBMIDIzMSAwIEwgMjMxIC00MiBMIDYzIC00MiBaIE0gNjMgLTE2OCBMIDIzMSAtMTY4IEwgMjMxIC0yMTAgTCA2MyAtMjEwIFogTSA2MyAtMTY4ICIvPjwvZz48L2c+PC9nPjxnIGZpbGw9IiM4YzUyZmYiIGZpbGwtb3BhY2l0eT0iMC41MDIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcxLjQwNTUzNywgMjk2Ljc1ODIzMykiPjxnPjxwYXRoIGQ9Ik0gNjMgLTE2OCBMIDIxIC0xNjggTCAyMSAtNDIgTCA2MyAtNDIgWiBNIDYzIDAgTCAyMzEgMCBMIDIzMSAtNDIgTCA2MyAtNDIgWiBNIDYzIC0xNjggTCAyMzEgLTE2OCBMIDIzMSAtMjEwIEwgNjMgLTIxMCBaIE0gNjMgLTE2OCAiLz48L2c+PC9nPjwvZz48ZyBmaWxsPSIjOGM1MmZmIiBmaWxsLW9wYWNpdHk9IjEiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU4LjE0NzI4NywgMjgzLjQ5OTk4MSkiPjxnPjxwYXRoIGQ9Ik0gNjMgLTE2OCBMIDIxIC0xNjggTCAyMSAtNDIgTCA2MyAtNDIgWiBNIDYzIDAgTCAyMzEgMCBMIDIzMSAtNDIgTCA2MyAtNDIgWiBNIDYzIC0xNjggTCAyMzEgLTE2OCBMIDIzMSAtMjEwIEwgNjMgLTIxMCBaIE0gNjMgLTE2OCAiLz48L2c+PC9nPjwvZz48L3N2Zz4=\n[Coolify-url]: https://coolify.io/","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphammings%2Fairbnb-clone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphammings%2Fairbnb-clone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphammings%2Fairbnb-clone/lists"}