Compare commits
4 Commits
ebebd045f1
...
0d89401112
Author | SHA1 | Date |
---|---|---|
Ray Elliott | 0d89401112 | |
Ray Elliott | 5c2248d1f6 | |
Ray Elliott | e8fa8cc985 | |
Ray Elliott | 98f5e438aa |
|
@ -1,2 +1,3 @@
|
||||||
config
|
config
|
||||||
notes.txt
|
notes.txt
|
||||||
|
remote-temp/
|
||||||
|
|
|
@ -1 +1,7 @@
|
||||||
|
## Usage
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
* Refactor duplicated code (e.g., creating containers, exporting data)
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$1" ] ; then
|
||||||
|
echo "Must supply container name as argument"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
. ./config
|
||||||
|
|
||||||
|
_host="$1.home"
|
||||||
|
|
||||||
|
_cmd_wp_export="wp db export --dbuser=wordpress --dbpass=$_wp_db_passwd --add-drop-table data.sql"
|
||||||
|
_ssh_cmd="sshpass -p$_passwd_www ssh $_user_www@$_host"
|
||||||
|
_scp_cmd="sshpass -p$_passwd_www scp $_user_www@$_host:/tmp/wordpress.tar.gz"
|
||||||
|
|
||||||
|
$_ssh_cmd "cd /var/www/html/wordpress &&" $_cmd_wp_export
|
||||||
|
$_ssh_cmd 'cd /var/www/html/wordpress && tar czf /tmp/wordpress.tar.gz .'
|
||||||
|
$_ssh_cmd "rm /var/www/html/wordpress/data.sql"
|
||||||
|
$_scp_cmd "."
|
||||||
|
$_ssh_cmd 'rm /tmp/wordpress.tar.gz'
|
|
@ -0,0 +1,49 @@
|
||||||
|
FROM alpine:3.11
|
||||||
|
|
||||||
|
ENV WP_VERSION 5.3
|
||||||
|
|
||||||
|
RUN set -x \
|
||||||
|
&& addgroup -g 82 -S www-data \
|
||||||
|
&& adduser -u 82 -D -S -G www-data www-data
|
||||||
|
|
||||||
|
RUN apk --no-cache add php7 php7-fpm php7-mysqli php7-json php7-openssl php7-curl \
|
||||||
|
php7-simplexml php7-ctype php7-mbstring php7-gd php7-redis supervisor curl \
|
||||||
|
php7-zlib php7-xml php7-phar php7-intl php7-dom php7-xmlreader php7-opcache less mariadb-client \
|
||||||
|
libpng libjpeg-turbo bash \
|
||||||
|
&& rm -rf /var/www/localhost
|
||||||
|
|
||||||
|
RUN { \
|
||||||
|
echo 'opcache.memory_consumption=128'; \
|
||||||
|
echo 'opcache.interned_strings_buffer=8'; \
|
||||||
|
echo 'opcache.max_accelerated_files=4000'; \
|
||||||
|
echo 'opcache.revalidate_freq=2'; \
|
||||||
|
echo 'opcache.fast_shutdown=1'; \
|
||||||
|
} > /etc/php7/conf.d/opcache-recommended.ini
|
||||||
|
|
||||||
|
RUN mkdir -p /var/www && chown -R www-data:www-data /var/www
|
||||||
|
|
||||||
|
WORKDIR /var/www
|
||||||
|
RUN sed -i s/'user = nobody'/'user = www-data'/g /etc/php7/php-fpm.d/www.conf \
|
||||||
|
&& sed -i s/'group = nobody'/'group = www-data'/g /etc/php7/php-fpm.d/www.conf \
|
||||||
|
&& sed -i s/'listen = 127.0.0.1:9000'/'listen = 9000'/g /etc/php7/php-fpm.d/www.conf
|
||||||
|
|
||||||
|
VOLUME /var/www/wordpress
|
||||||
|
|
||||||
|
COPY config/php.ini /etc/php7/conf.d/zzz_custom_php.ini
|
||||||
|
COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
|
COPY config/cron.conf /etc/crontabs/www-data
|
||||||
|
|
||||||
|
RUN rm -rf /tmp/* \
|
||||||
|
&& chmod 600 /etc/crontabs/www-data \
|
||||||
|
&& curl -sfo /usr/local/bin/wp -L https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
|
||||||
|
&& chmod +x /usr/local/bin/wp
|
||||||
|
|
||||||
|
WORKDIR /var/www/wordpress
|
||||||
|
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||||
|
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Cron configuration file, set to run WordPress cron once every minute
|
||||||
|
* * * * * php /usr/src/wordpress/wp-cron.php
|
|
@ -0,0 +1,80 @@
|
||||||
|
[mysqld]
|
||||||
|
max_allowed_packet = 16M
|
||||||
|
|
||||||
|
# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
|
||||||
|
# queries. If sorted data does not fit into the sort buffer, a disk
|
||||||
|
# based merge sort is used instead - See the "Sort_merge_passes"
|
||||||
|
# status variable. Allocated per thread if sort is needed.
|
||||||
|
# Comment out for now, the default in MariaDB 10.2 is 2M
|
||||||
|
#sort_buffer_size = 1M
|
||||||
|
|
||||||
|
# Size of the buffer used for doing full table scans.
|
||||||
|
# Allocated per thread, if a full scan is needed.
|
||||||
|
read_buffer_size = 1M
|
||||||
|
|
||||||
|
# When reading rows in sorted order after a sort, the rows are read
|
||||||
|
# through this buffer to avoid disk seeks. You can improve ORDER BY
|
||||||
|
# performance a lot, if set this to a high value.
|
||||||
|
# Allocated per thread, when needed.
|
||||||
|
read_rnd_buffer_size = 8M
|
||||||
|
|
||||||
|
join_buffer_size = 8M # should be equal to read_rnd_buffer_size?
|
||||||
|
|
||||||
|
# Maximum allowed size for a single HEAP (in memory) table. This option
|
||||||
|
# is a protection against the accidential creation of a very large HEAP
|
||||||
|
# table which could otherwise use up all memory resources.
|
||||||
|
max_heap_table_size = 64M
|
||||||
|
tmp_table_size = 64M # Should be equal to max_heap_table_size
|
||||||
|
|
||||||
|
## Generally, it is unwise to set the query cache to be larger than 64-128M
|
||||||
|
## as the costs associated with maintaining the cache outweigh the performance
|
||||||
|
## gains.
|
||||||
|
## The query cache is a well known bottleneck that can be seen even when
|
||||||
|
## concurrency is moderate. The best option is to disable it from day 1
|
||||||
|
## by setting query_cache_size = 0 (now the default on MySQL 5.6)
|
||||||
|
## and to use other ways to speed up read queries: good indexing, adding
|
||||||
|
## replicas to spread the read load or using an external cache.
|
||||||
|
query_cache_type = on
|
||||||
|
query_cache_size = 32M
|
||||||
|
query_cache_strip_comments = on
|
||||||
|
query_cache_min_res_unit = 2K
|
||||||
|
# query_cache_limit = 256K # Default is 1M now
|
||||||
|
|
||||||
|
thread_cache_size = 16
|
||||||
|
table_open_cache = 4096
|
||||||
|
table_definition_cache = 1024
|
||||||
|
|
||||||
|
#
|
||||||
|
# InnoDB
|
||||||
|
#
|
||||||
|
# The buffer pool is where data and indexes are cached: having it as large as possible
|
||||||
|
# will ensure you use memory and not disks for most read operations.
|
||||||
|
# Typical values are 50..75% of available RAM.
|
||||||
|
innodb_buffer_pool_size = 768M # 75% of 1GB RAM
|
||||||
|
innodb_log_file_size = 192M # 25% of innodb_buffer_pool_size
|
||||||
|
innodb_flush_method = O_DIRECT
|
||||||
|
|
||||||
|
# This setting should be set to 0 (disabled) on SSDs which do not have
|
||||||
|
# any performance gains with sequential IO.
|
||||||
|
innodb_flush_neighbors = 0
|
||||||
|
|
||||||
|
# The default setting of 1 means that InnoDB is fully ACID compliant.
|
||||||
|
# It is the best value when your primary concern is data safety, for instance on a master.
|
||||||
|
# However it can have a significant overhead on systems with slow disks because of the
|
||||||
|
# extra fsyncs that are needed to flush each change to the redo logs.
|
||||||
|
# Setting it to 2 is a bit less reliable because committed transactions will be
|
||||||
|
# flushed to the redo logs only once a second, but that can be acceptable on some situations
|
||||||
|
# for a master and that is definitely a good value for a replica. 0 is even faster
|
||||||
|
# but you are more likely to lose some data in case of a crash: it is only a good value for a replica.
|
||||||
|
innodb_flush_log_at_trx_commit = 0
|
||||||
|
|
||||||
|
# Conquer an InnoDB crash with `InnoDB: A long semaphore wait` error
|
||||||
|
# See http://stackoverflow.com/questions/24860111/warning-a-long-semaphore-wait
|
||||||
|
# See http://www.markleith.co.uk/2009/05/13/innodb_stats_on_metadata-innodb_adaptive_hash_index/
|
||||||
|
innodb_adaptive_hash_index = off
|
||||||
|
|
||||||
|
# Kill iddle connections after 10min
|
||||||
|
wait_timeout = 600
|
||||||
|
|
||||||
|
[mysqldump]
|
||||||
|
max-allowed-packet = 16M
|
|
@ -0,0 +1,114 @@
|
||||||
|
worker_processes 1;
|
||||||
|
pid /run/nginx.pid;
|
||||||
|
worker_rlimit_nofile 51200;
|
||||||
|
|
||||||
|
|
||||||
|
events {
|
||||||
|
use epoll;
|
||||||
|
worker_connections 1024;
|
||||||
|
multi_accept on;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
server_names_hash_bucket_size 128;
|
||||||
|
client_header_buffer_size 32k;
|
||||||
|
large_client_header_buffers 4 32k;
|
||||||
|
client_max_body_size 1024m;
|
||||||
|
client_body_buffer_size 10m;
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
keepalive_timeout 120;
|
||||||
|
server_tokens off;
|
||||||
|
tcp_nodelay on;
|
||||||
|
|
||||||
|
|
||||||
|
log_format main_timed '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for" '
|
||||||
|
'$request_time $upstream_response_time $pipe $upstream_cache_status'
|
||||||
|
'$document_root$fastcgi_script_name > $request';
|
||||||
|
|
||||||
|
|
||||||
|
access_log /dev/stdout main_timed;
|
||||||
|
error_log /dev/stderr notice;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
gzip_min_length 256;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_types
|
||||||
|
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
|
||||||
|
text/javascript application/javascript application/x-javascript
|
||||||
|
text/x-json application/json application/x-web-app-manifest+json
|
||||||
|
text/css text/plain text/x-component
|
||||||
|
font/opentype application/x-font-ttf application/vnd.ms-fontobject
|
||||||
|
image/x-icon;
|
||||||
|
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
|
||||||
|
|
||||||
|
open_file_cache max=50000 inactive=60s;
|
||||||
|
open_file_cache_valid 120s;
|
||||||
|
open_file_cache_min_uses 2;
|
||||||
|
open_file_cache_errors off;
|
||||||
|
open_log_file_cache max=10000 inactive=30s min_uses=2;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
listen 80 default_server;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
sendfile off;
|
||||||
|
|
||||||
|
proxy_buffer_size 128k;
|
||||||
|
proxy_buffers 4 256k;
|
||||||
|
proxy_busy_buffers_size 256k;
|
||||||
|
|
||||||
|
client_max_body_size 50m;
|
||||||
|
client_body_buffer_size 128k;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.php;
|
||||||
|
include /etc/nginx/includes/*.conf;
|
||||||
|
|
||||||
|
location ~* ^/(wp-content)/(.*?)\.(zip|gz|tar|bzip2|7z)$ { deny all; }
|
||||||
|
location ~ /(\.DS_Store|wp-config.php|wp-config-sample.php|readme.html.gz|readme.txt.gz|readme.html|readme.txt|error_log|license.txt|changelog|changelog.txt) { access_log off; log_not_found off; deny all; }
|
||||||
|
location = /robots.txt { access_log off; log_not_found off; }
|
||||||
|
location = /favicon.ico { access_log off; log_not_found off; expires 30d; }
|
||||||
|
location ~ ~$ { access_log off; log_not_found off; deny all; }
|
||||||
|
|
||||||
|
location /wp-content {
|
||||||
|
root /usr/share/nginx/html/wp-content;
|
||||||
|
expires 7d;
|
||||||
|
add_header Cache-Control "public";
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ [^/]\.php(/|$) {
|
||||||
|
try_files $uri =404;
|
||||||
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||||
|
fastcgi_connect_timeout 300;
|
||||||
|
fastcgi_send_timeout 300;
|
||||||
|
fastcgi_read_timeout 300;
|
||||||
|
fastcgi_buffer_size 64k;
|
||||||
|
fastcgi_buffers 4 64k;
|
||||||
|
fastcgi_busy_buffers_size 128k;
|
||||||
|
fastcgi_temp_file_write_size 128k;
|
||||||
|
fastcgi_intercept_errors on;
|
||||||
|
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_pass wordpress:9000;
|
||||||
|
|
||||||
|
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param SCRIPT_FILENAME /var/www/wordpress$fastcgi_script_name;
|
||||||
|
include fastcgi_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
; Redirect errors to the container stderr
|
||||||
|
error_log = "/dev/stderr"
|
||||||
|
|
||||||
|
max_input_time = 60
|
||||||
|
max_input_vars = 1000
|
||||||
|
variables_order = "EGPCS"
|
||||||
|
expose_php = Off
|
||||||
|
post_max_size = 50M
|
||||||
|
upload_max_filesize = 50M
|
||||||
|
disable_functions = passthru,system,chroot,chgrp,chown,shell_exec,ini_alter,ini_restore,readlink,symlink,stream_socket_server,fsocket
|
||||||
|
|
||||||
|
[Date]
|
||||||
|
date.timezone = "Europe/London"
|
|
@ -0,0 +1,26 @@
|
||||||
|
[supervisord]
|
||||||
|
nodaemon=true
|
||||||
|
logfile=/var/log/supervisord.log
|
||||||
|
pidfile=/run/supervisord.pid
|
||||||
|
|
||||||
|
[program:php-fpm]
|
||||||
|
command=php-fpm7 -F
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
redirect_stderr=true
|
||||||
|
autorestart=false
|
||||||
|
startretries=0
|
||||||
|
|
||||||
|
; [program:nginx]
|
||||||
|
; command=nginx -g 'daemon off;'
|
||||||
|
; stdout_logfile=/dev/stdout
|
||||||
|
; stdout_logfile_maxbytes=0
|
||||||
|
; redirect_stderr=true
|
||||||
|
; autorestart=false
|
||||||
|
; startretries=0
|
||||||
|
|
||||||
|
[program:cron]
|
||||||
|
command=/usr/sbin/crond -f
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
redirect_stderr=true
|
|
@ -0,0 +1,77 @@
|
||||||
|
version: '3.7'
|
||||||
|
|
||||||
|
networks:
|
||||||
|
web:
|
||||||
|
external: true
|
||||||
|
backend:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: 'bitnami/redis:5.0'
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
container_name: redis
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- ALLOW_EMPTY_PASSWORD=yes
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:6379:6379'
|
||||||
|
# volumes:
|
||||||
|
# - 'redis-data:/bitnami/redis/data'
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=false"
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mariadb:10.4
|
||||||
|
container_name: mysql
|
||||||
|
command: --default-authentication-plugin=mysql_native_password
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
restart: unless-stopped
|
||||||
|
# env_file:
|
||||||
|
# - .env
|
||||||
|
volumes:
|
||||||
|
# - ./wp-db:/var/lib/mysql
|
||||||
|
- ./config/my.cnf:/etc/mysql/conf.d/zzz_my.cnf
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:3306:3306"
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=db
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=false"
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:1.17-alpine
|
||||||
|
depends_on:
|
||||||
|
- wordpress
|
||||||
|
container_name: nginx-wp-stack
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
- web
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- ./wordpress:/usr/share/nginx/html:ro
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.nginx-wp-stack.entrypoints=http"
|
||||||
|
- "traefik.http.routers.nginx-wp-stack.rule=Host(`wp-stack.wptest.isnet.uk`)"
|
||||||
|
- "traefik.docker.network=web"
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
container_name: wordpress
|
||||||
|
# env_file:
|
||||||
|
# - .env
|
||||||
|
build: ./
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:8081:80"
|
||||||
|
- "127.0.0.1:9000:9000"
|
||||||
|
volumes:
|
||||||
|
- ./wordpress:/var/www/wordpress
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=false"
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
exec "$@"
|
Loading…
Reference in New Issue