This document outlines the process for creating and deploying multiple applications within a single AWS infrastructure, utilizing subdomains for distinct access and a robust CI/CD pipeline for seamless updates.
This project aims to build a scalable and maintainable system for hosting various applications represented by separate repositories. Each application will have its own subdomain, and a centralized pipeline will ensure efficient deployment and update processes.
1. Domain Configuration and DNS Setup:
- • Route 53 Hosted Zones: Create individual hosted zones in Route 53 for each desired subdomain.
- • Name Server Propagation: Update the name servers of the primary domain with the values provided by Route 53 for each subdomain hosted zone.
- • Domain Propagation: Ensure that the DNS changes propagate globally, allowing for successful resolution of subdomains.
2. Server Setup and Application Hosting:
- • EC2 Instance Provisioning: Launch a sufficiently sized EC2 instance (type dependent on application requirements) within the desired AWS region.
- • Software Installation: Install the following software on the EC2 instance: o Nginx: As a reverse proxy and web server. o Docker: For containerization of applications. o Docker Compose: For orchestrating multi-container applications. • Repository Cloning: Clone all application repositories onto the EC2 instance.
3. Application Containerization:
- • Dockerfile Creation: Create separate Dockerfiles for each application. Each Dockerfile should define the specific environment, dependencies, and configuration necessary to run the corresponding application within a Docker container.
- o React Frontends: Dockerfiles should include: ♣ Necessary Node.js and npm/yarn packages. ♣ Build commands to compile and bundle the frontend application. ♣ A web server (like Nginx or Apache) to serve static files.
- o PHP Backends: Dockerfiles should include: ♣ Necessary PHP extensions and dependencies. ♣ Composer for dependency management. ♣ A web server (like Apache or Nginx) to serve PHP applications. • Docker Image Building: Build Docker images for each application using the corresponding Dockerfiles.
4. Service Orchestration with Docker Compose:
- • Compose File Creation: Create a Docker Compose YAML file that defines each application as a service and the necessary resources for their operation.
- o Services: Define each application as a service within the Docker Compose file, specifying the Docker image, ports, and dependencies.
- o Database: Include a dedicated MySQL database service for the backend applications, configuring volume mounting for data persistence.
- o Network: Define a network for the containers to communicate with each other.
- • Docker Compose Up: Start all the services defined in the Docker Compose file with the docker-compose up command.
5. Reverse Proxy Configuration:
- • Nginx Configuration: Configure Nginx to act as a reverse proxy, routing requests from specific subdomains or paths to the corresponding application services defined in Docker Compose.
- o Subdomain Routing: Define rules that map subdomains to their corresponding container services based on the configured ports in Docker Compose.
- o Location Path Routing: Define rules that direct requests to specific paths to the appropriate backend service for dynamic content.
- o Adding SSL certificate and configuring https in the subdomains reverse proxy
- • Nginx Restart: Restart Nginx for the changes to take effect.
6. Elastic Instance and Auto-Startup:
- • Elastic IP: Assign an Elastic IP address to the EC2 instance to ensure persistent access even if the instance is rebooted.
- • Auto-Startup: Configure the EC2 instance to automatically start upon launch, ensuring that the application services are always running.
- • Docker Compose Startup Script: Add a script to the instance startup process that automatically runs docker-compose up to bring the application containers online.
7. Testing and Validation:
- • Accessibility Testing: Verify that each application is accessible through the configured subdomain or path.
- • Functional Testing: Perform thorough functional testing of each application to ensure proper operation and data flow.