first commit

This commit is contained in:
agung
2023-08-01 20:02:08 +07:00
commit b34e556798
10 changed files with 423 additions and 0 deletions

18
.editorconfig Normal file
View File

@@ -0,0 +1,18 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[Makefile]
indent_style = tab

9
.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
# Editor
.vscode
# Container file
/docker/postgres/data/*
!/docker/postgres/data/.gitkeep
# Working directory
src/*

70
Dockerfile Normal file
View File

@@ -0,0 +1,70 @@
# PHP-FPM is a FastCGI implementation for PHP.
# Read more here: https://hub.docker.com/_/php
FROM php:8.2-fpm
RUN apt-get update
# Install useful tools
RUN apt-get -y install apt-utils nano wget dialog vim
# Install system dependencies
RUN apt-get -y install --fix-missing \
apt-utils \
build-essential \
git \
curl \
libcurl4 \
libcurl4-openssl-dev \
zlib1g-dev \
libzip-dev \
zip \
libbz2-dev \
locales \
libmcrypt-dev \
libicu-dev \
libonig-dev \
libxml2-dev
RUN docker-php-ext-install \
exif \
pcntl \
bcmath \
ctype \
curl \
pcntl \
zip
# Install Postgre PDO
RUN apt-get install -y libpq-dev \
&& docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
&& docker-php-ext-install pdo pdo_pgsql pgsql
# Install NPM
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
RUN apt-get install -y nodejs
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install Composer
COPY --from=composer:2.3 /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/html
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory contents
COPY ./src /var/www/html
# Copy existing application directory permissions
COPY --chown=www:www ./src /var/www/html
# Change current user to www
USER www
# Set port for application
EXPOSE 8000

95
Makefile Normal file
View File

@@ -0,0 +1,95 @@
up:
docker compose up -d
build:
docker compose build
laravel-install:
docker compose exec app composer create-project --prefer-dist laravel/laravel .
create-project:
mkdir -p src
@make build
@make up
@make laravel-install
docker compose exec app php artisan key:generate
docker compose exec app php artisan storage:link
docker compose exec app chmod -R 777 storage bootstrap/cache
docker compose exec app npm install
init:
docker compose up -d --build
docker compose exec app composer install
docker compose exec app cp .env.example .env
docker compose exec app php artisan key:generate
docker compose exec app php artisan storage:link
docker compose exec app chmod -R 777 storage bootstrap/cache
docker compose exec app npm install
@make fresh
remake:
@make destroy
@make init
stop:
docker compose stop
down:
docker compose down --remove-orphans
down-v:
docker compose down --remove-orphans --volumes
restart:
@make down
@make up
destroy:
docker compose down --rmi all --volumes --remove-orphans
ps:
docker compose ps
logs:
docker compose logs
logs-watch:
docker compose logs --follow
log-web:
docker compose logs web
log-web-watch:
docker compose logs --follow web
log-app:
docker compose logs app
log-app-watch:
docker compose logs --follow app
log-db:
docker compose logs postgres
log-db-watch:
docker compose logs --follow postgres
web:
docker compose exec web bash
app:
docker compose exec app bash
migrate:
docker compose exec app php artisan migrate
fresh:
docker compose exec app php artisan migrate:fresh --seed
seed:
docker compose exec app php artisan db:seed
dacapo:
docker compose exec app php artisan dacapo
rollback-test:
docker compose exec app php artisan migrate:fresh
docker compose exec app php artisan migrate:refresh
tinker:
docker compose exec app php artisan tinker
test:
docker compose exec app php artisan test
optimize:
docker compose exec app php artisan optimize
optimize-clear:
docker compose exec app php artisan optimize:clear
cache:
docker compose exec app composer dump-autoload -o
@make optimize
docker compose exec app php artisan event:cache
docker compose exec app php artisan view:cache
cache-clear:
docker compose exec app composer clear-cache
@make optimize-clear
docker compose exec app php artisan event:clear
dump-autoload:
docker compose exec app composer dump-autoload
ide-helper:
docker compose exec app php artisan clear-compiled
docker compose exec app php artisan ide-helper:generate
docker compose exec app php artisan ide-helper:meta
docker compose exec app php artisan ide-helper:models --nowrite

85
README.md Normal file
View File

@@ -0,0 +1,85 @@
# Laravel using PostgreSQL in Docker
<p align="center">
<img src="./docker/images/laravel+docker.png" alt="docker+laravel">
</p>
## Introduction
Build a simple laravel application development environment with docker compose.
## Requirement
- Docker ^19.*
## Installation
1. Git clone & move to working directory
2. Settings your credentials docker compose using [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)
- Create credentials for DB Name
```bash
$ echo "<your_db_name>" | docker secret create app_db_name -
```
- Create credentials for DB User
```bash
$ echo "<your_db_user>" | docker secret create app_db_user -
```
- Create credentials for DB Password
```bash
$ echo "<your_db_password>" | docker secret create app_db_password -
```
### *Optional credentials*
If you want to use pgAdmin management add this credentials:
- Create credentials for pgAdmin Password
```bash
$ echo "<your_pgadmin_password>" | docker secret create app_pgadmin_password -
```
**Uncomment** in top level secret for pgAdmin in file docker-compose.yml to:
```bash
app_pgadmin_password:
external: true
```
1. Execute the following command for create application
```bash
$ make create-project
```
4. set src/.env variable :
```
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=<your_database>
DB_USERNAME=<your_username>
DB_PASSWORD=<your_password>
```
5. show application in [http://localhost:85](http://localhost:85)
6. show adminer in [http://localhost:8080](http://localhost:8080)
7. list execute command in [Makefile](Makefile).
## Container details :
- ``app`` use image:
- [php](https://hub.docker.com/_/php):8.2-fpm
- [composer](https://hub.docker.com/_/composer):2.3
- [npm](https://deb.nodesource.com/setup_lts.x):latest
- ``web`` use image:
- [nginx](https://hub.docker.com/_/nginx):stable-alpine
- ``db`` use image:
- [postgres](https://hub.docker.com/_/postgres):15
- ``adminer`` use image:
- [adminer](https://hub.docker.com/_/adminer):latest
*Optional*
- ``pgadmin`` use image:
- [pgadmin](https://hub.docker.com/_/pgadmin):latest

88
docker-compose.yml Normal file
View File

@@ -0,0 +1,88 @@
version: "3.9"
networks:
aselole:
name: aselole
services:
app:
container_name: aselole-app
build:
context: .
dockerfile: Dockerfile
volumes:
- ./src:/var/www/html
depends_on:
- postgres
networks:
- aselole
postgres:
container_name: aselole-db
image: postgres:15
restart: always
volumes:
- ./docker/postgres/data:/var/lib/postgres/data
environment:
- POSTGRES_DB_FILE=/run/secrets/app_db_name
- POSTGRES_USER_FILE=/run/secrets/app_db_user
- POSTGRES_PASSWORD_FILE=/run/secrets/app_db_password
secrets:
- app_db_name
- app_db_user
- app_db_password
ports:
- "5432:5432"
networks:
- aselole
web:
container_name: aselole-web
image: nginx:stable-alpine
restart: always
ports:
- "81:80"
- "5173:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- aselole
# Database management with pgAdmin
pgadmin:
image: dpage/pgadmin4
container_name: aselole-pgAdmin
environment:
- PGADMIN_DEFAULT_EMAIL=agung@gmail.com
- PGADMIN_DEFAULT_PASSWORD_FILE=/run/secrets/app_pgadmin_password
secrets:
- app_pgadmin_password
ports:
- "5050:80"
depends_on:
- postgres
networks:
- aselole
# Database management with Adminer
adminer:
container_name: aselole-adminer
image: adminer
restart: always
ports:
- "8080:8080"
depends_on:
- postgres
networks:
- aselole
secrets:
app_db_name:
external: true
app_db_user:
external: true
app_db_password:
external: true
app_pgadmin_password:
external: true

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

35
docker/nginx/default.conf Normal file
View File

@@ -0,0 +1,35 @@
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
location ~ /\.(?!well-known).* {
deny all;
}
}

0
docker/postgres/.gitkeep Normal file
View File

23
secret.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
# Create Docker secrets for the database configuration
echo "Creating Docker secrets for the database configuration..."
# Create the secret for the database name
echo "aselole_db" | docker secret create app_db_name -
echo "Secret for database name (aselole_db) created."
# Create the secret for the database user
echo "aselole" | docker secret create app_db_user -
echo "Secret for database user (aselole) created."
# Create the secret for the database password
echo "password!" | docker secret create app_db_password -
echo "Secret for database password created."
# Create the secret for the database password
echo "password!" | docker secret create app_pgadmin_password -
echo "Secret for pgAdmin password created."
# Finished creating Docker secrets
echo "Docker secrets for the database configuration have been set up."