+ heroku docker

This commit is contained in:
felegy
2022-06-10 15:06:45 +02:00
parent 039d95726c
commit e68f6ff23d
17 changed files with 5478 additions and 114 deletions

89
.dev/Dockerfile Normal file
View File

@@ -0,0 +1,89 @@
ARG STACK_VERSION=20
ARG YQ_VERSION=4.25.2
ARG JQ_VERSION=1.6
ARG XDEBUG_VERSION=3.1.5
ARG USER_NAME=heroku
ARG UID=1000
ARG GID=1000
FROM heroku/heroku:${STACK_VERSION}-build AS dev-base
ENV DEBIAN_FRONTEND noninteractive
RUN \
apt-get -qq update; \
apt-get install -y --no-install-recommends \
mysql-client \
awscli \
&& apt-get download nginx-common \
&& rm -rf /var/lib/apt/lists/*; \
wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh; \
curl -sLo /usr/local/bin/mhsendmail \
https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64; \
chmod +x /usr/local/bin/mhsendmail;
FROM composer AS build
ARG YQ_VERSION
ARG JQ_VERSION
WORKDIR /workspace/bin
RUN \
curl -sSLo ./yq https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_amd64; \
chmod a+x ./yq; \
curl -sSLo ./jq https://github.com/stedolan/jq/releases/download/jq-${JQ_VERSION}/jq-linux64; \
chmod a+x ./jq;
WORKDIR /workspace
COPY ./composer.json /tmp/composer.json
RUN \
PATH="/workspace/bin:$PATH"; \
php_version=$(cat /tmp/composer.json | jq '.require .php' --raw-output); \
composer init --name "heroku/dev" --type project --require="php:$php_version" --stability=stable --no-interaction 2>/dev/stdout; \
composer install --ignore-platform-reqs --no-dev --prefer-dist --optimize-autoloader --no-interaction 2>/dev/stdout; \
rm -rf ./vendor; \
php_modules=$(cat /tmp/composer.json | bin/jq '.require | keys []' --raw-output | grep ext-); \
for m in $php_modules; do composer require --no-install --ignore-platform-reqs $m:* 2>/dev/stdout; done;
FROM dev-base
ARG STACK_VERSION
ARG USER_NAME
ARG UID
ARG GID
ARG STACK=heroku-${STACK_VERSION}
ARG XDEBUG_VERSION
COPY .dev/bashrc /tmp/bashrc
COPY .dev/entrypoint-dev.sh /entrypoint.sh
RUN groupadd -r --gid ${GID} ${USER_NAME}; \
useradd -M ${USER_NAME} -d /app --uid ${UID} --gid ${GID}; \
cat /tmp/bashrc >> /etc/profile; rm /tmp/bashrc; \
mkdir -p /app /workspace /buildpacks; chown -R ${USER_NAME}:${USER_NAME} /app /workspace /buildpacks; \
chmod a+x /entrypoint.sh;
COPY --chown=${USER_NAME}:${USER_NAME} .dev/xdebug-install.sh /tmp/xdebug-install.sh
COPY --chown=${USER_NAME}:${USER_NAME} --from=build /workspace /workspace
USER ${USER_NAME}
WORKDIR /workspace
RUN \
mkdir -p /buildpacks/php; \
curl -fsSL https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/php.tgz | tar -xz -C /buildpacks/php; \
echo "web: tail -f /dev/null" >> Procfile; \
mkdir -p /tmp/build_cache /tmp/env; \
/buildpacks/php/bin/compile $(pwd) /tmp/build_cache /tmp/env 2>/dev/stdout; \
PATH="/workspace/.heroku/php/bin:$PATH"; \
LOGDIR=/tmp /tmp/xdebug-install.sh 2>/dev/stdout; \
rm -rf /tmp/* /app/*
WORKDIR /app
ENV STACK=${STACK}
ENV PORT=3000
ENV FORCE_SECRETS=0
ENTRYPOINT [ "/entrypoint.sh" ]
CMD ["web"]

13
.dev/bashrc Normal file
View File

@@ -0,0 +1,13 @@
# prompt
export PS1='\[\033[01;34m\]\w\[\033[00m\] \[\033[01;32m\]$ \[\033[00m\]'
# profile feature switch
if [ -d $HOME/.profile.d ]; then
for i in $HOME/.profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi

36
.dev/entrypoint-dev.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/usr/bin/env sh
COMMAND=$*
if [ ! -d /app/.heroku ]; then
cp -r /workspace/.heroku /app
fi
if [ ! -f /app/.profile.d/100-php.sh ]; then
cp -r /workspace/.profile.d /app
fi
XDEBUG_ENABLE=${XDEBUG_ENABLE-0}
export XDEBUG_ENABLE
rm -f /app/.heroku/php/etc/php/conf.d/999-xdebug.ini
if [ "$XDEBUG_ENABLE" = 1 ]; then
ln -sn $(pwd)/.dev/xdebug.ini /app/.heroku/php/etc/php/conf.d/999-xdebug.ini
fi
PATH="/workspace/bin:$PATH"
export PATH
HISTFILE=${HISTFILE-/tmp/.bash_history}
export HISTFILE
keys=$(yq e '. | keys' Procfile | cut -c 3-)
for key in $keys; do
echo '#!/usr/bin/env bash' > "/workspace/bin/$key"
yq e ".$key" Procfile >> "/workspace/bin/$key"
chmod +x "/workspace/bin/$key"
done
bash -l -c "$COMMAND"

View File

@@ -2,15 +2,15 @@
PHP_BUILDPACK=${PHP_BUILDPACK:-"/buildpack/php"};
mkdir -p /tmp/build_cache /tmp/env;
mkdir -p /tmp/build_cache;
rm -rf /app/.heroku /app/.profile.d /app/vendor/*
rm -rf /app/.heroku /app/vendor/*
STACK=heroku-20 "$PHP_BUILDPACK/bin/compile" /app /tmp/build_cache /tmp/env;
STACK=heroku-20 "$PHP_BUILDPACK/bin/compile" /app /tmp/build_cache /run/secrets;
cp -v config/mailhog.ini /app/.heroku/php/etc/php/conf.d/225-mailhog.ini;
rm -rf /app/vendor/*;
composer install;
exec .dev/xdebug-install.sh;
exec ".dev/xdebug-install.sh";

View File

@@ -28,7 +28,7 @@ echo -e "${OK}done${NC}"
#git clone git://github.com/xdebug/xdebug.git $XDEBUG_SRC_PATH
#echo -e "${OK}done${NC}"
LOGDIR="${PWD}/.log"
LOGDIR=${LOGDIR-"${PWD}/.log"}
mkdir -p "${LOGDIR}"
LOGFILE="${LOGDIR}/xdebug_build.log"
@@ -59,13 +59,13 @@ echo -e "${LED}XDEBUG${NC} Compile at $XDEBUG_SRC_PATH ..."
cp -v modules/*.la $LIB_PATH
echo -e "${OK}done${NC}"
echo -e "${LED}XDEBUG${NC} Install ini to $INSTALL_PATH ..."
if [ ! -f $XDEBUG_INI_PATH ]; then
echo "zend_extension = xdebug.so" >> $XDEBUG_INI_PATH
fi
# echo -e "${LED}XDEBUG${NC} Install ini to $INSTALL_PATH ..."
# if [ ! -f $XDEBUG_INI_PATH ]; then
# echo "zend_extension = xdebug.so" >> $XDEBUG_INI_PATH
# fi
cp -v $XDEBUG_INI_PATH $INSTALL_PATH/$XDEBUG_INI
echo -e "${OK}done${NC}"
# cp -v $XDEBUG_INI_PATH $INSTALL_PATH/$XDEBUG_INI
# echo -e "${OK}done${NC}"
echo -e "${LED}XDEBUG${NC} All Install ${OK}done${NC}"
###########################################################################

View File

@@ -2,6 +2,8 @@
# Application
**/web/app/plugins/*
!**/web/app/plugins/.gitkeep
**/web/app/themes/*
!**/web/app/themes/.gitkeep
**/web/app/mu-plugins/*/
**/web/app/upgrade
**/web/app/uploads/*
@@ -24,8 +26,14 @@
**/.*/*
!**/.**/.gitkeep
!**/.dev/*
!**/.github/*
!**/.profile.d/999-app.sh
# Composer
vendor
# WP-CLI
**/wp-cli.local.yml
# deploy
**/deploy.tar.gz

1
.gitignore vendored
View File

@@ -26,6 +26,7 @@ web/.htaccess
!.**/.gitkeep
!.dev/*
!.github/*
!.profile.d/999-app.sh
# Composer
/vendor

15
.profile.d/999-app.sh Normal file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env bash
SECRETS_PATH=${SECRETS_PATH:-"/run/secrets"};
SECRETS_FORCE=${SECRETS_FORCE:-1};
if [ -d "${SECRETS_PATH}" ]; then
for file in "${SECRETS_PATH}/*"; do
name=$(basename $file);
if [ -z ${!name} ] || [ ${SECRETS_FORCE} = 1 ]; then
export "${name}=$( echo $(< $file) | tr '\n' ' ')";
fi
done
fi
export PATH="${HOME}/bin:${PATH}"

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash
alias d-composer="docker-compose run --rm --entrypoint=composer wordpress"
alias d-wp="docker-compose run --rm --entrypoint=wp wordpress"
alias d-composer="docker-compose run --rm wordpress composer"
alias d-wp="docker-compose run --rm wordpress wp"
alias d-heroku="docker-compose run --rm --entrypoint=heroku wordpress"
alias d-bash="docker-compose run --rm --entrypoint=bash wordpress -l"
alias dc-build="docker-compose build --pull --no-cache"

View File

@@ -1,11 +1,47 @@
Set-Alias -Name d-composer -Value "docker-compose run --rm --entrypoint -Value composer wordpress"
Set-Alias -Name d-wp -Value "docker-compose run --rm --entrypoint -Value wp wordpress"
Set-Alias -Name d-heroku -Value "docker-compose run --rm --entrypoint -Value heroku wordpress"
Set-Alias -Name d-bash -Value "docker-compose run --rm --entrypoint -Value bash wordpress -l"
Set-Alias -Name dc-build -Value "docker-compose build --pull --no-cache"
Set-Alias -Name dc-init -Value "docker-compose run --rm --entrypoint '.dev/init.sh' wordpress"
Set-Alias -Name dc-up -Value "docker-compose up -d"
Set-Alias -Name dc-down -Value "docker-compose down"
Set-Alias -Name dc-destroy -Value "docker-compose down -v"
Set-Alias -Name g-clean -Value "git clean -xd"
Set-Alias -Name g-mk-deploy -Value "git archive -o deploy.tar.gz HEAD"
Set-Alias d $(Get-Command docker).Source
Set-Alias dc $(Get-Command docker-compose).Source
Set-Alias g $(Get-Command git).Source
function d-composer {
dc run --rm wordpress composer $args
}
function d-wp {
dc run --rm wordpress wp $args
}
function d-heroku {
dc run --rm --entrypoint=heroku wordpress $args
}
function d-bash {
dc run --rm --entrypoint=bash wordpress -l $args
}
function dc-build {
dc build --pull --no-cache $args
}
function dc-init {
dc run --rm --entrypoint '.dev/init.sh' wordpress $args
}
function dc-up {
dc up -d $args
}
function dc-down {
dc down $args
}
function dc-destroy {
dc down -v $args
}
function g-clean {
g clean -xd $args
}
function g-mk-deploy {
g archive -o deploy.tar.gz HEAD
}

View File

@@ -1,46 +0,0 @@
ARG UID=1000
ARG GID=1000
ARG USER_NAME=heroku
FROM heroku/heroku:20-build AS base
RUN \
apt-get -qq update; \
apt-get install -y --no-install-recommends \
mysql-client \
&& apt-get download nginx-common \
&& rm -rf /var/lib/apt/lists/*; \
wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh; \
curl -sLo /usr/local/bin/wp \
https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar; \
chmod +x /usr/local/bin/wp; \
curl -sLo /usr/local/bin/mhsendmail \
https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64; \
chmod +x /usr/local/bin/mhsendmail;
FROM heroku/heroku:20-build AS build
COPY . /app
WORKDIR /app
RUN \
mkdir -p /tmp/buildpack/php /tmp/build_cache /tmp/env; \
curl -sL https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/php.tgz \
| tar --warning=none -xz -C /tmp/buildpack/php; \
STACK=heroku-20 /tmp/buildpack/php/bin/compile /app /tmp/build_cache /tmp/env; \
cp -v config/mailhog.ini /app/.heroku/php/etc/php/conf.d/225-mailhog.ini;
FROM base AS final
ARG UID
ARG GID
ARG USER_NAME
RUN \
groupadd -r --gid ${GID} ${USER_NAME}; \
useradd -M ${USER_NAME} -d /app --uid ${UID} --gid ${GID};
USER ${USER_NAME}
COPY --from=build --chown=heroku:heroku /app /app
COPY --from=build --chown=heroku:heroku /tmp/buildpack/php /buildpack/php
WORKDIR /app
ENV \
HOME=/app \
PATH=/app/.heroku/php/sbin:/app/.heroku/php/bin:/app/.heroku/php/sbin:/app/.heroku/php/bin:/app/.heroku/php/sbin:/app/.heroku/php/bin:/usr/local/bin:/usr/bin:/bin:/app/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
MAILHOG_ADDR=mailhog:1025
ENTRYPOINT [ "heroku","local" ]
CMD [ "web" ]

View File

@@ -1,3 +1,29 @@
# HVG Blog
A HVG balogoldalai alatt futó rendszer Roots.io Badrock WordPress alapon. A [roots/bedrock](https://github.com/roots/bedrock) repon alapul, annyi kiegészítéssel, hogy tartalmaz egy egyedik konfigurációt ([config/hvgblog.php](https://github.com/hvg-dev/blog/blob/main/config/hvgblog.php)) és ennek betöltésével van kiegészítve az alap konfiguráció ([config/application.php](https://github.com/hvg-dev/blog/blob/3663ba851b785d0d58f914fda519a7edc0e67299/config/application.php#L130)), minden más PHP Composer függőségként van betöltve (pl. minden plugin) két repohoz kell még jog mellé:
> ## Küldő repok
>
> [hvg-dev/hvg-blog-general](https://github.com/hvg-dev/hvg-blog-general) ez az összes blogon alapértelmezetten használt téma
>
> [hvg-dev/hvg-blog-muplugin](https://github.com/hvg-dev/hvg-blog-muplugin) ez a plugin ami néhány kötelező testre szabást tartalmaz az alapbeállításokkal ellentétben
>
> :warning: **Fontos, hogy legalább olvasási jog kell a repok-hoz mert a Composer direktben onnan tölti be őket**
>
> A fentiek miatt a Composer-hez szükséges GitHub token. Részletesebben itt &rarr; [Composer Auth GH_TOKEN](#composer-auth-gh_token)
Az összes többi kiegészítés csak a Heroku, Docker és egyéb DevOps környezetek működéséhez és használatához szükséges.
A repo egyben tartalmaz egy fejlesztési környezetet is, de ezt nem szükséges használni, lehet bármit használni egy alap [roots/bedrock](https://github.com/roots/bedrock) repoval és a fenti két Composer depenednciával valamint a saját konfiguráció betöltésével ([config/hvgblog.php](https://github.com/hvg-dev/blog/blob/main/config/hvgblog.php)).
## Composer Auth GH_TOKEN
HVG Blog
```

View File

@@ -39,7 +39,7 @@
}
],
"require": {
"php": ">=8.0 <8.1",
"php": ">=7.4 <8.1",
"ext-gd": "*",
"ext-redis": "*",
"ext-mbstring": "*",
@@ -55,15 +55,28 @@
"roots/wordpress": "^6.0",
"roots/wp-config": "^1.0.0",
"roots/wp-password-bcrypt": "^1.1.0",
"symfony/deprecation-contracts": "^2.2",
"wpackagist-theme/twentytwentytwo": "^1.2",
"hvg-dev/hvg-blog-muplugin": "dev-main",
"hvg-dev/hvg-blog-general": "dev-main",
"humanmade/s3-uploads": "dev-master",
"wpackagist-plugin/code-snippets": "^3.1",
"wpackagist-plugin/wp-webhooks": "^2.0",
"wpackagist-plugin/code-snippets": "^3.1"
"wpackagist-plugin/disable-wordpress-updates": "^1.7",
"wpackagist-plugin/disable-comments": "^2.3",
"wpackagist-plugin/two-factor": "^0.7.1",
"wpackagist-plugin/user-role-editor": "^4.62",
"wpackagist-plugin/comments-from-facebook": "^2.5",
"wpackagist-plugin/acme-fix-images": "^1.0",
"wpackagist-plugin/ad-inserter": "^2.7",
"wpackagist-plugin/wp-api-swaggerui": "^1.1",
"wpackagist-plugin/cloudflare": "^4.10",
"wpackagist-plugin/menu-image": "^3.0"
},
"require-dev": {
"heroku/heroku-buildpack-php": "*",
"wp-cli/wp-cli-bundle": "*",
"squizlabs/php_codesniffer": "^3.6.2",
"roave/security-advisories": "dev-latest"
},

5202
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,24 +3,27 @@
use Roots\WPConfig\Config;
use function Env\env;
Config::define( 'BLOG_SLUG', env('BLOG_SLUG') ?? 'hvg-blog' );
Config::define( 'WPLANG', env('WPLANG') ?? 'hu_HU' );
/**
* Redis Cache Config
*/
$redis_url = parse_url( env( 'REDIS_URL' ) );
if ( isset( $redis_url['host'] ) ) {
define( 'WP_REDIS_USER', trim( $redis_url['user'] ) );
define( 'WP_REDIS_PASSWORD', trim( $redis_url['pass'] ) );
define( 'WP_REDIS_HOST', trim( $redis_url['host'] ) );
define( 'WP_REDIS_PORT', trim( $redis_url['port'], '/' ) );
Config::define( 'WP_REDIS_USER', trim( $redis_url['user'] ) );
Config::define( 'WP_REDIS_PASSWORD', trim( $redis_url['pass'] ) );
Config::define( 'WP_REDIS_HOST', trim( $redis_url['host'] ) );
Config::define( 'WP_REDIS_PORT', trim( $redis_url['port'], '/' ) );
if ( env( 'WP_REDIS_MAXTTL' ) ) {
define( 'WP_REDIS_MAXTTL', env( 'WP_REDIS_MAXTTL' ) );
}
if ( env( 'WP_REDIS_MAXTTL' ) ) {
Config::define( 'WP_REDIS_MAXTTL', env( 'WP_REDIS_MAXTTL' ) );
}
if ( env( 'WP_REDIS_DISABLED' ) ) {
define( 'WP_REDIS_DISABLED', env( 'WP_REDIS_DISABLED' ) );
}
if ( env( 'WP_REDIS_DISABLED' ) ) {
Config::define( 'WP_REDIS_DISABLED', env( 'WP_REDIS_DISABLED' ) );
}
}
/**
@@ -46,7 +49,6 @@ if (env('BUCKETEER_BUCKET_NAME')) {
} else {
Config::define('S3_UPLOADS_BUCKET', env('BUCKETEER_BUCKET_NAME'));
}
Config::define('S3_UPLOADS_BUCKET', env('BUCKETEER_BUCKET_NAME'));
Config::define('S3_UPLOADS_KEY', env('BUCKETEER_AWS_ACCESS_KEY_ID'));
Config::define('S3_UPLOADS_SECRET', env('BUCKETEER_AWS_SECRET_ACCESS_KEY'));
Config::define('S3_UPLOADS_REGION', env('BUCKETEER_AWS_REGION'));
@@ -92,17 +94,13 @@ if (env('MAILGUN_API_KEY')) {
Config::define('SMTP_LOGIN', env('SMTP_LOGIN') ?? '');
Config::define('SMTP_PASSWORD', env('SMTP_PASSWORD') ?? '');
Config::define('SMTP_PORT', env('SMTP_PORT') ?? '1025');
Config::define('SMTP_SERVER', env('SMTP_SERVER') ?? 'mailsmtp');
Config::define('SMTP_SERVER', env('SMTP_SERVER') ?? 'mailhog');
Config::define('SMTP_SECURE', env('SMTP_SECURE') ?? '');
}
Config::define('TZ', env('TZ') ?? 'Europe/Budapest');
date_default_timezone_set(Config::get('TZ'));
if (env('WPLANG')) {
Config::define('WPLANG', env('WPLANG'));
}
/**
* Google Analytics
*/

View File

@@ -17,17 +17,17 @@ services:
wordpress:
build:
context: .
dockerfile: ${DOCKERFILE-.dev/Dockerfile}
args:
UID: ${UID-1000}
GID: ${GID-1000}
ports:
- "3000"
command:
- "web"
- "--env=/dev/null"
environment:
HISTFILE: ${HISTFILE-/tmp/.bash_history}
XDEBUG_HOST: ${XDEBUG_HOST-host.docker.internal}
secrets:
- COMPOSER_AUTH
env_file: ./.env
volumes:
- ./:/app
@@ -43,6 +43,22 @@ services:
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wp-s3:
image: quay.io/minio/minio
ports:
- "9000"
- "9001"
command:
- "server"
- "/data"
- "--console-address"
- ":9001"
environment:
MINIO_ROOT_USER: wordpress
MINIO_ROOT_PASSWORD: wordpress
volumes:
- wp-s3-data:/data
mailhog:
image: mailhog/mailhog
ports:
@@ -50,6 +66,7 @@ services:
volumes:
wp-db-data:
wp-s3-data:
networks:
default:
@@ -61,3 +78,5 @@ secrets:
file: ${SSL_CRT-./.dev/nginx/lndo.site.crt}
SSL_KEY:
file: ${SSL_KEY-./.dev/nginx/lndo.site.key}
COMPOSER_AUTH:
file: ${COMPOSER_AUTH_FILE-~/.composer/auth.json}