Real initial commit
This commit is contained in:
parent
5a32ac6d56
commit
78d9b09572
|
|
@ -0,0 +1,7 @@
|
|||
# IDEs
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Dev files
|
||||
.env
|
||||
*.sql
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
FROM alpine:edge
|
||||
|
||||
LABEL maintainer JJTC "docker@jjtc.eu"
|
||||
|
||||
ENV version=1.0.2 \
|
||||
http_version=1.0.2 \
|
||||
BOOKSTACK=BookStack \
|
||||
BOOKSTACK_VERSION=0.22.0 \
|
||||
BOOKSTACK_HOME="/app"
|
||||
|
||||
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
|
||||
|
||||
#COPY php.ini /usr/local/etc/php/conf.d/php.ini
|
||||
#COPY default.conf /etc/nginx/sites-enabled/default
|
||||
#COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
# Below the following PHP extensions are installed PCNTL, PDO_MYSQL, ZIP, GD, Tidy, XML, Redis, Memcached, msgpack, igbinary
|
||||
# PHP extensions such as DOM, OpenSSL, PDO, MBstring, Tokenizer are provided by the base image.
|
||||
RUN set -ex \
|
||||
&& chmod +x /app/docker-entrypoint.sh \
|
||||
# ensure www-data user exists
|
||||
# 82 is the standard uid/gid for "www-data" in Alpine
|
||||
&& addgroup -g 82 -S www-data \
|
||||
&& adduser -u 82 -D -S -G www-data www-data \
|
||||
&& apk update \
|
||||
&& echo "Setting up PHP extensions" \
|
||||
&& apk add --no-cache \
|
||||
bash \
|
||||
curl \
|
||||
su-exec \
|
||||
nginx \
|
||||
tar \
|
||||
php7 \
|
||||
php7-cgi \
|
||||
php7-ctype \
|
||||
php7-curl \
|
||||
php7-dom \
|
||||
php7-exif \
|
||||
php7-fileinfo \
|
||||
php7-gd \
|
||||
php7-iconv \
|
||||
php7-intl \
|
||||
php7-json \
|
||||
php7-ldap \
|
||||
php7-mbstring \
|
||||
php7-mcrypt \
|
||||
php7-opcache \
|
||||
php7-openssl \
|
||||
php7-pcntl \
|
||||
php7-pdo_mysql \
|
||||
php7-phar \
|
||||
php7-posix \
|
||||
php7-redis \
|
||||
php7-session \
|
||||
php7-simplexml \
|
||||
php7-sockets \
|
||||
php7-tidy \
|
||||
php7-tokenizer \
|
||||
php7-xml \
|
||||
php7-xmlwriter \
|
||||
php7-zip \
|
||||
php7-zlib \
|
||||
composer \
|
||||
&& echo "Setting up PPM:" \
|
||||
&& mkdir -p /ppm/run \
|
||||
&& cd /ppm \
|
||||
&& chmod -R 777 run/ \
|
||||
&& composer require php-pm/php-pm:${version} php-pm/httpkernel-adapter:${http_version} \
|
||||
&& echo "Get BookStack:" \
|
||||
&& mkdir -p ${BOOKSTACK_HOME} \
|
||||
&& cd ${BOOKSTACK_HOME} \
|
||||
&& curl -LJO https://github.com/BookStackApp/BookStack/archive/v${BOOKSTACK_VERSION}.tar.gz \
|
||||
&& tar --strip-components=1 -xzf BookStack-${BOOKSTACK_VERSION}.tar.gz \
|
||||
&& rm -rf ${BOOKSTACK}-${BOOKSTACK_VERSION}.tar.gz .env.example .gitattributes .github .gitignore .travis.yml tests/ public/index.php \
|
||||
&& curl https://raw.githubusercontent.com/BookStackApp/BookStack/873b1099f81f6a9d2619644aef0587e2b73d918a/bootstrap/autoload.php -o bootstrap/autoload.php \
|
||||
&& echo "Get Dependencies:" \
|
||||
&& composer install \
|
||||
&& echo "Changing ownership:" \
|
||||
&& chown -R www-data:www-data .
|
||||
|
||||
WORKDIR $BOOKSTACK_HOME
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
VOLUME ["$BOOKSTACK_HOME/public/uploads", "$BOOKSTACK_HOME/public/storage"]
|
||||
|
||||
ENTRYPOINT ["./docker-entrypoint.sh"]
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
server_name _;
|
||||
root /app/public/;
|
||||
|
||||
client_max_body_size 1000m;
|
||||
client_body_timeout 120s; # Default is 60, May need to be increased for very large uploads
|
||||
client_body_buffer_size 128k;
|
||||
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self'; connect-src 'self'; font-src 'self'; form-action 'self'; report-uri https://<YOUR_ACCOUNT>.report-uri.com/r/d/csp/enforce;" always;
|
||||
add_header Expect-CT "enforce; max-age=604800; report-uri=https://<YOUR_ACCOUNT>.report-uri.com/r/d/ct/enforce";
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
|
||||
add_header Referrer-Policy "strict-origin";
|
||||
add_header X-Xss-Protection "1; mode=block; report=https://<YOUR_ACCOUNT>.report-uri.com/r/d/xss/enforce" always;
|
||||
add_header X-Frame-Options "DENY";
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
|
||||
location / {
|
||||
try_files $uri @ppm;
|
||||
}
|
||||
|
||||
location ~* \.(jpg|jpeg|gif|png|ico|css|js|html|xml|txt)$ {
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
expires 360d;
|
||||
}
|
||||
|
||||
# PHP-PM is doing its thing
|
||||
location @ppm {
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
}
|
||||
|
||||
# Block access to PHP files
|
||||
location ~* \.(php|php3|php4|php5|php7|phtml|inc)$ {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# Block access to stuff begining with .
|
||||
location ~ /\. {
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
php artisan key:generate --no-interaction --force
|
||||
php artisan migrate --no-interaction --force
|
||||
|
||||
echo "Setting folder permissions for uploads"
|
||||
chown -R www-data:www-data public/uploads storage/uploads /ppm
|
||||
|
||||
php artisan cache:clear
|
||||
php artisan view:clear
|
||||
|
||||
echo "Starting Nginx:"
|
||||
nginx
|
||||
|
||||
echo "Getting PPM ready:"
|
||||
trapIt () { "$@"& pid="$!"; trap 'kill -INT $pid' INT TERM; while kill -0 $pid > /dev/null 2>&1; do wait $pid; ec="$?"; done; exit $ec;};
|
||||
|
||||
echo "Starting PPM:"
|
||||
trapIt su-exec www-data:www-data /ppm/vendor/bin/ppm start --ansi --port=8080 --socket-path=/ppm/run --pidfile=/ppm/ppm.pid --bootstrap=laravel --static-directory=public/ --app-env=prod
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
user www-data;
|
||||
worker_processes auto;
|
||||
pid /run/nginx.pid;
|
||||
daemon on;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
##
|
||||
# Basic Settings
|
||||
##
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
server_tokens off; # Do not announce nginx's version to the world!
|
||||
|
||||
# server_names_hash_bucket_size 64;
|
||||
# server_name_in_redirect off;
|
||||
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
resolver 1.1.1.1 8.8.8.8 8.4.4.4;
|
||||
|
||||
##
|
||||
# Logging Settings
|
||||
##
|
||||
access_log /var/log/nginx/access.log;
|
||||
error_log /var/log/nginx/error.log;
|
||||
|
||||
##
|
||||
# Proxy Settings
|
||||
##
|
||||
proxy_buffering off;
|
||||
|
||||
##
|
||||
# Gzip Settings
|
||||
##
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_buffers 16 8k;
|
||||
gzip_http_version 1.1;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||||
|
||||
##
|
||||
# Virtual Host Configs
|
||||
##
|
||||
include /etc/nginx/sites-enabled/*;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
date.timezone = UTC
|
||||
memory_limit = -1
|
||||
|
||||
disable_functions =
|
||||
|
||||
max_execution_time = 0
|
||||
max_input_time = 0
|
||||
|
||||
post_max_size = 64M
|
||||
upload_max_filesize = 64M
|
||||
|
||||
expose_php=0
|
||||
|
||||
session.save_handler = redis
|
||||
session.save_path = "tcp://redis:6379"
|
||||
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.interned_strings_buffer=8
|
||||
opcache.max_accelerated_files=10000
|
||||
opcache.memory_consumption=256
|
||||
opcache.interned_string_buffer=16
|
||||
opcache.save_comments=1
|
||||
opcache.revalidate_freq=1
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Setup process
|
||||
|
||||
|
||||
# Check if .env exists
|
||||
|
||||
|
||||
## if not create .env and start guided setup
|
||||
### Check dependencies e.g. openssl/libressl
|
||||
|
||||
#### Generate key
|
||||
openssl rand -base64 32
|
||||
|
||||
# Check is there is new version and offer to download
|
||||
## if .env exists but is and old version then Update and get user input
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
version: '3.6'
|
||||
services:
|
||||
db:
|
||||
image: mariadb:10.2
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
|
||||
- MYSQL_DATABASE=${DB_DATABASE}
|
||||
- MYSQL_USER=${DB_USERNAME}
|
||||
- MYSQL_PASSWORD=${DB_PASSWORD}
|
||||
volumes:
|
||||
- db-data:/var/lib/mysql
|
||||
networks:
|
||||
- backend
|
||||
|
||||
cache:
|
||||
image: redis:4-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
volumes:
|
||||
- cache:/data/
|
||||
networks:
|
||||
- backend
|
||||
labels:
|
||||
- "traefik.enable=false"
|
||||
|
||||
app:
|
||||
# image: jjtc/bookstack-ppm:0.22-r0
|
||||
build: ./app/
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- db
|
||||
- cache
|
||||
volumes:
|
||||
- .env:/app/.env:rw
|
||||
- ./app/php.ini:/usr/local/etc/php/conf.d/php.ini
|
||||
- ./app/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./app/default.conf:/etc/nginx/sites-enabled/default:ro
|
||||
- uploads:/var/www/html/public/uploads:rw
|
||||
- storage:/var/www/html/public/storage:rw
|
||||
expose:
|
||||
- "80/tcp"
|
||||
networks:
|
||||
- web
|
||||
- backend
|
||||
labels:
|
||||
- "traefik.frontend.headers.STSPreload=true"
|
||||
- "traefik.frontend.headers.STSSeconds=31536000"
|
||||
- "traefik.backend=bookstack"
|
||||
- "traefik.docker.network=web"
|
||||
- "traefik.frontend.rule=Host:${APP_URL_BASE}"
|
||||
- "traefik.enable=true"
|
||||
- "traefik.port=80"
|
||||
- "traefik.default.protocol=http"
|
||||
|
||||
# av:
|
||||
# image: jjtc/av:0.100.0-r0
|
||||
# build: ./av/
|
||||
# restart: unless-stopped
|
||||
# tty: true
|
||||
# environment:
|
||||
# - TZ=${TZ}
|
||||
# volumes:
|
||||
# - ./av/conf/:/etc/clamav/
|
||||
# networks:
|
||||
# - backend
|
||||
# labels:
|
||||
# - "traefik.enable=false"
|
||||
|
||||
#traefik:
|
||||
# image: traefik:latest
|
||||
# restart: unless-stopped
|
||||
# command: traefik --docker --acme=true --acme.domains='your.domain.tld' --acme.email='your@email.tld' --acme.entrypoint=https --acme.storagefile=acme.json --defaultentrypoints=http --defaultentrypoints=https --entryPoints='Name$
|
||||
# ports:
|
||||
# - 80:80
|
||||
# - 443:443
|
||||
# volumes:
|
||||
# - /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
networks:
|
||||
backend:
|
||||
web:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
db-data:
|
||||
cache:
|
||||
uploads:
|
||||
storage:
|
||||
Loading…
Reference in New Issue