├── php8 ├── conf.d │ ├── mbstring.ini │ ├── date.ini │ ├── opcache.ini │ ├── xdebug.ini │ ├── session.ini │ └── php.ini ├── msmtp │ └── msmtp.conf ├── php-fpm.d │ └── www.conf └── Dockerfile ├── php81 ├── conf.d │ ├── mbstring.ini │ ├── date.ini │ ├── opcache.ini │ ├── xdebug.ini │ ├── session.ini │ └── php.ini ├── msmtp │ └── msmtp.conf ├── php-fpm.d │ └── www.conf └── Dockerfile ├── php82 ├── conf.d │ ├── mbstring.ini │ ├── date.ini │ ├── opcache.ini │ ├── xdebug.ini │ ├── session.ini │ └── php.ini ├── msmtp │ └── msmtp.conf ├── php-fpm.d │ └── www.conf └── Dockerfile ├── .gitignore ├── nginx ├── etc │ ├── conf.d │ │ ├── upstream.conf │ │ ├── default.conf │ │ └── maps-composite_cache.conf │ ├── nginx.conf.template │ └── bx.template ├── Dockerfile └── docker-entrypoint.sh ├── mysql ├── bx.cnf └── Dockerfile ├── node └── Dockerfile ├── postgres ├── Dockerfile └── pgcrypto.sh ├── push-server ├── build.sh ├── run.sh ├── config.template.json └── Dockerfile ├── .env.default ├── readme.md └── docker-compose.yml /php8/conf.d/mbstring.ini: -------------------------------------------------------------------------------- 1 | [mbstring] -------------------------------------------------------------------------------- /php81/conf.d/mbstring.ini: -------------------------------------------------------------------------------- 1 | [mbstring] -------------------------------------------------------------------------------- /php82/conf.d/mbstring.ini: -------------------------------------------------------------------------------- 1 | [mbstring] -------------------------------------------------------------------------------- /php8/conf.d/date.ini: -------------------------------------------------------------------------------- 1 | [Date] 2 | date.timezone = "UTC" -------------------------------------------------------------------------------- /php81/conf.d/date.ini: -------------------------------------------------------------------------------- 1 | [Date] 2 | date.timezone = "UTC" -------------------------------------------------------------------------------- /php82/conf.d/date.ini: -------------------------------------------------------------------------------- 1 | [Date] 2 | date.timezone = "UTC" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /.env 3 | /docker-compose.override.yml -------------------------------------------------------------------------------- /nginx/etc/conf.d/upstream.conf: -------------------------------------------------------------------------------- 1 | upstream php-upstream { 2 | server php-fpm:9000; 3 | } -------------------------------------------------------------------------------- /nginx/etc/conf.d/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name ""; 4 | return 403; 5 | } -------------------------------------------------------------------------------- /php8/msmtp/msmtp.conf: -------------------------------------------------------------------------------- 1 | account default 2 | logfile /dev/null 3 | host fakesmtp 4 | auth off 5 | tls off 6 | port 8025 -------------------------------------------------------------------------------- /php81/msmtp/msmtp.conf: -------------------------------------------------------------------------------- 1 | account default 2 | logfile /dev/null 3 | host fakesmtp 4 | auth off 5 | tls off 6 | port 8025 -------------------------------------------------------------------------------- /php82/msmtp/msmtp.conf: -------------------------------------------------------------------------------- 1 | account default 2 | logfile /dev/null 3 | host fakesmtp 4 | auth off 5 | tls off 6 | port 8025 -------------------------------------------------------------------------------- /mysql/bx.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | sql_mode = '' 3 | innodb_strict_mode = OFF 4 | default-authentication-plugin=mysql_native_password -------------------------------------------------------------------------------- /node/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:15-alpine 2 | 3 | RUN apk add bash \ 4 | && npm install -g @bitrix/cli 5 | 6 | ENTRYPOINT tail -f /dev/null -------------------------------------------------------------------------------- /postgres/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:11-alpine 2 | 3 | ARG POSTGRES_USER 4 | ARG POSTGRES_PASSWORD 5 | ARG POSTGRES_DB 6 | 7 | COPY pgcrypto.sh /docker-entrypoint-initdb.d/ -------------------------------------------------------------------------------- /postgres/pgcrypto.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL 5 | create extension if not exists pgcrypto; 6 | EOSQL -------------------------------------------------------------------------------- /push-server/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | curl http://repos.1c-bitrix.ru/yum/bitrix-env.sh > bitrix-env.sh && \ 4 | /bin/bash ./bitrix-env.sh && \ 5 | rm -f ./bitrix-env.sh 6 | 7 | yum -y install bx-push-server -------------------------------------------------------------------------------- /mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BX_MYSQL_IMAGE 2 | FROM ${BX_MYSQL_IMAGE} 3 | 4 | COPY --chown=mysql:root ./bx.cnf /etc/my.cnf.d/bx.cnf 5 | COPY --chown=root:root ./bx.cnf /etc/mysql/conf.d/bx.cnf 6 | 7 | RUN chmod 664 /etc/my.cnf.d/bx.cnf -------------------------------------------------------------------------------- /php8/conf.d/opcache.ini: -------------------------------------------------------------------------------- 1 | opcache.revalidate_freq = 0 2 | opcache.validate_timestamps = 1 3 | opcache.max_accelerated_files = 100000 4 | opcache.memory_consumption = 512 5 | opcache.interned_strings_buffer = 64 6 | opcache.fast_shutdown = 1 7 | opcache.error_log = "/var/log/php/opcache.log" -------------------------------------------------------------------------------- /php81/conf.d/opcache.ini: -------------------------------------------------------------------------------- 1 | opcache.revalidate_freq = 0 2 | opcache.validate_timestamps = 1 3 | opcache.max_accelerated_files = 100000 4 | opcache.memory_consumption = 512 5 | opcache.interned_strings_buffer = 64 6 | opcache.fast_shutdown = 1 7 | opcache.error_log = "/var/log/php/opcache.log" -------------------------------------------------------------------------------- /php82/conf.d/opcache.ini: -------------------------------------------------------------------------------- 1 | opcache.revalidate_freq = 0 2 | opcache.validate_timestamps = 1 3 | opcache.max_accelerated_files = 100000 4 | opcache.memory_consumption = 512 5 | opcache.interned_strings_buffer = 64 6 | opcache.fast_shutdown = 1 7 | opcache.error_log = "/var/log/php/opcache.log" -------------------------------------------------------------------------------- /php8/conf.d/xdebug.ini: -------------------------------------------------------------------------------- 1 | xdebug.max_nesting_level = 250 2 | xdebug.profiler_output_name = "%H%R.%t.out" 3 | xdebug.extended_info = 1 4 | xdebug.mode=develop,debug,profile,trace 5 | xdebug.session=PHPSTORM 6 | xdebug.output_dir="/var/www/public_html/.xdebug" 7 | xdebug.start_with_request=trigger 8 | xdebug.discover_client_host=true 9 | xdebug.collect_params = 0 -------------------------------------------------------------------------------- /php81/conf.d/xdebug.ini: -------------------------------------------------------------------------------- 1 | xdebug.max_nesting_level = 250 2 | xdebug.profiler_output_name = "%H%R.%t.out" 3 | xdebug.extended_info = 1 4 | xdebug.mode=develop,debug,profile,trace 5 | xdebug.session=PHPSTORM 6 | xdebug.output_dir="/var/www/public_html/.xdebug" 7 | xdebug.start_with_request=trigger 8 | xdebug.discover_client_host=true 9 | xdebug.collect_params = 0 -------------------------------------------------------------------------------- /php82/conf.d/xdebug.ini: -------------------------------------------------------------------------------- 1 | xdebug.max_nesting_level = 250 2 | xdebug.profiler_output_name = "%H%R.%t.out" 3 | xdebug.extended_info = 1 4 | xdebug.mode=develop,debug,profile,trace 5 | xdebug.session=PHPSTORM 6 | xdebug.output_dir="/var/www/public_html/.xdebug" 7 | xdebug.start_with_request=trigger 8 | xdebug.discover_client_host=true 9 | xdebug.collect_params = 0 -------------------------------------------------------------------------------- /push-server/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [[ "$MODE" == "pub" ]]; then 4 | export PUBLISH_MODE=true 5 | export ROUTES=$(cat <<-END 6 | "pub": "/bitrix/pub/", 7 | "stat": "/server-stat/" 8 | END 9 | ) 10 | elif [[ "$MODE" == "sub" ]]; then 11 | export PUBLISH_MODE=false 12 | export ROUTES=$(cat <<-END 13 | "sub": "/bitrix/subws/" 14 | END 15 | ) 16 | fi 17 | 18 | envsubst /etc/push-server/config.json 19 | 20 | node server.js --config /etc/push-server/config.json -------------------------------------------------------------------------------- /nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:stable 2 | 3 | ARG CONTAINER_GID 4 | ARG CONTAINER_UID 5 | ARG CONTAINER_USER 6 | ARG CONTAINER_GROUP 7 | 8 | RUN groupadd -g ${CONTAINER_GID} ${CONTAINER_GROUP} && \ 9 | useradd -u ${CONTAINER_UID} -g ${CONTAINER_GID} ${CONTAINER_USER} 10 | 11 | COPY ./etc/ /etc/nginx/ 12 | 13 | RUN envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf 14 | 15 | COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh 16 | RUN chmod 0755 /usr/local/bin/docker-entrypoint.sh 17 | 18 | ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] 19 | CMD ["nginx"] -------------------------------------------------------------------------------- /php8/conf.d/session.ini: -------------------------------------------------------------------------------- 1 | [Session] 2 | session.save_handler = files 3 | session.save_path = "/tmp" 4 | session.use_cookies = 1 5 | session.use_only_cookies = 1 6 | session.name = PHPSESSID 7 | session.auto_start = 0 8 | session.cookie_lifetime = 0 9 | session.cookie_path = / 10 | session.cookie_domain = 11 | session.cookie_httponly = 12 | session.serialize_handler = php 13 | session.gc_probability = 1 14 | session.gc_divisor = 1000 15 | session.gc_maxlifetime = 1440 16 | session.bug_compat_42 = Off 17 | session.bug_compat_warn = Off 18 | session.referer_check = 19 | session.entropy_length = 0 20 | session.cache_limiter = nocache 21 | session.cache_expire = 180 22 | session.use_trans_sid = 0 23 | session.hash_function = 0 24 | session.hash_bits_per_character = 5 -------------------------------------------------------------------------------- /php81/conf.d/session.ini: -------------------------------------------------------------------------------- 1 | [Session] 2 | session.save_handler = files 3 | session.save_path = "/tmp" 4 | session.use_cookies = 1 5 | session.use_only_cookies = 1 6 | session.name = PHPSESSID 7 | session.auto_start = 0 8 | session.cookie_lifetime = 0 9 | session.cookie_path = / 10 | session.cookie_domain = 11 | session.cookie_httponly = 12 | session.serialize_handler = php 13 | session.gc_probability = 1 14 | session.gc_divisor = 1000 15 | session.gc_maxlifetime = 1440 16 | session.bug_compat_42 = Off 17 | session.bug_compat_warn = Off 18 | session.referer_check = 19 | session.entropy_length = 0 20 | session.cache_limiter = nocache 21 | session.cache_expire = 180 22 | session.use_trans_sid = 0 23 | session.hash_function = 0 24 | session.hash_bits_per_character = 5 -------------------------------------------------------------------------------- /php82/conf.d/session.ini: -------------------------------------------------------------------------------- 1 | [Session] 2 | session.save_handler = files 3 | session.save_path = "/tmp" 4 | session.use_cookies = 1 5 | session.use_only_cookies = 1 6 | session.name = PHPSESSID 7 | session.auto_start = 0 8 | session.cookie_lifetime = 0 9 | session.cookie_path = / 10 | session.cookie_domain = 11 | session.cookie_httponly = 12 | session.serialize_handler = php 13 | session.gc_probability = 1 14 | session.gc_divisor = 1000 15 | session.gc_maxlifetime = 1440 16 | session.bug_compat_42 = Off 17 | session.bug_compat_warn = Off 18 | session.referer_check = 19 | session.entropy_length = 0 20 | session.cache_limiter = nocache 21 | session.cache_expire = 180 22 | session.use_trans_sid = 0 23 | session.hash_function = 0 24 | session.hash_bits_per_character = 5 -------------------------------------------------------------------------------- /push-server/config.template.json: -------------------------------------------------------------------------------- 1 | { 2 | "servers": [ 3 | { 4 | "name": "${MODE}-${LISTEN_PORT}", 5 | "port": ${LISTEN_PORT}, 6 | "hostname": "${LISTEN_HOSTNAME}", 7 | "backlog": 1024, 8 | "routes": {${ROUTES}} 9 | } 10 | ], 11 | "publishMode": ${PUBLISH_MODE}, 12 | "processUniqueId": "${MODE}-${LISTEN_PORT}", 13 | "clusterMode": true, 14 | "storage": { 15 | "type": "redis", 16 | "host": "${REDIS_HOST}", 17 | "port": "${REDIS_PORT}", 18 | "messageTLL": 86400, 19 | "channelTLL": 86400, 20 | "onlineTLL": 120, 21 | "onlineDelta": 10 22 | }, 23 | "security": { 24 | "key": "${SECURITY_KEY}" 25 | }, 26 | "debug": { 27 | "ip": ["127.0.0.1", "172.0.0.0/8"], 28 | "folderName": "/tmp" 29 | } 30 | } -------------------------------------------------------------------------------- /php8/php-fpm.d/www.conf: -------------------------------------------------------------------------------- 1 | [www] 2 | 3 | user = ${CONTAINER_USER} 4 | group = ${CONTAINER_GROUP} 5 | 6 | listen = 127.0.0.1:9000 7 | 8 | pm = dynamic 9 | pm.max_children = 5 10 | pm.start_servers = 2 11 | pm.min_spare_servers = 1 12 | pm.max_spare_servers = 3 13 | pm.process_idle_timeout = 300s; 14 | pm.max_requests = 1000 15 | catch_workers_output = yes 16 | 17 | access.log = /var/log/php-fpm/$pool.access.log 18 | access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" 19 | slowlog = /var/log/php-fpm/$pool.log.slow 20 | request_slowlog_timeout = 15s 21 | request_terminate_timeout = 300s 22 | 23 | php_flag[display_errors] = off 24 | php_admin_flag[log_errors] = on 25 | php_admin_value[error_log] = /var/log/php-fpm/$pool.error.log 26 | php_admin_value[memory_limit] = 512M -------------------------------------------------------------------------------- /php81/php-fpm.d/www.conf: -------------------------------------------------------------------------------- 1 | [www] 2 | 3 | user = ${CONTAINER_USER} 4 | group = ${CONTAINER_GROUP} 5 | 6 | listen = 127.0.0.1:9000 7 | 8 | pm = dynamic 9 | pm.max_children = 5 10 | pm.start_servers = 2 11 | pm.min_spare_servers = 1 12 | pm.max_spare_servers = 3 13 | pm.process_idle_timeout = 300s; 14 | pm.max_requests = 1000 15 | catch_workers_output = yes 16 | 17 | access.log = /var/log/php-fpm/$pool.access.log 18 | access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" 19 | slowlog = /var/log/php-fpm/$pool.log.slow 20 | request_slowlog_timeout = 15s 21 | request_terminate_timeout = 300s 22 | 23 | php_flag[display_errors] = off 24 | php_admin_flag[log_errors] = on 25 | php_admin_value[error_log] = /var/log/php-fpm/$pool.error.log 26 | php_admin_value[memory_limit] = 512M -------------------------------------------------------------------------------- /php82/php-fpm.d/www.conf: -------------------------------------------------------------------------------- 1 | [www] 2 | 3 | user = ${CONTAINER_USER} 4 | group = ${CONTAINER_GROUP} 5 | 6 | listen = 127.0.0.1:9000 7 | 8 | pm = dynamic 9 | pm.max_children = 5 10 | pm.start_servers = 2 11 | pm.min_spare_servers = 1 12 | pm.max_spare_servers = 3 13 | pm.process_idle_timeout = 300s; 14 | pm.max_requests = 1000 15 | catch_workers_output = yes 16 | 17 | access.log = /var/log/php-fpm/$pool.access.log 18 | access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" 19 | slowlog = /var/log/php-fpm/$pool.log.slow 20 | request_slowlog_timeout = 15s 21 | request_terminate_timeout = 300s 22 | 23 | php_flag[display_errors] = off 24 | php_admin_flag[log_errors] = on 25 | php_admin_value[error_log] = /var/log/php-fpm/$pool.error.log 26 | php_admin_value[memory_limit] = 512M -------------------------------------------------------------------------------- /push-server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7 as bitrixenv 2 | 3 | WORKDIR /build 4 | ADD build.sh /build 5 | RUN chmod +x /build/build.sh && \ 6 | /build/build.sh 7 | 8 | FROM node:8-alpine 9 | 10 | #EXPOSE 80 11 | 12 | WORKDIR /opt/push-server 13 | 14 | COPY --from=bitrixenv /opt/push-server /opt/push-server 15 | 16 | RUN set -x && \ 17 | apk add --update "libintl" && \ 18 | apk add --virtual build_deps "gettext" && \ 19 | cp /usr/bin/envsubst /usr/local/bin/envsubst && \ 20 | apk del build_deps 21 | 22 | ADD run.sh /opt/push-server 23 | RUN chmod +x /opt/push-server/run.sh 24 | ADD config.template.json /etc/push-server/ 25 | 26 | ENV LISTEN_PORT 8010 27 | ENV LISTEN_HOSTNAME 0.0.0.0 28 | ENV REDIS_HOST redis 29 | ENV REDIS_PORT 6379 30 | ENV SECURITY_KEY changeme 31 | ENV MODE pub 32 | 33 | ENTRYPOINT ["./run.sh"] -------------------------------------------------------------------------------- /php8/conf.d/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | max_input_vars = 10000 3 | short_open_tag = On 4 | max_execution_time = 60 5 | max_input_time = 240 6 | memory_limit = 256M 7 | error_reporting = E_ALL ^ E_DEPRECATED 8 | display_errors = On 9 | display_startup_errors = Off 10 | log_errors = On 11 | log_errors_max_len = 4096 12 | report_memleaks = On 13 | html_errors = Off 14 | error_log = /var/log/php-fpm/php-error.log 15 | variables_order = "GPCS" 16 | request_order = "GP" 17 | register_globals = Off 18 | register_long_arrays = Off 19 | register_argc_argv = On 20 | auto_globals_jit = On 21 | post_max_size = 128M 22 | magic_quotes_gpc = Off 23 | magic_quotes_runtime = Off 24 | magic_quotes_sybase = Off 25 | upload_tmp_dir = /tmp 26 | upload_max_filesize = 128M 27 | max_file_uploads = 20 28 | allow_url_fopen = On 29 | allow_url_include = Off 30 | default_socket_timeout = 1200 31 | ; Utf-8 support 32 | default_charset = UTF-8 33 | # Security headers 34 | mail.add_x_header = Off 35 | expose_php = Off 36 | sendmail_path = "/usr/bin/msmtp -C /usr/local/etc/msmtp/msmtp.conf -t" -------------------------------------------------------------------------------- /php81/conf.d/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | max_input_vars = 10000 3 | short_open_tag = On 4 | max_execution_time = 60 5 | max_input_time = 240 6 | memory_limit = 256M 7 | error_reporting = E_ALL ^ E_DEPRECATED 8 | display_errors = On 9 | display_startup_errors = Off 10 | log_errors = On 11 | log_errors_max_len = 4096 12 | report_memleaks = On 13 | html_errors = Off 14 | error_log = /var/log/php-fpm/php-error.log 15 | variables_order = "GPCS" 16 | request_order = "GP" 17 | register_globals = Off 18 | register_long_arrays = Off 19 | register_argc_argv = On 20 | auto_globals_jit = On 21 | post_max_size = 128M 22 | magic_quotes_gpc = Off 23 | magic_quotes_runtime = Off 24 | magic_quotes_sybase = Off 25 | upload_tmp_dir = /tmp 26 | upload_max_filesize = 128M 27 | max_file_uploads = 20 28 | allow_url_fopen = On 29 | allow_url_include = Off 30 | default_socket_timeout = 1200 31 | ; Utf-8 support 32 | default_charset = UTF-8 33 | # Security headers 34 | mail.add_x_header = Off 35 | expose_php = Off 36 | sendmail_path = "/usr/bin/msmtp -C /usr/local/etc/msmtp/msmtp.conf -t" -------------------------------------------------------------------------------- /php82/conf.d/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | max_input_vars = 10000 3 | short_open_tag = On 4 | max_execution_time = 60 5 | max_input_time = 240 6 | memory_limit = 256M 7 | error_reporting = E_ALL ^ E_DEPRECATED 8 | display_errors = On 9 | display_startup_errors = Off 10 | log_errors = On 11 | log_errors_max_len = 4096 12 | report_memleaks = On 13 | html_errors = Off 14 | error_log = /var/log/php-fpm/php-error.log 15 | variables_order = "GPCS" 16 | request_order = "GP" 17 | register_globals = Off 18 | register_long_arrays = Off 19 | register_argc_argv = On 20 | auto_globals_jit = On 21 | post_max_size = 128M 22 | magic_quotes_gpc = Off 23 | magic_quotes_runtime = Off 24 | magic_quotes_sybase = Off 25 | upload_tmp_dir = /tmp 26 | upload_max_filesize = 128M 27 | max_file_uploads = 20 28 | allow_url_fopen = On 29 | allow_url_include = Off 30 | default_socket_timeout = 1200 31 | ; Utf-8 support 32 | default_charset = UTF-8 33 | # Security headers 34 | mail.add_x_header = Off 35 | expose_php = Off 36 | sendmail_path = "/usr/bin/msmtp -C /usr/local/etc/msmtp/msmtp.conf -t" -------------------------------------------------------------------------------- /nginx/etc/nginx.conf.template: -------------------------------------------------------------------------------- 1 | user ${CONTAINER_USER}; 2 | worker_processes 1; 3 | 4 | pid /var/run/nginx.pid; 5 | 6 | events { 7 | worker_connections 2048; 8 | use epoll; 9 | multi_accept on; 10 | } 11 | 12 | 13 | http { 14 | server_tokens off; 15 | 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | sendfile on; 20 | sendfile_max_chunk 128k; 21 | keepalive_timeout 65; 22 | keepalive_requests 10; 23 | client_body_buffer_size 1K; 24 | client_header_buffer_size 2k; 25 | large_client_header_buffers 2 1k; 26 | client_max_body_size 128m; 27 | fastcgi_buffers 64 16K; 28 | fastcgi_buffer_size 64k; 29 | client_body_timeout 10; 30 | client_header_timeout 10; 31 | reset_timedout_connection on; 32 | send_timeout 1; 33 | tcp_nopush on; 34 | tcp_nodelay on; 35 | 36 | # Content compression parameters 37 | gzip on; 38 | gzip_proxied any; 39 | gzip_static on; 40 | gzip_http_version 1.0; 41 | gzip_types application/x-javascript application/javascript text/css; 42 | 43 | include /etc/nginx/conf.d/*.conf; 44 | include /etc/nginx/sites-enabled/*.conf; 45 | } -------------------------------------------------------------------------------- /nginx/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BX_WORKDIR=/etc/nginx 4 | BX_TEMPLATE=bx.template 5 | BX_TARGETDIR=sites-enabled 6 | WWW_DIR=/var/www/public_html 7 | 8 | ######################## 9 | # create nginx configs 10 | ######################## 11 | if [[ ${BX_HOST_AUTOCREATE} == 1 ]]; then 12 | 13 | cd ${WWW_DIR} || exit 14 | 15 | [[ ! (-d "${BX_WORKDIR}/${BX_TARGETDIR}") ]] && mkdir -p "${BX_WORKDIR}/${BX_TARGETDIR}" 16 | 17 | for f in * 18 | do 19 | [[ ! (-d ${f}) ]] && continue 20 | 21 | TEMPLATE="${BX_WORKDIR}/${BX_TEMPLATE}" 22 | 23 | [[ ${f} =~ "." || ${BX_DEFAULT_LOCAL_DOMAIN} == '' ]] && HOST=${f} || HOST="${f}.${BX_DEFAULT_LOCAL_DOMAIN}" 24 | [[ ${HOST} == ${BX_DEFAULT_HOST} ]] && DEFAULT=" default_server" || DEFAULT="" 25 | 26 | OUTPUT="${BX_WORKDIR}/${BX_TARGETDIR}/${HOST}.conf" 27 | [[ -f ${OUTPUT} ]] && continue 28 | 29 | touch "${OUTPUT}" && sed -e "s/%HOST%/${HOST}/; s/%NAME%/${f}/; s/%DEFAULT%/${DEFAULT}/" "${TEMPLATE}" > ${OUTPUT} 30 | done 31 | 32 | fi 33 | ######################## 34 | 35 | 36 | 37 | set -e 38 | 39 | [[ $DEBUG == true ]] && set -x 40 | 41 | # allow arguments to be passed to nginx 42 | if [[ ${1:0:1} = '-' ]]; then 43 | EXTRA_ARGS="$@" 44 | set -- 45 | elif [[ ${1} == nginx || ${1} == $(which nginx) ]]; then 46 | EXTRA_ARGS="${@:2}" 47 | set -- 48 | fi 49 | 50 | # default behaviour is to launch nginx 51 | if [[ -z ${1} ]]; then 52 | echo "Starting nginx..." 53 | exec $(which nginx) -g "daemon off;" ${EXTRA_ARGS} 54 | else 55 | exec "$@" 56 | fi -------------------------------------------------------------------------------- /.env.default: -------------------------------------------------------------------------------- 1 | # путь к директории public_html, в которой содержатся директории хостов 2 | BX_PUBLIC_HTML_PATH=/var/www/bitrix/public_html 3 | # путь к репозиторию modules 4 | BX_MODULES_PATH=/var/www/bitrix/modules 5 | # путь к директории в которой контейнеры должны хранить логи 6 | BX_LOGS_PATH=/var/www/bitrix/logs 7 | 8 | # версия php 7|8 9 | BX_PHP_VERSION = 82 10 | 11 | # образ для mysql контейнера 12 | BX_MYSQL_IMAGE=mysql:8.3 13 | # пароль для root пользователя mysql 14 | BX_MYSQL_ROOT_PASSWORD=112112 15 | # порт на котором mysql будет доступен извне 16 | BX_MYSQL_PORT=3306 17 | 18 | # порт для PostgreSql 19 | BX_PGSQL_PORT=5432 20 | # пользователь по умолчанию PostgreSql 21 | BX_PGSQL_USER=bx 22 | # пароль от пользователя по умолчанию для PostgreSql 23 | BX_PGSQL_PASSWORD=112112 24 | # БД по умолчанию PostgreSql 25 | BX_PGSQL_DB=bx 26 | 27 | # IP для XDEBUG 28 | BX_XDEBUG_IP=127.0.0.1 29 | # port для XDEBUG 30 | BX_XDEBUG_PORT=9999 31 | 32 | # настройки push&pull сервера 33 | # хост для чтения сообщений 34 | BX_PUSH_SUB_HOST=bx-sub.lan 35 | # порт для чтения сообщений 36 | BX_PUSH_SUB_PORT=8080 37 | # хост для публикации сообщений 38 | BX_PUSH_PUB_HOST=bx-pub.lan 39 | # порт для публикации сообщений 40 | BX_PUSH_PUB_PORT=8895 41 | # ключ для подключения к push серверу 42 | BX_PUSH_SECURITY_KEY=bx112112 43 | 44 | # включает автоматическоое создание хостов по директориям 45 | # для отключения поставьте 0 46 | BX_HOST_AUTOCREATE=1 47 | # хост по умолчанию, получит аттрибут default_server в конфиге nginx 48 | # оставьте пустым, если не требуется 49 | BX_DEFAULT_HOST=bx.lan 50 | # доменная зона по умолчанию, будет добавлен через точку к имени директории хоста, если директория хоста в имени не содержит доменную зону 51 | # оставьте пустым если не требуется 52 | BX_DEFAULT_LOCAL_DOMAIN=lan 53 | 54 | # добавляет указанную строку в extra_hosts директиву docker-compose конфига (затем попадет в /etc/hosts php контейнера) 55 | # формат: "updates.lan:192.168.0.100" 56 | # необходимо, если используете локальный сервер обновлений, скрытый за VPN 57 | # оставьте как есть, если не требуется 58 | BX_UPDATE_HOST=brbrbr.localhost:127.0.0.1 59 | 60 | # пользователь и группа от имени которой будут работать php и nginx 61 | BX_CONTAINER_UID=1000 62 | BX_CONTAINER_GID=1000 63 | 64 | # кодировка по умолчанию для php 65 | BX_DEFAULT_CHARSET=UTF-8 66 | 67 | # порты по которым будет доступен nginx 68 | BX_HTTP_PORT=80 69 | BX_HTTPS_PORT=443 70 | 71 | # порты по которым будет доступен fakesmtp 72 | BX_SMTP_WEB_PORT=5080 73 | BX_SMTP_REST_PORT=5081 74 | BX_SMTP_PORT=5025 75 | BX_SMTP_FROM=mail@bx.lan -------------------------------------------------------------------------------- /nginx/etc/conf.d/maps-composite_cache.conf: -------------------------------------------------------------------------------- 1 | #################### compisite cache keys 2 | ## /path/to/asset => /path/to/asset 3 | ## /path/to/asset/ => /path/to/asset 4 | ## /path/to/dir/index.php => /path/to/dir 5 | map $uri $composite_key { 6 | default $uri; 7 | ~^(/|/index.php|/index.html)$ ""; 8 | ~^(?P.+)/$ $non_slash; 9 | ~^(?P.+)/index.php$ $non_index; 10 | ~^(?P.+)/index.html$ $non_index; 11 | } 12 | 13 | # disable composite cache if BX_ACTION_TYPE exists 14 | map $http_bx_action_type $not_bx_action_type { 15 | default "0"; 16 | '' "1"; 17 | } 18 | 19 | # disable composite cache if BX_AJAX 20 | map $http_bx_ajax $not_bx_ajax { 21 | default "0"; 22 | '' "1"; 23 | } 24 | 25 | # disable composite cache if method != GET 26 | map $request_method $is_get { 27 | default "0"; 28 | "GET" "1"; 29 | } 30 | 31 | # disable compisite cache if there next query string in agrs 32 | # ncc 33 | map $arg_ncc $non_arg_ncc { 34 | default "0"; 35 | '' "1"; 36 | } 37 | 38 | # bxajaxid 39 | map $arg_bxajaxid $non_arg_bxajaxid { 40 | default "0"; 41 | '' "1"; 42 | } 43 | 44 | # sessid 45 | map $arg_sessid $non_arg_sessid { 46 | default "0"; 47 | '' "1"; 48 | } 49 | 50 | # test IE 51 | map $http_user_agent $is_modern { 52 | default "1"; 53 | "~MSIE [5-9]" "0"; 54 | } 55 | 56 | # add common limit by uri path 57 | map $uri $is_good_uri { 58 | default "1"; 59 | ~^/bitrix/ "0"; 60 | ~^/index_controller.php "0"; 61 | } 62 | 63 | # not found NCC 64 | map $cookie_BITRIX_SM_NCC $non_cookie_ncc { 65 | default "0"; 66 | "" "1"; 67 | } 68 | 69 | # complex test 70 | # BITRIX_SM_LOGIN, BITRIX_SM_UIDH - hold values and BITRIX_SM_CC is empty 71 | map $cookie_BITRIX_SM_LOGIN $is_bx_sm_login { 72 | default "1"; 73 | "" "0"; 74 | } 75 | 76 | map $cookie_BITRIX_SM_UIDH $is_bx_sm_uidh { 77 | default "1"; 78 | "" "0"; 79 | } 80 | 81 | map $cookie_BITRIX_SM_CC $is_bx_sm_cc { 82 | default "1"; 83 | "Y" "0"; 84 | } 85 | 86 | map "${is_bx_sm_login}${is_bx_sm_uidh}${is_bx_sm_cc}" $is_storedAuth { 87 | default "1"; 88 | "111" "0"; 89 | } 90 | 91 | # test all global conditions 92 | map "${not_bx_action_type}${not_bx_ajax}${is_get}${non_arg_ncc}${non_arg_bxajaxid}${non_arg_sessid}${is_modern}${is_good_uri}${non_cookie_ncc}${is_storedAuth}" $is_global_composite { 93 | default "1"; 94 | ~0 "0"; 95 | } 96 | 97 | ## 98 | #################### /compisite cache keys 99 | 100 | #################### general cache setting 101 | ## /path/to/dir => /path/to/dir/index 102 | ## /path/to/dir/ => /path/to/dir/index 103 | ## /path/to/file.php => /path/to/php 104 | map $uri $general_key { 105 | default $uri; 106 | ~^(?P.+)/$ $non_slash; 107 | ~^(?P.+).php$ $php_path; 108 | } 109 | 110 | # if exists cookie PHPSESSID disable 111 | map $cookie_PHPSESSID $non_cookie_phpsessid { 112 | default "0"; 113 | '' "1"; 114 | } 115 | 116 | # main condition for general cache 117 | map "${is_get}${cookie_PHPSESSID}" $is_global_cache { 118 | default "1"; 119 | ~0 "0"; 120 | } -------------------------------------------------------------------------------- /php8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.0-fpm 2 | 3 | ARG APCU_VERSION=5.1.22 4 | 5 | ARG CONTAINER_GID 6 | ARG CONTAINER_UID 7 | ARG CONTAINER_USER 8 | ARG CONTAINER_GROUP 9 | 10 | ARG BX_XDEBUG_IP 11 | ARG BX_XDEBUG_PORT 12 | ARG BX_DEFAULT_CHARSET 13 | 14 | ARG BX_SMTP_PORT 15 | ARG BX_SMTP_FROM 16 | 17 | RUN apt-get update \ 18 | && apt-get install -y vim zip unzip default-mysql-client git msmtp \ 19 | && echo "syntax on" > ~/.vimrc \ 20 | && apt-get -y install \ 21 | libmagickwand-dev \ 22 | libjpeg62-turbo-dev \ 23 | libfreetype6-dev \ 24 | memcached \ 25 | libmemcached-dev \ 26 | libicu-dev \ 27 | libzip-dev \ 28 | zlib1g-dev \ 29 | libpng-dev \ 30 | libxml2-dev \ 31 | libpq-dev \ 32 | --no-install-recommends \ 33 | && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \ 34 | && docker-php-ext-install -j$(nproc) gd \ 35 | && docker-php-ext-install pgsql pdo_pgsql mysqli pdo_mysql opcache exif intl sockets bz2 zip \ 36 | && docker-php-ext-configure opcache --enable-opcache \ 37 | && docker-php-source extract \ 38 | && mkdir -p /usr/src/php/ext/apcu \ 39 | && curl -fsSL https://github.com/krakjoe/apcu/archive/v$APCU_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/apcu --strip 1 \ 40 | && docker-php-ext-install apcu \ 41 | && docker-php-source delete \ 42 | && rm -rf /tmp/* /var/cache/apk/* /var/lib/apt/lists/* 43 | 44 | RUN cd /tmp && \ 45 | # imagick 46 | git clone https://github.com/Imagick/imagick && \ 47 | cd imagick && \ 48 | phpize && \ 49 | ./configure && \ 50 | make && make install && \ 51 | docker-php-ext-enable imagick && \ 52 | cd /tmp && rm -rf imagick && \ 53 | # memcached 54 | git clone https://github.com/php-memcached-dev/php-memcached && \ 55 | cd php-memcached && \ 56 | phpize && \ 57 | ./configure && \ 58 | make && make install && \ 59 | docker-php-ext-enable memcached && \ 60 | cd /tmp && rm -rf php-memcached && \ 61 | # xdebug 62 | git clone -b xdebug_3_2 https://github.com/xdebug/xdebug.git && \ 63 | cd xdebug && \ 64 | phpize && \ 65 | ./configure && \ 66 | make && make install && \ 67 | docker-php-ext-enable xdebug && \ 68 | cd /tmp && rm -rf xdebug 69 | 70 | RUN groupadd -g ${CONTAINER_GID} ${CONTAINER_GROUP} && \ 71 | useradd -u ${CONTAINER_UID} -g ${CONTAINER_GID} ${CONTAINER_USER} 72 | 73 | RUN chmod -R 777 /usr/local/etc/php/ \ 74 | && chown -R ${CONTAINER_USER} /usr/local/etc/php/ \ 75 | && curl -sS https://getcomposer.org/installer | php ; mv composer.phar /usr/bin/composer 76 | 77 | COPY ./conf.d /usr/local/etc/php/conf.d/ 78 | COPY ./php-fpm.d /usr/local/etc/php-fpm.d/ 79 | COPY ./msmtp /usr/local/etc/msmtp/ 80 | 81 | RUN sed -i "$ a xdebug.client_host="${BX_XDEBUG_IP} /usr/local/etc/php/conf.d/xdebug.ini \ 82 | && sed -i "$ a xdebug.client_port="${BX_XDEBUG_PORT} /usr/local/etc/php/conf.d/xdebug.ini \ 83 | && sed -i "$ a default_charset="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/php.ini \ 84 | && sed -i "$ a mbstring.internal_encoding="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/mbstring.ini \ 85 | && sed -i "$ a from "${BX_SMTP_FROM} /usr/local/etc/msmtp/msmtp.conf 86 | 87 | # PHPUnit 88 | RUN mkdir /var/composer && \ 89 | cd /var/composer && \ 90 | composer require "phpunit/phpunit:^9" \ 91 | --no-interaction \ 92 | --no-plugins \ 93 | --no-scripts \ 94 | --prefer-dist 95 | 96 | ENTRYPOINT php-fpm -F 97 | -------------------------------------------------------------------------------- /php81/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm 2 | 3 | ARG APCU_VERSION=5.1.22 4 | 5 | ARG CONTAINER_GID 6 | ARG CONTAINER_UID 7 | ARG CONTAINER_USER 8 | ARG CONTAINER_GROUP 9 | 10 | ARG BX_XDEBUG_IP 11 | ARG BX_XDEBUG_PORT 12 | ARG BX_DEFAULT_CHARSET 13 | 14 | ARG BX_SMTP_PORT 15 | ARG BX_SMTP_FROM 16 | 17 | RUN apt-get update \ 18 | && apt-get install -y vim zip unzip default-mysql-client git msmtp \ 19 | && echo "syntax on" > ~/.vimrc \ 20 | && apt-get -y install \ 21 | libmagickwand-dev \ 22 | libjpeg62-turbo-dev \ 23 | libfreetype6-dev \ 24 | memcached \ 25 | libmemcached-dev \ 26 | libicu-dev \ 27 | libzip-dev \ 28 | zlib1g-dev \ 29 | libpng-dev \ 30 | libxml2-dev \ 31 | libpq-dev \ 32 | --no-install-recommends \ 33 | && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \ 34 | && docker-php-ext-install -j$(nproc) gd \ 35 | && docker-php-ext-install pgsql pdo_pgsql mysqli pdo_mysql opcache exif intl sockets bz2 zip \ 36 | && docker-php-ext-configure opcache --enable-opcache \ 37 | && docker-php-source extract \ 38 | && mkdir -p /usr/src/php/ext/apcu \ 39 | && curl -fsSL https://github.com/krakjoe/apcu/archive/v$APCU_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/apcu --strip 1 \ 40 | && docker-php-ext-install apcu \ 41 | && docker-php-source delete \ 42 | && rm -rf /tmp/* /var/cache/apk/* /var/lib/apt/lists/* 43 | 44 | RUN cd /tmp && \ 45 | # imagick 46 | git clone https://github.com/Imagick/imagick && \ 47 | cd imagick && \ 48 | phpize && \ 49 | ./configure && \ 50 | make && make install && \ 51 | docker-php-ext-enable imagick && \ 52 | cd /tmp && rm -rf imagick && \ 53 | # memcached 54 | git clone https://github.com/php-memcached-dev/php-memcached && \ 55 | cd php-memcached && \ 56 | phpize && \ 57 | ./configure && \ 58 | make && make install && \ 59 | docker-php-ext-enable memcached && \ 60 | cd /tmp && rm -rf php-memcached && \ 61 | # xdebug 62 | git clone -b xdebug_3_2 https://github.com/xdebug/xdebug.git && \ 63 | cd xdebug && \ 64 | phpize && \ 65 | ./configure && \ 66 | make && make install && \ 67 | docker-php-ext-enable xdebug && \ 68 | cd /tmp && rm -rf xdebug 69 | 70 | RUN groupadd -g ${CONTAINER_GID} ${CONTAINER_GROUP} && \ 71 | useradd -u ${CONTAINER_UID} -g ${CONTAINER_GID} ${CONTAINER_USER} 72 | 73 | RUN chmod -R 777 /usr/local/etc/php/ \ 74 | && chown -R ${CONTAINER_USER} /usr/local/etc/php/ \ 75 | && curl -sS https://getcomposer.org/installer | php ; mv composer.phar /usr/bin/composer 76 | 77 | COPY ./conf.d /usr/local/etc/php/conf.d/ 78 | COPY ./php-fpm.d /usr/local/etc/php-fpm.d/ 79 | COPY ./msmtp /usr/local/etc/msmtp/ 80 | 81 | RUN sed -i "$ a xdebug.client_host="${BX_XDEBUG_IP} /usr/local/etc/php/conf.d/xdebug.ini \ 82 | && sed -i "$ a xdebug.client_port="${BX_XDEBUG_PORT} /usr/local/etc/php/conf.d/xdebug.ini \ 83 | && sed -i "$ a default_charset="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/php.ini \ 84 | && sed -i "$ a mbstring.internal_encoding="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/mbstring.ini \ 85 | && sed -i "$ a from "${BX_SMTP_FROM} /usr/local/etc/msmtp/msmtp.conf 86 | 87 | # PHPUnit 88 | RUN mkdir /var/composer && \ 89 | cd /var/composer && \ 90 | composer require "phpunit/phpunit:^10" \ 91 | --no-interaction \ 92 | --no-plugins \ 93 | --no-scripts \ 94 | --prefer-dist 95 | 96 | ENTRYPOINT php-fpm -F 97 | -------------------------------------------------------------------------------- /php82/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.2-fpm 2 | 3 | ARG APCU_VERSION=5.1.22 4 | 5 | ARG CONTAINER_GID 6 | ARG CONTAINER_UID 7 | ARG CONTAINER_USER 8 | ARG CONTAINER_GROUP 9 | 10 | ARG BX_XDEBUG_IP 11 | ARG BX_XDEBUG_PORT 12 | ARG BX_DEFAULT_CHARSET 13 | 14 | ARG BX_SMTP_PORT 15 | ARG BX_SMTP_FROM 16 | 17 | RUN apt-get update \ 18 | && apt-get install -y vim zip unzip default-mysql-client git msmtp \ 19 | && echo "syntax on" > ~/.vimrc \ 20 | && apt-get -y install \ 21 | libmagickwand-dev \ 22 | libjpeg62-turbo-dev \ 23 | libfreetype6-dev \ 24 | memcached \ 25 | libmemcached-dev \ 26 | libicu-dev \ 27 | libzip-dev \ 28 | zlib1g-dev \ 29 | libpng-dev \ 30 | libxml2-dev \ 31 | libpq-dev \ 32 | --no-install-recommends \ 33 | && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \ 34 | && docker-php-ext-install -j$(nproc) gd \ 35 | && docker-php-ext-install pgsql pdo_pgsql mysqli pdo_mysql opcache exif intl sockets bz2 zip \ 36 | && docker-php-ext-configure opcache --enable-opcache \ 37 | && docker-php-source extract \ 38 | && mkdir -p /usr/src/php/ext/apcu \ 39 | && curl -fsSL https://github.com/krakjoe/apcu/archive/v$APCU_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/apcu --strip 1 \ 40 | && docker-php-ext-install apcu \ 41 | && docker-php-source delete \ 42 | && rm -rf /tmp/* /var/cache/apk/* /var/lib/apt/lists/* 43 | 44 | RUN cd /tmp && \ 45 | # imagick 46 | git clone https://github.com/Imagick/imagick && \ 47 | cd imagick && \ 48 | phpize && \ 49 | ./configure && \ 50 | make && make install && \ 51 | docker-php-ext-enable imagick && \ 52 | cd /tmp && rm -rf imagick && \ 53 | # memcached 54 | git clone https://github.com/php-memcached-dev/php-memcached && \ 55 | cd php-memcached && \ 56 | phpize && \ 57 | ./configure && \ 58 | make && make install && \ 59 | docker-php-ext-enable memcached && \ 60 | cd /tmp && rm -rf php-memcached && \ 61 | # xdebug 62 | git clone -b xdebug_3_2 https://github.com/xdebug/xdebug.git && \ 63 | cd xdebug && \ 64 | phpize && \ 65 | ./configure && \ 66 | make && make install && \ 67 | docker-php-ext-enable xdebug && \ 68 | cd /tmp && rm -rf xdebug 69 | 70 | RUN groupadd -g ${CONTAINER_GID} ${CONTAINER_GROUP} && \ 71 | useradd -u ${CONTAINER_UID} -g ${CONTAINER_GID} ${CONTAINER_USER} 72 | 73 | RUN chmod -R 777 /usr/local/etc/php/ \ 74 | && chown -R ${CONTAINER_USER} /usr/local/etc/php/ \ 75 | && curl -sS https://getcomposer.org/installer | php ; mv composer.phar /usr/bin/composer 76 | 77 | COPY ./conf.d /usr/local/etc/php/conf.d/ 78 | COPY ./php-fpm.d /usr/local/etc/php-fpm.d/ 79 | COPY ./msmtp /usr/local/etc/msmtp/ 80 | 81 | RUN sed -i "$ a xdebug.client_host="${BX_XDEBUG_IP} /usr/local/etc/php/conf.d/xdebug.ini \ 82 | && sed -i "$ a xdebug.client_port="${BX_XDEBUG_PORT} /usr/local/etc/php/conf.d/xdebug.ini \ 83 | && sed -i "$ a default_charset="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/php.ini \ 84 | && sed -i "$ a mbstring.internal_encoding="${BX_DEFAULT_CHARSET} /usr/local/etc/php/conf.d/mbstring.ini \ 85 | && sed -i "$ a from "${BX_SMTP_FROM} /usr/local/etc/msmtp/msmtp.conf 86 | 87 | # PHPUnit 88 | RUN mkdir /var/composer && \ 89 | cd /var/composer && \ 90 | composer require "phpunit/phpunit:^10" \ 91 | --no-interaction \ 92 | --no-plugins \ 93 | --no-scripts \ 94 | --prefer-dist 95 | 96 | ENTRYPOINT php-fpm -F 97 | -------------------------------------------------------------------------------- /nginx/etc/bx.template: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80%DEFAULT%; 3 | 4 | server_name %HOST%; 5 | set $docroot /var/www/public_html/%NAME%; 6 | root $docroot; 7 | index index.php index.html; 8 | 9 | client_max_body_size 1024m; 10 | 11 | access_log /var/log/nginx/access-%NAME%.log; 12 | error_log /var/log/nginx/error-%NAME%.log; 13 | 14 | if (!-e $request_filename) { 15 | rewrite ^(.*)$ /bitrix/routing_index.php last; 16 | } 17 | 18 | # Settings BX_TEMPORARY_FILES_DIRECTORY 19 | location ~* ^/bx_tmp_download/ { 20 | internal; 21 | rewrite /bx_tmp_download/(.+) /.bx_temp/default/$1 last; 22 | } 23 | 24 | location ~* ^/.bx_temp/default/ { 25 | internal; 26 | root /var/www/public_html; 27 | } 28 | 29 | # cache condition variable 30 | set $usecache ""; 31 | if ($is_global_cache = 1) { set $usecache "${usecache}A"; } 32 | 33 | # Cache location: composite and general site 34 | location ~* @.*\.html$ { 35 | internal; 36 | # disable browser cache, php manage file 37 | expires -1y; 38 | add_header X-Bitrix-Composite "Nginx (file)"; 39 | } 40 | 41 | # Player options, disable no-sniff 42 | location ~* ^/bitrix/components/bitrix/player/mediaplayer/player$ { 43 | add_header Access-Control-Allow-Origin *; 44 | } 45 | 46 | # php file processing 47 | location ~ \.php$ { 48 | 49 | set $cache_file "bitrix/html_pages$general_key@$args.html"; 50 | 51 | # test file conditions 52 | if (-f "$docroot/bitrix/html_pages/.enabled") { set $usecache "${usecache}B"; } 53 | if (-f "$docroot/$cache_file") { set $usecache "${usecache}C"; } 54 | 55 | # create rewrite if cache-file exists 56 | if ($usecache = "ABC" ) { rewrite .* /$cache_file last; } 57 | 58 | include fastcgi_params; 59 | fastcgi_pass php-upstream; 60 | fastcgi_index index.php; 61 | fastcgi_send_timeout 21600; 62 | fastcgi_read_timeout 21600; 63 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 64 | } 65 | 66 | # directories page processing 67 | location ~ /$ { 68 | 69 | set $cache_file "bitrix/html_pages$general_key/index@$args.html"; 70 | 71 | # test file conditions 72 | if (-f "$docroot/bitrix/html_pages/.enabled") { set $usecache "${usecache}B"; } 73 | if (-f "$docroot/$cache_file") { set $usecache "${usecache}C"; } 74 | 75 | # create rewrite if cache-file exists 76 | if ($usecache = "ABC" ) { rewrite .* /$cache_file last; } 77 | } 78 | 79 | location ~ /upload/ { 80 | client_body_buffer_size 1024m; 81 | client_max_body_size 1024m; 82 | } 83 | 84 | location = /favicon.png { 85 | log_not_found off; 86 | access_log off; 87 | } 88 | 89 | location = /robots.txt { 90 | log_not_found off; 91 | access_log off; 92 | } 93 | 94 | location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|eot|otf|ttf|woff|woff2)$ { 95 | log_not_found off; 96 | access_log off; 97 | expires 30d; 98 | add_header Cache-Control public; 99 | } 100 | 101 | location ~ (/bitrix/modules|/upload/support/not_image|/bitrix/php_interface|local/modules|local/php_interface) { 102 | deny all; 103 | } 104 | 105 | location ~ /.git/ { 106 | deny all; 107 | } 108 | 109 | location ~ /vendor/ { 110 | deny all; 111 | } 112 | 113 | location ~ /composer { 114 | deny all; 115 | } 116 | 117 | location ~ /.gitignore { 118 | deny all; 119 | } 120 | 121 | error_page 404 /404.html; 122 | 123 | location /404.html { 124 | 125 | } 126 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # BXEnv 2 | 3 | ## Назначение 4 | 5 | Сборка предназначена для разработки Битрикс и содержит контейнеры: 6 | - php 7 | - mysql 8 | - postgresql 9 | - nginx 10 | - redis 11 | - memcache 12 | - push&pull сервер 13 | - fakesmtp 14 | 15 | >**Внимание!** 16 | >Сборка рассчитана исключительно на локальную разработку. Использование в продакшене не безопасно! 17 | 18 | ## Быстрый старт 19 | 20 | 1. Клонируйте или скачайте репозиторий 21 | 2. Скопируйте содержимое файла `.env.default` в файл `.env` 22 | 3. В файле `.env` внесите необходимые изменения 23 | 4. Выполните команду `docker-compose up` 24 | 25 | ## Конфигурирование 26 | Для настройки используются переменные окружения, указываемые в файле `.env`. Полный список можно найти в файле `.env.default`. 27 | 28 | **BX_PUBLIC_HTML_PATH** 29 | путь к директории public_html, в которой содержатся директории хостов, монтируется в php и nginx контейнеры и используется для генерации хостов. 30 | 31 | **BX_MODULES_PATH** 32 | путь к репозиторию modules, требуется для работы с линкованной установкой, монтируется в php и nginx контейнеры 33 | 34 | **BX_LOGS_PATH** 35 | путь к директории в которой контейнеры должны хранить логи, монтируется в контейнеры, внутри каждый из контейнеров создаст свою папку 36 | 37 | **BX_MYSQL_IMAGE** 38 | образ для контейнера mysql, по умолчанию используется percona:5.7, но можно использовать mysql, в т.ч. mysql:8 39 | 40 | **BX_MYSQL_ROOT_PASSWORD** 41 | пароль для root пользователя mysql 42 | 43 | **BX_MYSQL_PORT** 44 | порт на котором mysql будет доступен извне, по умолчанию 3306 45 | 46 | **BX_XDEBUG_IP** 47 | устанавливает опцию xdebug.client_host 48 | 49 | **BX_XDEBUG_PORT** 50 | устанавливает опцию xdebug.client_port 51 | 52 | **BX_DEFAULT_CHARSET** 53 | кодировка по умолчанию для php 54 | 55 | **BX_HTTP_PORT** 56 | **BX_HTTPS_PORT** 57 | порты на которых будет доступен веб сервер 58 | 59 | **BX_CONTAINER_UID** 60 | **BX_CONTAINER_GID** 61 | пользователь и группа от имени которого будут работать php и nginx 62 | 63 | **BX_UPDATE_HOST** 64 | добавляет указанную строку в extra_hosts директиву docker-compose конфига (затем попадет в /etc/hosts php контейнера) 65 | формат: "updates.lan:192.168.0.100" 66 | необходимо, если используете локальный сервер обновлений, скрытый за VPN 67 | оставьте пустой, если не требуется 68 | 69 | ### Настройки push&pull сервера 70 | 71 | **BX_PUSH_SUB_HOST** 72 | хост для чтения сообщений 73 | 74 | **BX_PUSH_SUB_PORT** 75 | порт для чтения сообщений 76 | 77 | **BX_PUSH_PUB_HOST** 78 | хост для публикации сообщений 79 | 80 | **BX_PUSH_PUB_PORT** 81 | порт для публикации сообщений 82 | 83 | **BX_PUSH_SECURITY_KEY** 84 | ключ для подключения к push серверу 85 | 86 | ### Автоматическоое создание хостов 87 | 88 | **BX_HOST_AUTOCREATE** 89 | включает или отключает автогенерацию хостов nginx 90 | 91 | **BX_DEFAULT_HOST** 92 | хост по умолчанию, получит аттрибут default_server в конфиге nginx, оставьте пустым, если не требуется 93 | 94 | **BX_DEFAULT_LOCAL_DOMAIN** 95 | доменная зона по умолчанию, будет добавлена через точку к имени директории хоста, если директория хоста в имени не содержит доменную зону, оставьте пустым если не требуется 96 | 97 | >Каких-либо проверок или значений по умолчанию в системе нет. Если вы не укажете один или несколько параметров или вообще не создадите `.env` файл, docker-compose подставит пустые строки и выведет соответствующее уведомление. 98 | 99 | ## Автоподключение хостов 100 | При запуске контейнера nginx читается список директорий в public_html и для каждой создается виртуальный хост. 101 | Если в директории sites_enabled уже есть конфиг для какого-либо хоста, то он не будет перезаписан. 102 | Если указана переменная BX_DEFAULT_LOCAL_DOMAIN и имя директории не содержит точку, то для каждого хоста будет автоматически добавлена доменная зона. 103 | Если указана переменная BX_DEFAULT_HOST, то в конфигурации nginx этот хост будет отмечен хостом по умолчанию. 104 | 105 | ## Перехват почты 106 | Сборка содержит fakesmtp сервер, позволяющий перехватывать отправляемые почтовые уведомления. Реальной доставки писем в этом случае не происходит, письма попадают только в локальную БД. 107 | 108 | **BX_SMTP_WEB_PORT** 109 | порт для веб страницы со списком писем 110 | кроме того, по адресу /swagger-ui/index.html на этом порту будет доступна Swagger документация с описанием REST API 111 | 112 | **BX_SMTP_REST_PORT** 113 | порт для запросов к REST API 114 | 115 | **BX_SMTP_PORT=5025** 116 | порт smtp для отправки писем 117 | 118 | **BX_SMTP_FROM** 119 | адрес отправителя по умолчанию 120 | 121 | Для перехвата почты используется контейнер с fakesmtp сервером https://github.com/gessnerfl/fake-smtp-server. В контейнере с php в качестве sendmail'а указан msmtp с соответствующими настройками. 122 | Это значит, что перехватываться будут только письма на установках без специально настроенного SMTP сервера. 123 | 124 | Кроме этого можно достучаться до fakesmtp и явным образом: 125 | **host**: fakesmtp 126 | **port**: 5025 (по умолчанию, если не изменили) 127 | **auth**: no 128 | 129 | >**Внимание!** 130 | >fakesmtp не имеет постоянного хранилища, все данные в нем будут уничтожены при рестарте контейнера. 131 | 132 | ## PHPUnit 133 | В контейнере php-fpm установлен пакет PHPUnit.
134 | Файл phpunit.xml создается на хост машине
135 | Путь к phpunit.phar: /var/composer/vendor/bin/phpunit
136 | Путь к bootstrap: /media/bitrix/modules/bxtest/tests/.bootstrap.php 137 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | 2 | version: '3.8' 3 | 4 | services: 5 | 6 | memcache: 7 | image: memcached:alpine 8 | container_name: bx-memcache 9 | restart: always 10 | networks: 11 | bx: 12 | aliases: 13 | - memcache 14 | 15 | redis: 16 | image: redis 17 | container_name: bx-redis 18 | restart: always 19 | networks: 20 | bx: 21 | aliases: 22 | - redis 23 | 24 | push-server-sub: 25 | image: ikarpovich/bitrix-push-server 26 | container_name: bx-push-sub 27 | restart: always 28 | build: 29 | context: ./push-server 30 | environment: 31 | - REDIS_HOST=redis 32 | - LISTEN_HOSTNAME=0.0.0.0 33 | - LISTEN_PORT=${BX_PUSH_SUB_PORT} 34 | - SECURITY_KEY=${BX_PUSH_SECURITY_KEY} 35 | - MODE=sub 36 | ports: 37 | - ${BX_PUSH_SUB_PORT}:${BX_PUSH_SUB_PORT} 38 | labels: 39 | - traefik.port=${BX_PUSH_SUB_PORT} 40 | - traefik.protocol=http 41 | - traefik.frontend.rule=Host:${BX_PUSH_SUB_HOST} 42 | networks: 43 | bx: 44 | aliases: 45 | - ${BX_PUSH_SUB_HOST} 46 | 47 | push-server-pub: 48 | image: ikarpovich/bitrix-push-server 49 | container_name: bx-push-pub 50 | restart: always 51 | build: 52 | context: ./push-server 53 | environment: 54 | - REDIS_HOST=redis 55 | - LISTEN_HOSTNAME=0.0.0.0 56 | - LISTEN_PORT=${BX_PUSH_PUB_PORT} 57 | - SECURITY_KEY=${BX_PUSH_SECURITY_KEY} 58 | - MODE=pub 59 | networks: 60 | bx: 61 | aliases: 62 | - ${BX_PUSH_PUB_HOST} 63 | 64 | mysql: 65 | build: 66 | context: ./mysql 67 | args: 68 | - BX_MYSQL_IMAGE=${BX_MYSQL_IMAGE} 69 | container_name: bx-mysql 70 | restart: always 71 | environment: 72 | - MYSQL_ROOT_PASSWORD=${BX_MYSQL_ROOT_PASSWORD} 73 | - BX_MYSQL_IMAGE=${BX_MYSQL_IMAGE} 74 | ports: 75 | - ${BX_MYSQL_PORT}:3306 76 | volumes: 77 | - mysql_data:/var/lib/mysql 78 | - ${BX_LOGS_PATH}/mysql:/var/log/mysql 79 | networks: 80 | bx: 81 | aliases: 82 | - mysql 83 | 84 | postgre: 85 | build: 86 | context: ./postgres 87 | container_name: bx-postgresql 88 | restart: always 89 | volumes: 90 | - pgsql_data:/var/lib/postgresql/data 91 | environment: 92 | - POSTGRES_USER=${BX_PGSQL_USER} 93 | - POSTGRES_PASSWORD=${BX_PGSQL_PASSWORD} 94 | - POSTGRES_DB=${BX_PGSQL_DB} 95 | ports: 96 | - ${BX_PGSQL_PORT}:5432 97 | networks: 98 | bx: 99 | aliases: 100 | - pgsql 101 | 102 | php-fpm: 103 | build: 104 | context: ./php${BX_PHP_VERSION} 105 | args: 106 | - BX_XDEBUG_IP=${BX_XDEBUG_IP} 107 | - BX_XDEBUG_PORT=${BX_XDEBUG_PORT} 108 | - BX_DEFAULT_CHARSET=${BX_DEFAULT_CHARSET} 109 | - CONTAINER_UID=${BX_CONTAINER_UID} 110 | - CONTAINER_GID=${BX_CONTAINER_GID} 111 | - CONTAINER_USER=bx 112 | - CONTAINER_GROUP=bx 113 | - BX_SMTP_PORT=${BX_SMTP_PORT} 114 | - BX_SMTP_FROM=${BX_SMTP_FROM} 115 | container_name: bx-php-fpm 116 | restart: always 117 | environment: 118 | - CONTAINER_UID=${BX_CONTAINER_UID} 119 | - CONTAINER_GID=${BX_CONTAINER_GID} 120 | - CONTAINER_USER=bx 121 | - CONTAINER_GROUP=bx 122 | - BX_SMTP_PORT=${BX_SMTP_PORT} 123 | - BX_SMTP_FROM=${BX_SMTP_FROM} 124 | volumes: 125 | - ${BX_LOGS_PATH}/php-fpm:/var/log/php-fpm 126 | - bx-public:/var/www/public_html 127 | - bx-modules:/media/bitrix/modules 128 | extra_hosts: 129 | - ${BX_UPDATE_HOST} 130 | networks: 131 | bx: 132 | aliases: 133 | - php-fpm 134 | 135 | nginx: 136 | build: 137 | context: ./nginx 138 | args: 139 | - CONTAINER_UID=${BX_CONTAINER_UID} 140 | - CONTAINER_GID=${BX_CONTAINER_GID} 141 | - CONTAINER_USER=bx 142 | - CONTAINER_GROUP=bx 143 | ports: 144 | - ${BX_HTTP_PORT}:80 145 | - ${BX_HTTPS_PORT}:443 146 | container_name: bx-nginx 147 | restart: always 148 | environment: 149 | - BX_DEFAULT_HOST=${BX_DEFAULT_HOST} 150 | - BX_DEFAULT_LOCAL_DOMAIN=${BX_DEFAULT_LOCAL_DOMAIN} 151 | - BX_HOST_AUTOCREATE=${BX_HOST_AUTOCREATE} 152 | - CONTAINER_UID=${BX_CONTAINER_UID} 153 | - CONTAINER_GID=${BX_CONTAINER_GID} 154 | - CONTAINER_USER=bx 155 | - CONTAINER_GROUP=bx 156 | volumes: 157 | - ${BX_LOGS_PATH}/nginx:/var/log/nginx 158 | - bx-public:/var/www/public_html 159 | - bx-modules:/media/bitrix/modules 160 | networks: 161 | bx: 162 | aliases: 163 | - nginx 164 | 165 | node: 166 | build: 167 | context: ./node 168 | container_name: bx-node 169 | restart: always 170 | volumes: 171 | - bx-public:/var/www/public_html 172 | - bx-modules:/media/bitrix/modules 173 | networks: 174 | bx: 175 | aliases: 176 | - node 177 | 178 | fakesmtp: 179 | image: gessnerfl/fake-smtp-server 180 | container_name: bx-fakesmtp 181 | restart: always 182 | networks: 183 | bx: 184 | aliases: 185 | - fakesmtp 186 | ports: 187 | - ${BX_SMTP_WEB_PORT}:8080 188 | - ${BX_SMTP_REST_PORT}:8081 189 | - ${BX_SMTP_PORT}:8025 190 | 191 | 192 | networks: 193 | bx: 194 | 195 | volumes: 196 | mysql_data: 197 | pgsql_data: 198 | bx-modules: 199 | driver: local 200 | driver_opts: 201 | o: bind 202 | type: none 203 | device: ${BX_MODULES_PATH} 204 | bx-public: 205 | driver: local 206 | driver_opts: 207 | o: bind 208 | type: none 209 | device: ${BX_PUBLIC_HTML_PATH} --------------------------------------------------------------------------------