Initial Commit, Working Template
This commit is contained in:
commit
613967e9f4
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
logs/*
|
||||||
28
Dockerfile.template
Normal file
28
Dockerfile.template
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Use the official PHP image with FPM
|
||||||
|
FROM php:${PHP_VERSION}
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
git \
|
||||||
|
curl \
|
||||||
|
libpng-dev \
|
||||||
|
libonig-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
zip \
|
||||||
|
unzip \
|
||||||
|
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install PHP extensions required by Laravel
|
||||||
|
RUN docker-php-ext-install ${PHP_EXTENSIONS}
|
||||||
|
|
||||||
|
# Install Composer
|
||||||
|
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
# Expose port 9000 for PHP-FPM
|
||||||
|
EXPOSE 9000
|
||||||
|
|
||||||
|
# Default command to start PHP-FPM
|
||||||
|
CMD ["php-fpm"]
|
||||||
61
README.md
Normal file
61
README.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
### **How It Works**
|
||||||
|
|
||||||
|
1. **Create Environment Files**:
|
||||||
|
- Copy `config/example.env` to a new file (e.g., `config/testing.env`) and edit the variables.
|
||||||
|
|
||||||
|
2. **Run `setup.sh`**:
|
||||||
|
- Pass the `.env` file as an argument:
|
||||||
|
```bash
|
||||||
|
./setup.sh config/testing.env
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Generated Output**:
|
||||||
|
- `setup.sh` replaces all `{PROJECT_NAME}` placeholders dynamically.
|
||||||
|
- Example for `PROJECT_NAME=testing`:
|
||||||
|
- `APP_SERVICE_NAME` becomes `app-testing`.
|
||||||
|
- `MYSQL_DATABASE` becomes `testing_db`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **Test Example**
|
||||||
|
**Input**: `config/testing.env`:
|
||||||
|
```env
|
||||||
|
# General Configurations
|
||||||
|
PROJECT_NAME=testing.example.com
|
||||||
|
APP_SERVICE_NAME=app-{PROJECT_NAME}
|
||||||
|
|
||||||
|
# Network
|
||||||
|
NETWORK_NAME={PROJECT_NAME}_network
|
||||||
|
|
||||||
|
# Nginx
|
||||||
|
NGINX_SERVICE_NAME=nginx-{PROJECT_NAME}
|
||||||
|
NGINX_PORT=4444
|
||||||
|
|
||||||
|
# Database Configuration
|
||||||
|
MYSQL_SERVICE_NAME=mysql-{PROJECT_NAME}
|
||||||
|
MYSQL_DATABASE={PROJECT_NAME}_db
|
||||||
|
MYSQL_USER={PROJECT_NAME}_user
|
||||||
|
MYSQL_PASSWORD=my_password
|
||||||
|
MYSQL_ROOT_PASSWORD=root_password
|
||||||
|
MYSQL_PORT=4445
|
||||||
|
|
||||||
|
# Dockerfile Configurations
|
||||||
|
PHP_VERSION=8.3-fpm
|
||||||
|
PHP_EXTENSIONS=pdo_mysql mbstring exif pcntl bcmath gd
|
||||||
|
```
|
||||||
|
|
||||||
|
**Command**:
|
||||||
|
```bash
|
||||||
|
./setup.sh config/testing.env
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output Directory**:
|
||||||
|
```
|
||||||
|
testing.example.com/
|
||||||
|
├── Dockerfile
|
||||||
|
├── docker-compose.yml
|
||||||
|
├── app-volume-testing/
|
||||||
|
├── nginx-volume-testing/
|
||||||
|
│ └── default.conf
|
||||||
|
├── mysql-volume-testing/
|
||||||
|
```
|
||||||
22
config/example.env
Normal file
22
config/example.env
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# General Configurations
|
||||||
|
PROJECT_NAME=example.com
|
||||||
|
APP_SERVICE_NAME=app-{PROJECT_NAME}
|
||||||
|
|
||||||
|
# Network
|
||||||
|
NETWORK_NAME={PROJECT_NAME}_network
|
||||||
|
|
||||||
|
# Nginx
|
||||||
|
NGINX_SERVICE_NAME=nginx-{PROJECT_NAME}
|
||||||
|
NGINX_PORT=80
|
||||||
|
|
||||||
|
# Database Configuration
|
||||||
|
MYSQL_SERVICE_NAME=mysql-{PROJECT_NAME}
|
||||||
|
MYSQL_DATABASE={PROJECT_NAME}_db
|
||||||
|
MYSQL_USER={PROJECT_NAME}_user
|
||||||
|
MYSQL_PASSWORD=my_password
|
||||||
|
MYSQL_ROOT_PASSWORD=root_password
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
|
||||||
|
# Dockerfile Configurations
|
||||||
|
PHP_VERSION=8.3-fpm
|
||||||
|
PHP_EXTENSIONS=pdo_mysql mbstring exif pcntl bcmath gd
|
||||||
22
config/testing.env
Normal file
22
config/testing.env
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# General Configurations
|
||||||
|
PROJECT_NAME=testing.example.com
|
||||||
|
APP_SERVICE_NAME=app-{PROJECT_NAME}
|
||||||
|
|
||||||
|
# Network
|
||||||
|
NETWORK_NAME={PROJECT_NAME}_network
|
||||||
|
|
||||||
|
# Nginx
|
||||||
|
NGINX_SERVICE_NAME=nginx-{PROJECT_NAME}
|
||||||
|
NGINX_PORT=4444
|
||||||
|
|
||||||
|
# Database Configuration
|
||||||
|
MYSQL_SERVICE_NAME=mysql-{PROJECT_NAME}
|
||||||
|
MYSQL_DATABASE={PROJECT_NAME}_db
|
||||||
|
MYSQL_USER={PROJECT_NAME}_user
|
||||||
|
MYSQL_PASSWORD=my_password
|
||||||
|
MYSQL_ROOT_PASSWORD=root_password
|
||||||
|
MYSQL_PORT=4445
|
||||||
|
|
||||||
|
# Dockerfile Configurations
|
||||||
|
PHP_VERSION=8.3-fpm
|
||||||
|
PHP_EXTENSIONS=pdo_mysql mbstring exif pcntl bcmath gd
|
||||||
47
docker-compose.yml.template
Normal file
47
docker-compose.yml.template
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
services:
|
||||||
|
${APP_SERVICE_NAME}:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: ${PROJECT_NAME}-app
|
||||||
|
container_name: ${APP_SERVICE_NAME}
|
||||||
|
restart: unless-stopped
|
||||||
|
working_dir: /var/www/html
|
||||||
|
volumes:
|
||||||
|
- ./app-volume-${PROJECT_NAME}:/var/www/html
|
||||||
|
networks:
|
||||||
|
- ${NETWORK_NAME}
|
||||||
|
|
||||||
|
${NGINX_SERVICE_NAME}:
|
||||||
|
image: nginx:latest
|
||||||
|
container_name: ${NGINX_SERVICE_NAME}
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${NGINX_PORT}:80"
|
||||||
|
volumes:
|
||||||
|
- ./app-volume-${PROJECT_NAME}:/var/www/html
|
||||||
|
- ./nginx-volume-${PROJECT_NAME}/default.conf:/etc/nginx/conf.d/default.conf
|
||||||
|
depends_on:
|
||||||
|
- ${APP_SERVICE_NAME}
|
||||||
|
networks:
|
||||||
|
- ${NETWORK_NAME}
|
||||||
|
|
||||||
|
${MYSQL_SERVICE_NAME}:
|
||||||
|
image: mysql:8.1
|
||||||
|
container_name: ${MYSQL_SERVICE_NAME}
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||||
|
MYSQL_USER: ${MYSQL_USER}
|
||||||
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||||
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||||
|
ports:
|
||||||
|
- "${MYSQL_PORT}:3306"
|
||||||
|
volumes:
|
||||||
|
- ./mysql-volume-${PROJECT_NAME}:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- ${NETWORK_NAME}
|
||||||
|
|
||||||
|
networks:
|
||||||
|
${NETWORK_NAME}:
|
||||||
|
driver: bridge
|
||||||
24
nginx.conf.template
Normal file
24
nginx.conf.template
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
root /var/www/html/public;
|
||||||
|
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass ${APP_SERVICE_NAME}:9000;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
94
setup.sh
Executable file
94
setup.sh
Executable file
@ -0,0 +1,94 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check if the environment file is provided
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Usage: $0 <environment file>"
|
||||||
|
echo "Example: $0 config/testing.env"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load the environment file
|
||||||
|
ENV_FILE=$1
|
||||||
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
|
echo "Environment file '$ENV_FILE' not found."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to replace placeholders in variables
|
||||||
|
function process_placeholders() {
|
||||||
|
local input=$1
|
||||||
|
echo "$input" | sed -e "s/{PROJECT_NAME}/${PROJECT_NAME}/g"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Source and process the environment variables
|
||||||
|
declare -A ENV_VARS
|
||||||
|
while IFS='=' read -r key value; do
|
||||||
|
key=$(echo "$key" | xargs) # Trim whitespace
|
||||||
|
value=$(echo "$value" | xargs) # Trim whitespace
|
||||||
|
if [[ -n "$key" && "$key" != "#"* ]]; then
|
||||||
|
processed_value=$(process_placeholders "$value")
|
||||||
|
export "$key=$processed_value"
|
||||||
|
ENV_VARS["$key"]="$processed_value"
|
||||||
|
fi
|
||||||
|
done < "$ENV_FILE"
|
||||||
|
|
||||||
|
# Create the project directory
|
||||||
|
PROJECT_DIR="../${PROJECT_NAME}"
|
||||||
|
echo "Creating project directory: $PROJECT_DIR"
|
||||||
|
mkdir -p "$PROJECT_DIR"
|
||||||
|
|
||||||
|
# Create project-specific subdirectories
|
||||||
|
mkdir -p "$PROJECT_DIR/app-volume-${PROJECT_NAME}"
|
||||||
|
mkdir -p "$PROJECT_DIR/nginx-volume-${PROJECT_NAME}"
|
||||||
|
mkdir -p "$PROJECT_DIR/mysql-volume-${PROJECT_NAME}"
|
||||||
|
|
||||||
|
# Generate Nginx configuration
|
||||||
|
echo "Generating Dockerfile..."
|
||||||
|
sed \
|
||||||
|
-e "s|\${APP_SERVICE_NAME}|${APP_SERVICE_NAME}|g" \
|
||||||
|
< nginx.conf.template > "$PROJECT_DIR/nginx-volume-$PROJECT_NAME/default.conf"
|
||||||
|
|
||||||
|
# Generate Dockerfile
|
||||||
|
echo "Generating Dockerfile..."
|
||||||
|
sed \
|
||||||
|
-e "s|\${PHP_VERSION}|${PHP_VERSION}|g" \
|
||||||
|
-e "s|\${PHP_EXTENSIONS}|${PHP_EXTENSIONS}|g" \
|
||||||
|
< Dockerfile.template > "$PROJECT_DIR/Dockerfile"
|
||||||
|
|
||||||
|
# Generate docker-compose.yml
|
||||||
|
echo "Generating docker-compose.yml..."
|
||||||
|
sed \
|
||||||
|
-e "s|\${PROJECT_NAME}|${PROJECT_NAME}|g" \
|
||||||
|
-e "s|\${APP_SERVICE_NAME}|${APP_SERVICE_NAME}|g" \
|
||||||
|
-e "s|\${NGINX_SERVICE_NAME}|${NGINX_SERVICE_NAME}|g" \
|
||||||
|
-e "s|\${MYSQL_SERVICE_NAME}|${MYSQL_SERVICE_NAME}|g" \
|
||||||
|
-e "s|\${NETWORK_NAME}|${NETWORK_NAME}|g" \
|
||||||
|
-e "s|\${NGINX_PORT}|${NGINX_PORT}|g" \
|
||||||
|
-e "s|\${MYSQL_PORT}|${MYSQL_PORT}|g" \
|
||||||
|
-e "s|\${MYSQL_DATABASE}|${MYSQL_DATABASE}|g" \
|
||||||
|
-e "s|\${MYSQL_USER}|${MYSQL_USER}|g" \
|
||||||
|
-e "s|\${MYSQL_PASSWORD}|${MYSQL_PASSWORD}|g" \
|
||||||
|
-e "s|\${MYSQL_ROOT_PASSWORD}|${MYSQL_ROOT_PASSWORD}|g" \
|
||||||
|
< docker-compose.yml.template > "$PROJECT_DIR/docker-compose.yml"
|
||||||
|
|
||||||
|
# Start the containers
|
||||||
|
echo "Starting containers..."
|
||||||
|
cd "$PROJECT_DIR" || exit
|
||||||
|
docker compose up --build -d
|
||||||
|
|
||||||
|
# Wait for the app container to become ready
|
||||||
|
echo "Waiting for app container (${APP_SERVICE_NAME}) to initialize..."
|
||||||
|
while ! docker exec -it "${APP_SERVICE_NAME}" bash -c "php -v" >/dev/null 2>&1; do
|
||||||
|
echo "Waiting for ${APP_SERVICE_NAME} to become ready..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Run Composer to create the Laravel project inside the container
|
||||||
|
echo "Creating Laravel project inside the app container..."
|
||||||
|
docker exec -it "${APP_SERVICE_NAME}" bash -c "composer create-project --prefer-dist laravel/laravel ."
|
||||||
|
|
||||||
|
# Adjust permissions for Laravel's storage and cache directories
|
||||||
|
echo "Setting permissions for Laravel directories..."
|
||||||
|
docker exec -it "${APP_SERVICE_NAME}" bash -c "chown -R www-data:www-data /var/www/html && chmod -R 775 /var/www/html"
|
||||||
|
|
||||||
|
echo "Laravel project setup complete. Access your application at http://<your-server>:${NGINX_PORT}"
|
||||||
Loading…
x
Reference in New Issue
Block a user