From a5bb9f6cc8c49d4ef64cdbb30a2619a4f19204b1 Mon Sep 17 00:00:00 2001 From: Easy Date: Sun, 13 Feb 2022 17:41:01 +0800 Subject: [PATCH] serverless version --- RoboFile.php | 8 +- api/.env.example | 1 + api/public/code.png | Bin 0 -> 51223 bytes api/resources/views/pushdeer.blade.php | 14 + api/routes/web.php | 2 +- docker-compose.serverless.yml | 19 + docker/web/Dockerfile.serverless | 10 +- docker/web/application.conf | 459 +++++++++++++++++++++++++ docker/web/config.yml | 48 --- docker/web/init.sh | 6 - docker/web/ports.conf | 16 + docker/web/supervisord-redis.conf | 13 + 12 files changed, 538 insertions(+), 58 deletions(-) create mode 100644 api/public/code.png create mode 100644 api/resources/views/pushdeer.blade.php create mode 100644 docker-compose.serverless.yml create mode 100644 docker/web/application.conf delete mode 100755 docker/web/config.yml create mode 100644 docker/web/ports.conf create mode 100644 docker/web/supervisord-redis.conf diff --git a/RoboFile.php b/RoboFile.php index 6f226b7..baa05c7 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -11,9 +11,15 @@ class RoboFile extends \Robo\Tasks { $tmp_dir = "/tmp/".md5(__DIR__); $this->_copyDir('docker', $tmp_dir.'/app/docker'); + # $this->taskReplaceInFile($tmp_dir.'/app/docker/web/init.sh')->from('# ./redis-server &')->to('./redis-server &')->run(); + $this->_copyDir('api', $tmp_dir.'/app/docker/web/api'); $this->_copyDir('push', $tmp_dir.'/app/docker/web/push'); - $this->_exec("cd $tmp_dir/app && docker build -f ./docker/web/dockerfile.serverless -t pushdeercore ./docker/web "); + // 更新redis为memory + $this->taskReplaceInFile($tmp_dir.'/app/docker/web/push/ios.yml')->from('addr: "redis:6379"')->to('addr: "127.0.0.1:6379"')->run(); + $this->taskReplaceInFile($tmp_dir.'/app/docker/web/push/clip.yml')->from('addr: "redis:6379"')->to('addr: "127.0.0.1:6379"')->run(); + // $this->_exec("open ".$tmp_dir.'/app/docker/'); + $this->_exec("cd $tmp_dir/app && docker build -f ./docker/web/Dockerfile.serverless -t pushdeercore ./docker/web "); $this->_exec("docker tag pushdeercore ccr.ccs.tencentyun.com/ftqq/pushdeercore"); $this->_exec("docker push ccr.ccs.tencentyun.com/ftqq/pushdeercore"); } diff --git a/api/.env.example b/api/.env.example index 0abafa7..56db05f 100644 --- a/api/.env.example +++ b/api/.env.example @@ -3,6 +3,7 @@ APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost +APP_LOCALE=zh-cn LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null diff --git a/api/public/code.png b/api/public/code.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef360e1fbf43cbb96146f2d610f24a4073d4327 GIT binary patch literal 51223 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 BEgb*= literal 0 HcmV?d00001 diff --git a/api/resources/views/pushdeer.blade.php b/api/resources/views/pushdeer.blade.php new file mode 100644 index 0000000..28766a3 --- /dev/null +++ b/api/resources/views/pushdeer.blade.php @@ -0,0 +1,14 @@ + + + + + + + PushDeer + + +
请用 ios14+ 系统摄像头扫码后输入↑浏览器上的地址↑进行测试
+clip code +
感谢使用自架版PushDeer
+ + diff --git a/api/routes/web.php b/api/routes/web.php index 8440de0..306cb9d 100644 --- a/api/routes/web.php +++ b/api/routes/web.php @@ -14,5 +14,5 @@ use Illuminate\Support\Facades\Route; */ Route::get('/', function () { - return ['PushDeer'=>'On']; + return view('pushdeer', []); }); diff --git a/docker-compose.serverless.yml b/docker-compose.serverless.yml new file mode 100644 index 0000000..f413b73 --- /dev/null +++ b/docker-compose.serverless.yml @@ -0,0 +1,19 @@ +version: '2' +services: + app: + image: 'ccr.ccs.tencentyun.com/ftqq/pushdeercore' + ports: + - '9000:9000' + environment: + - DB_HOST=host.docker.internal + - DB_PORT=3306 + - DB_USERNAME=root + - DB_DATABASE=pushdeer_local + - DB_PASSWORD= + - DB_TIMEZONE=+08:00 + - GO_PUSH_IOS_TOPIC=com.pushdeer.self.ios + - GO_PUSH_IOS_CLIP_TOPIC=com.pushdeer.self.ios.Clip + - APP_DEBUG=false + - WEB_PHP_SOCKET=127.0.0.1:8000 + extra_hosts: + - "host.docker.internal:host-gateway" \ No newline at end of file diff --git a/docker/web/Dockerfile.serverless b/docker/web/Dockerfile.serverless index 9079420..268c8ad 100644 --- a/docker/web/Dockerfile.serverless +++ b/docker/web/Dockerfile.serverless @@ -1,13 +1,19 @@ FROM webdevops/php-apache:8.0 +RUN apt-get update && apt-get install -y redis-server # 首先配置 vhost COPY vhost.conf /opt/docker/etc/httpd/vhost.conf # COPY web.vhost.conf /opt/docker/etc/httpd/vhost.common.d/ # 然后运行初始化脚本 # https://dockerfile.readthedocs.io/en/latest/content/Customization/provisioning.html +COPY ports.conf /etc/apache2/ports.conf +COPY application.conf /opt/docker/etc/php/fpm/pool.d/application.conf COPY init.sh /opt/docker/provision/entrypoint.d/ #CMD chmod +x /opt/docker/provision/entrypoint.d/init.sh +RUN echo "session.save_handler = redis\n" >> /opt/docker/etc/php/php.webdevops.ini +RUN echo "session.save_path = 'tcp://127.0.0.1:6379'\n" >> /opt/docker/etc/php/php.webdevops.ini +RUN echo "session.gc_maxlifetime = '259200'\n" >> /opt/docker/etc/php/php.webdevops.ini # ADD supervisord-proxy.conf /opt/docker/etc/supervisor.d/prism-proxy.conf RUN mkdir /data @@ -16,10 +22,10 @@ RUN chmod +x /data/gorush COPY api /app/api COPY push /app/push -# ADD ../../push /app/push +ADD supervisord-redis.conf /opt/docker/etc/supervisor.d/redis.conf ADD supervisord-ios.conf /opt/docker/etc/supervisor.d/push-ios.conf ADD supervisord-clip.conf /opt/docker/etc/supervisor.d/push-clip.conf -EXPOSE 80 +EXPOSE 80 9000 diff --git a/docker/web/application.conf b/docker/web/application.conf new file mode 100644 index 0000000..c7af547 --- /dev/null +++ b/docker/web/application.conf @@ -0,0 +1,459 @@ +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[www] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or NONE) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = application +group = application + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = 127.0.0.1:8000 + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. The owner +; and group can be specified either by name or by their numeric IDs. +; Default Values: user and group are set as the running user +; mode is set to 0660 +;listen.owner = www-data +;listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is different than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 5 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: (min_spare_servers + max_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following information: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/local/share/php/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The address on which to accept FastCGI status request. This creates a new +; invisible pool that can handle requests independently. This is useful +; if the main pool is busy with long running requests because it is still possible +; to get the status before finishing the long running requests. +; +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Default Value: value of the listen option +;pm.status_listen = 127.0.0.1:9001 + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +access.log = /docker.stdout + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{milliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some examples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +access.format = "[php-fpm:access] %R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +slowlog = /docker.stderr + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; Depth of slow log stack trace. +; Default Value: 20 +;request_slowlog_trace_depth = 20 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_terminate_timeout = 0 + +; The timeout set by 'request_terminate_timeout' ini option is not engaged after +; application calls 'fastcgi_finish_request' or when application has finished and +; shutdown functions are being called (registered via register_shutdown_function). +; This option will enable timeout limit to be applied unconditionally +; even in such cases. +; Default Value: no +;request_terminate_timeout_track_finished = no + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +;chdir = /var/www + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environment, this can cause some delay in the page +; process time (several ms). +; Default Value: no +catch_workers_output = yes + +; Decorate worker output with prefix and suffix containing information about +; the child that writes to the log and if stdout or stderr is used as well as +; log level and time. This options is used only if catch_workers_output is yes. +; Settings to "no" will output data as written to the stdout or stderr. +; Default value: yes +;decorate_workers_output = no + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr/local) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +php_admin_value[error_log] = /docker.stderr +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M +php_admin_value[log_errors] = on + +; container env settings +php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i \ No newline at end of file diff --git a/docker/web/config.yml b/docker/web/config.yml deleted file mode 100755 index b072d09..0000000 --- a/docker/web/config.yml +++ /dev/null @@ -1,48 +0,0 @@ -core: - enabled: true # enable httpd server - address: "127.0.0.1" # ip address to bind (default: any) - shutdown_timeout: 30 # default is 30 second - port: "8888" # ignore this port number if auto_tls is enabled (listen 443). - sync: false - max_notification: 1 - cert_path: "c.p12" - key_path: "" - cert_base64: "" - key_base64: "" - http_proxy: "" - pid: - enabled: false - path: "gorush.pid" - override: true - -api: - push_uri: "/api/push" - stat_go_uri: "/api/stat/go" - stat_app_uri: "/api/stat/app" - config_uri: "/api/config" - sys_stat_uri: "/sys/stats" - metric_uri: "/metrics" - health_uri: "/healthz" - -ios: - enabled: true - key_path: "c.p12" - key_base64: "" # load iOS key from base64 input - key_type: "p12" # could be pem, p12 or p8 type - password: "8;RkkZzRdYuUBvurNyZW" # certificate password, default as empty string. - production: false - max_concurrent_pushes: 100 # just for push ios notification - max_retry: 0 # resend fail notification, default value zero is disabled - key_id: "66M7BD2GCV" # KeyID from developer account (Certificates, Identifiers & Profiles -> Keys) - team_id: "HUJ6HAE4VU" # TeamID from developer account (View Account -> Membership) - -log: - format: "string" # string or json - access_log: "stdout" # stdout: output to console, or define log path like "log/access_log" - access_level: "debug" - error_log: "stderr" # stderr: output to console, or define log path like "log/error_log" - error_level: "error" - hide_token: true - -stat: - engine: "memory" # support memory, redis, boltdb, buntdb or leveldb \ No newline at end of file diff --git a/docker/web/init.sh b/docker/web/init.sh index 4f20730..6a02a38 100644 --- a/docker/web/init.sh +++ b/docker/web/init.sh @@ -8,9 +8,3 @@ chmod -R 0777 /app/api/storage mkdir -p /app/api/bootstrap/cache/ chmod -R 0777 /app/api/bootstrap/cache/ - - - -# 启动 proxy -# 已经设置为 deamon -# cd /app/proxy && ./server-linux & diff --git a/docker/web/ports.conf b/docker/web/ports.conf new file mode 100644 index 0000000..e46494a --- /dev/null +++ b/docker/web/ports.conf @@ -0,0 +1,16 @@ +# If you just change the port or add more ports here, you will likely also +# have to change the VirtualHost statement in +# /etc/apache2/sites-enabled/000-default.conf + +Listen 80 +Listen 9000 + + + Listen 443 + + + + Listen 443 + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet \ No newline at end of file diff --git a/docker/web/supervisord-redis.conf b/docker/web/supervisord-redis.conf new file mode 100644 index 0000000..960ac1c --- /dev/null +++ b/docker/web/supervisord-redis.conf @@ -0,0 +1,13 @@ +[group:redis] +programs=redis +priority=18 + +[program:redis] +process_name=%(program_name)s +command=/usr/bin/redis-server +autostart=true +startretries=10 +autorestart=true +priority=1 +redirect_stderr=true +stdout_logfile=/redis.log \ No newline at end of file