Skip to content

Commit 9f4035b

Browse files
committed
add docker setup
1 parent bcf91e1 commit 9f4035b

File tree

17 files changed

+438
-8
lines changed

17 files changed

+438
-8
lines changed

.github/workflows/ci.yml

+14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ on:
66
- cron: '0 0 * * *'
77

88
jobs:
9+
docker-compose:
10+
name: docker-compose (production container)
11+
runs-on: ubuntu-22.04
12+
steps:
13+
- name: checkout
14+
uses: actions/checkout@v4
15+
- name: docker build / start
16+
run: docker compose -f docker-compose.ci.yml up -d
17+
- name: wait for nginx
18+
run: while ! nc -z localhost 443; do sleep 0.1; done
19+
- name: ping
20+
run: curl --insecure https://localhost/ping -vvv
21+
- name: docker stop
22+
run: docker compose -f docker-compose.ci.yml stop
923
php81:
1024
name: PHP 8.1
1125
runs-on: ubuntu-22.04

README.md

+18-8
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,32 @@ A minimal skeleton to start with a minimal php project.
3131
* [slim/psr7][25]: ^1.6.1
3232
* [symfony/console][26]: ^6.4.2
3333

34-
## Installation
34+
## Environment
3535

36-
Through [Composer](http://getcomposer.org) as [chubbyphp/chubbyphp-framework-skeleton][10].
36+
Add the following environment variable to your system, for example within `~/.bash_aliases`:
3737

38-
```bash
39-
composer create-project chubbyphp/chubbyphp-framework-skeleton myproject "dev-master"
38+
```sh
39+
export USER_ID=$(id -u)
40+
export GROUP_ID=$(id -g)
4041
```
4142

42-
## Server
43+
### Docker
4344

44-
### Builtin
45+
```sh
46+
docker-compose up -d
47+
docker-compose exec php bash
48+
```
49+
50+
## Setup
4551

46-
```bash
47-
APP_ENV=dev php -S localhost:10080 -t public public/index.php
52+
```sh
53+
composer install
4854
```
4955

56+
## Urls
57+
58+
* GET https://localhost/ping
59+
5060
## Copyright
5161

5262
2024 Dominik Zogg

docker-compose.ci.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
services:
2+
php:
3+
container_name: chubbyphp-framework-skeleton-php
4+
hostname: chubbyphp-framework-skeleton-php
5+
build:
6+
dockerfile: ./docker/production/php/Dockerfile
7+
context: ./
8+
environment:
9+
APP_ENV: prod
10+
nginx:
11+
container_name: chubbyphp-framework-skeleton-nginx
12+
hostname: chubbyphp-framework-skeleton-nginx
13+
image: nginx
14+
environment:
15+
SERVER_PORT: '443'
16+
PHP_FPM_SERVER_HOST: 'php'
17+
PHP_FPM_SERVER_PORT: '9000'
18+
ports:
19+
- '443:443'
20+
volumes:
21+
- ./docker/development/nginx:/etc/nginx/templates
22+
- ${PWD}:/app:ro
23+
depends_on:
24+
- php

docker-compose.yml

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
services:
2+
php:
3+
container_name: chubbyphp-framework-skeleton-php
4+
hostname: chubbyphp-framework-skeleton-php
5+
build:
6+
dockerfile: ./docker/development/php/Dockerfile
7+
context: ./
8+
args:
9+
USER_ID: ${USER_ID:-1000}
10+
GROUP_ID: ${GROUP_ID:-1000}
11+
environment:
12+
APP_ENV: dev
13+
SSH_AUTH_SOCK: /ssh-agent
14+
volumes:
15+
- ${PWD}:/app
16+
- ~/.bash_docker:/home/php/.bash_docker
17+
- ~/.bash_history:/home/php/.bash_history
18+
- ~/.gitconfig:/home/php/.gitconfig
19+
- ~/.gitignore:/home/php/.gitignore
20+
- ~/.zsh_docker:/home/php/.zsh_docker
21+
- ~/.zsh_history:/home/php/.zsh_history
22+
- $SSH_AUTH_SOCK:/ssh-agent
23+
extra_hosts:
24+
- "host.docker.internal:host-gateway"
25+
ports:
26+
- '9003:9003'
27+
nginx:
28+
container_name: chubbyphp-framework-skeleton-nginx
29+
hostname: chubbyphp-framework-skeleton-nginx
30+
image: nginx
31+
environment:
32+
SERVER_PORT: '443'
33+
PHP_FPM_SERVER_HOST: 'php'
34+
PHP_FPM_SERVER_PORT: '9000'
35+
ports:
36+
- '443:443'
37+
volumes:
38+
- ./docker/development/nginx:/etc/nginx/templates
39+
- ${PWD}/public:/app/public:ro
40+
depends_on:
41+
- php

docker/development/nginx/certificate

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDjTCCAnWgAwIBAgIURrxwpTnZX/BFlC+IkbyIMm8gGhowDQYJKoZIhvcNAQEL
3+
BQAwVjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UE
4+
CgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIy
5+
MDcyMzExMDY0NloXDTMyMDcyMDExMDY0NlowVjELMAkGA1UEBhMCWFgxFTATBgNV
6+
BAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDES
7+
MBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
8+
AQEApnA0djbna5kyWilf/4bfKfmZUZw0qMjLGDQuB5jda+Ug8lLbDKnQMeBPn+0w
9+
g4BDanL9PilgIIHJpUZNKTwVZ7V1chNRHtaoTWMmtnjgpTRm99boKygJT/blo6S8
10+
RTovDrAK9OaDIF8sKvlvT0PnPZp/4j1VSiu5bZA0AxUV/2KykoZ1F2GrZg1/PcEp
11+
07+WY7r0vD2dchJquMx3WguQpfnYD/1J4wkxGzNXEMp+5vNRTmF5+/T3wkC9tRmW
12+
fnzu4IiJKJpxqk58pmnUK1PurzjQ3VWpE35bAJmAynQlZ7LM8GwiX0IBks5bp/qE
13+
IDLtoI4sh5lRedWojDnB+gRG0QIDAQABo1MwUTAdBgNVHQ4EFgQUpHNGxrnC7ZEB
14+
u2qOTnsoXLK4kXwwHwYDVR0jBBgwFoAUpHNGxrnC7ZEBu2qOTnsoXLK4kXwwDwYD
15+
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAGWmjlic4UiYL9xe7JAqg
16+
U4uiZYUWXcAcprJfvpiBlIy6fFPuOW4WVeCRLOOjHUyPc24DIgCyiuKCoqVgMuGC
17+
5EqfOsn/nXLSsAo3shexF4kQDuFawDtS57Ldo06/DRliP43e65OcOIhIEcHbRK9S
18+
p3UKX4r1cQfaRGQLdSk/KUiLcVr5+QZedgOQDNe3l2GwwVOf0leOCmgw2CDIe2kx
19+
GzZsxP4ZnBj2P7Q8rK1tdDRwF8f2291ORzsImIo16En8LzLPSdV13fIGub2qVavf
20+
JVcaTNjqygqPjQAZYppterkPxGmSN0+GaKQ3VjlqPPB+IFSENou8NsUdveKmqmca
21+
Lw==
22+
-----END CERTIFICATE-----
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCmcDR2NudrmTJa
3+
KV//ht8p+ZlRnDSoyMsYNC4HmN1r5SDyUtsMqdAx4E+f7TCDgENqcv0+KWAggcml
4+
Rk0pPBVntXVyE1Ee1qhNYya2eOClNGb31ugrKAlP9uWjpLxFOi8OsAr05oMgXywq
5+
+W9PQ+c9mn/iPVVKK7ltkDQDFRX/YrKShnUXYatmDX89wSnTv5ZjuvS8PZ1yEmq4
6+
zHdaC5Cl+dgP/UnjCTEbM1cQyn7m81FOYXn79PfCQL21GZZ+fO7giIkomnGqTnym
7+
adQrU+6vONDdVakTflsAmYDKdCVnsszwbCJfQgGSzlun+oQgMu2gjiyHmVF51aiM
8+
OcH6BEbRAgMBAAECggEAQnm7QmHwcVXJOiCfYoA8Xtf9qA5TK/yyvVKN9ePUwBTO
9+
YWq9aaPjbyBPvSjvgP44LuqJggvlhGZCIxxekjMYu4jKxUq40i/bHbmVyzihROqW
10+
m7N+nEoL2h/bHU6dEatJAz1FywXMZqAMlId2sTqGP+EW5cYobAzlrUB0vaxs0ki0
11+
ymu9cqAN3V2WHAtryg52OjkdyTOrcXxVtFaNC28G/rgChQniCmV9WKwW0lIcFJUh
12+
/ZCaPESXCbJJSRQ8JPYzBVm3fiF+hT1jEo5JeEzC/cceEQFRBqua0uFqiq6bXGOr
13+
0MZQdzSh+iLGSyOM6mPbMxt/QvRnKnR8oH8STVWTJwKBgQDX8YJ4ALt42W+TQHuI
14+
6IxgVaoi9t2MjWk0VjIcBEYXfvVyH8Pys4SgZnu73kTLmnH5CImKIf3uKxkBTaqs
15+
9+wZskgrn7uOgZ3HjaFzIrMkD8cX0Rr8DP+RXP72yJjEUMmTd3J6DtjNuhjsyhtO
16+
EH2OTqCMFRYCG8ppEsMS17ht8wKBgQDFT9mUDlYI3zwt672kbNaUqApz1GShw86J
17+
Vq7wsozJzAmTDv5FzHbcZJCRoh1Dn1nIj8GIVvd1vIWe3Uxi2enizc1hvxoFfqYX
18+
yKpLin8ME3XF+dV7AUa6W5XUqbjG1lKbvnE44kfeujO3A/8ViIAUWcofCXj+5dRy
19+
88+qcL+1KwKBgQDOR3omQCzViH+43kQjyGEwNSTNOZzxgrQYtq4vbTW3hCPa3NVF
20+
po7u2ncgQ3bcN7Df/3PDbC0xsiG0yQhdKodzFIc0hOWZf9/EnFq5rVALBrdc3Pc2
21+
BwSrS3aTL5QfFD06jUPhrQUVoMvmhjoHHGGT6zAaIJphcUKtlKqb+U3IWQKBgFZN
22+
+QOzyZoT2wTTCp5zJODdJ8VGb8X6Gcsk6VxLHR3fa4ixlDL/njYEnt+0o0xC1UjO
23+
6H40XAVZsrCsZ48NdipIjr9kkYM5xHi+ww5LxAqKMIeqIeCtzDwTd1QP8My4TmXl
24+
RSz2fS1FEP3Kd7b5f9xm8evlftEvwl+NmZYZvyEFAoGBAIjd46Ma4yyrkWcUg4do
25+
e7g6GfqiqfHaJmj/hnACqB4M0ilg6FvLPPkMaG/mtV8JO50XUBGuKwvnyncaVeDL
26+
46bVUALDlIN7OKXMRZ6cdbPcFhjzaqiUusLpNgTZvwI9x9U4Zxjc8K1wpA01wG9B
27+
WuKg0HYUNGS0+NAqDyCx7KHU
28+
-----END PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
access_log /var/log/nginx/access.log;
2+
error_log /var/log/nginx/error.log;
3+
4+
server {
5+
listen ${SERVER_PORT} default_server ssl http2;
6+
7+
ssl_certificate /etc/nginx/templates/certificate;
8+
ssl_certificate_key /etc/nginx/templates/certificate_key;
9+
10+
root /app/public;
11+
12+
location / {
13+
try_files $uri /index.php$is_args$args;
14+
}
15+
16+
location ~ \.php {
17+
try_files $uri =404;
18+
fastcgi_split_path_info ^(.+\.php)(/.+)$;
19+
include fastcgi_params;
20+
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
21+
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
22+
fastcgi_index index.php;
23+
fastcgi_pass ${PHP_FPM_SERVER_HOST}:${PHP_FPM_SERVER_PORT};
24+
fastcgi_read_timeout 600;
25+
}
26+
}

docker/development/nginx/readme

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout certificate_key -out certificate
2+
# Common Name (eg, your name or your server's hostname) []:localhost

docker/development/php/Dockerfile

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
FROM rockylinux:9.3
2+
3+
SHELL ["/bin/bash", "-c"]
4+
5+
RUN dnf upgrade -y --refresh
6+
7+
RUN dnf install -y epel-release https://rpms.remirepo.net/enterprise/remi-release-9.rpm
8+
9+
RUN dnf install -y --nobest \
10+
compat-openssl11 \
11+
git \
12+
glibc-langpack-de \
13+
langpacks-de \
14+
nmap-ncat \
15+
php83-php-ast \
16+
php83-php-cli \
17+
php83-php-devel \
18+
php83-php-fpm \
19+
php83-php-intl \
20+
php83-php-mbstring \
21+
php83-php-opcache \
22+
php83-php-pecl-apcu \
23+
php83-php-pecl-pcov \
24+
php83-php-pecl-xdebug3 \
25+
php83-php-pecl-zip \
26+
php83-php-xml \
27+
procps-ng \
28+
sudo \
29+
supervisor \
30+
unzip \
31+
vim \
32+
zsh
33+
34+
RUN ln -sf /usr/bin/php83 /usr/bin/php \
35+
&& rm /etc/opt/remi/php83/php.d/15-xdebug.ini \
36+
&& rm /etc/opt/remi/php83/php.d/40-pcov.ini
37+
38+
ENV TZ=Europe/Zurich
39+
40+
RUN echo "LANG=de_CH.UTF-8" > /etc/locale.conf \
41+
&& cp -f /usr/share/zoneinfo/${TZ} /etc/localtime
42+
43+
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
44+
45+
COPY docker/production/php/files /
46+
COPY docker/development/php/files /
47+
48+
ARG USER_ID
49+
ARG GROUP_ID
50+
51+
RUN groupadd -g ${GROUP_ID} php \
52+
&& useradd -u ${USER_ID} -g ${GROUP_ID} -s /bin/bash -M php \
53+
&& chown -Rf php: /home/php \
54+
&& echo 'php ALL=(ALL) NOPASSWD: ALL' > '/etc/sudoers.d/php'
55+
56+
USER php
57+
58+
WORKDIR /app
59+
60+
CMD /usr/bin/supervisord
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[php]
2+
error_reporting = E_ALL
3+
display_errors = On
4+
display_startup_errors = On
5+
6+
[xdebug]
7+
xdebug.mode=coverage,develop,debug
8+
xdebug.client_host=host.docker.internal
9+
xdebug.start_with_request=yes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
[unix_http_server]
2+
file=/tmp/supervisor.sock
3+
4+
[supervisord]
5+
logfile=/tmp/supervisord.log
6+
loglevel=info
7+
pidfile=/tmp/supervisord.pid
8+
nodaemon=true
9+
silent=true
10+
11+
[rpcinterface:supervisor]
12+
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
13+
14+
[supervisorctl]
15+
serverurl=unix:///tmp/supervisor.sock
16+
17+
[program:php-fpm]
18+
command=/opt/remi/php83/root/usr/sbin/php-fpm -c /etc/opt/remi/php83/php-fpm.conf -F
19+
stdout_logfile=/tmp/supervisord.log
20+
stdout_syslog=true
21+
stderr_logfile=/tmp/supervisord.log
22+
stderr_syslog=true
23+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export CLICOLOR='true'
2+
export PS1='\[\e[1;32m\]\h\[\e[0m\] \[\e[1;37m\]\w\[\e[0m\] \[\e[3m\]($(git rev-parse --abbrev-ref HEAD 2> /dev/null))\[\e[23m\] \[\e[1;32m\]\u\[\e[0m\] '
3+
4+
# history
5+
export HISTCONTROL='ignoreboth:erasedups'
6+
export HISTFILE=~/.bash_history
7+
export PROMPT_COMMAND='history -a'
8+
9+
source $HOME/.sharedrc
10+
11+
if [ -f "$HOME/.bash_docker" ]; then
12+
source $HOME/.bash_docker
13+
fi
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export HISTSIZE=5000
2+
export SAVEHIST=100000
3+
4+
export EDITOR='vim'
5+
6+
alias cls="printf '\033c'; printf '\033[3J'"
7+
8+
alias ls='ls -ahl --color=auto'
9+
alias mkdir='mkdir -pv'
10+
11+
alias cp='cp -i'
12+
alias ln='ln -i'
13+
alias mv='mv -i'
14+
alias rm='rm -i'
15+
16+
alias php-fpm-restart='/usr/bin/supervisorctl -c /etc/supervisord.conf restart php-fpm'
17+
18+
alias xdebug-on='echo "zend_extension=xdebug.so" | sudo tee /etc/opt/remi/php83/php.d/15-xdebug.ini && php-fpm-restart'
19+
alias xdebug-off='sudo rm /etc/opt/remi/php83/php.d/15-xdebug.ini && php-fpm-restart'
20+
alias pcov-on='echo "extension=pcov.so" | sudo tee /etc/opt/remi/php83/php.d/40-pcov.ini && php-fpm-restart'
21+
alias pcov-off='sudo rm /etc/opt/remi/php83/php.d/40-pcov.ini && php-fpm-restart'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
autoload colors && colors
2+
setopt PROMPT_SUBST
3+
export PROMPT='%{$fg_bold[green]%}%m%{$reset_color%} %{$fg_bold[white]%}%~%{$reset_color%} ($(git symbolic-ref --short HEAD 2> /dev/null)) %{$fg_bold[green]%}%n%{$reset_color%} % '
4+
5+
# history
6+
setopt hist_ignore_dups
7+
setopt hist_ignore_space
8+
setopt hist_expire_dups_first
9+
setopt inc_append_history
10+
11+
export HISTFILE=~/.zsh_history
12+
13+
source $HOME/.sharedrc
14+
15+
if [ -f "$HOME/.zsh_docker" ]; then
16+
source $HOME/.zsh_docker
17+
fi

0 commit comments

Comments
 (0)