From 490690f1d077a3d4da887706602c1567124ab686 Mon Sep 17 00:00:00 2001 From: Matthew Penner Date: Sun, 27 Nov 2022 12:34:31 -0700 Subject: [PATCH] docker: overhaul container image --- .github/docker/Caddyfile | 30 ++++++++++++ .github/docker/README.md | 76 ------------------------------- .github/docker/default.conf | 51 --------------------- .github/docker/default_ssl.conf | 70 ---------------------------- .github/docker/entrypoint.sh | 81 --------------------------------- .github/docker/php-fpm.conf | 21 +++++++++ .github/docker/supervisord.conf | 78 +++++++++++++++++++------------ .github/docker/www.conf | 16 ------- .github/docker/yacron.yaml | 8 ++++ .github/workflows/docker.yaml | 4 +- Containerfile | 79 ++++++++++++++++++++++++++++++++ Dockerfile | 40 ---------------- 12 files changed, 188 insertions(+), 366 deletions(-) create mode 100644 .github/docker/Caddyfile delete mode 100644 .github/docker/README.md delete mode 100644 .github/docker/default.conf delete mode 100644 .github/docker/default_ssl.conf delete mode 100644 .github/docker/entrypoint.sh create mode 100644 .github/docker/php-fpm.conf delete mode 100644 .github/docker/www.conf create mode 100644 .github/docker/yacron.yaml create mode 100644 Containerfile delete mode 100644 Dockerfile diff --git a/.github/docker/Caddyfile b/.github/docker/Caddyfile new file mode 100644 index 000000000..3ac87b587 --- /dev/null +++ b/.github/docker/Caddyfile @@ -0,0 +1,30 @@ +:8080 { + root * /var/www/pterodactyl/public/ + file_server + + header { + -Server + -X-Powered-By + Referrer-Policy "same-origin" + X-Frame-Options "deny" + X-XSS-Protection "1; mode=block" + X-Content-Type-Options "nosniff" + } + + encode gzip zstd + + php_fastcgi 127.0.0.1:9000 { + trusted_proxies 172.20.0.0/16 + } + + @startsWithDot { + path \/\. + not path .well-known + } + rewrite @startsWithDot /index.php{uri} + + @phpRewrite { + not file favicon.ico + } + try_files @phpRewrite {path} {path}/ /index.php?{query} +} diff --git a/.github/docker/README.md b/.github/docker/README.md deleted file mode 100644 index 5cf97de44..000000000 --- a/.github/docker/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Pterodactyl Panel - Docker Image -This is a ready to use docker image for the panel. - -## Requirements -This docker image requires some additional software to function. The software can either be provided in other containers (see the [docker-compose.yml](https://github.com/pterodactyl/panel/blob/develop/docker-compose.example.yml) as an example) or as existing instances. - -A mysql database is required. We recommend the stock [MariaDB Image](https://hub.docker.com/_/mariadb/) image if you prefer to run it in a docker container. As a non-containerized option we recommend mariadb. - -A caching software is required as well. We recommend the stock [Redis Image](https://hub.docker.com/_/redis/) image. You can choose any of the [supported options](#cache-drivers). - -You can provide additional settings using a custom `.env` file or by setting the appropriate environment variables in the docker-compose file. - -## Setup - -Start the docker container and the required dependencies (either provide existing ones or start containers as well, see the [docker-compose.yml](https://github.com/pterodactyl/panel/blob/develop/docker-compose.example.yml) file as an example. - -After the startup is complete you'll need to create a user. -If you are running the docker container without docker-compose, use: -``` -docker exec -it php artisan p:user:make -``` -If you are using docker compose use -``` -docker-compose exec panel php artisan p:user:make -``` - -## Environment Variables -There are multiple environment variables to configure the panel when not providing your own `.env` file, see the following table for details on each available option. - -Note: If your `APP_URL` starts with `https://` you need to provide an `LE_EMAIL` as well so Certificates can be generated. - -| Variable | Description | Required | -| ------------------- | ------------------------------------------------------------------------------ | -------- | -| `APP_URL` | The URL the panel will be reachable with (including protocol) | yes | -| `APP_TIMEZONE` | The timezone to use for the panel | yes | -| `LE_EMAIL` | The email used for letsencrypt certificate generation | yes | -| `DB_HOST` | The host of the mysql instance | yes | -| `DB_PORT` | The port of the mysql instance | yes | -| `DB_DATABASE` | The name of the mysql database | yes | -| `DB_USERNAME` | The mysql user | yes | -| `DB_PASSWORD` | The mysql password for the specified user | yes | -| `CACHE_DRIVER` | The cache driver (see [Cache drivers](#cache-drivers) for detais) | yes | -| `SESSION_DRIVER` | | yes | -| `QUEUE_DRIVER` | | yes | -| `REDIS_HOST` | The hostname or IP address of the redis database | yes | -| `REDIS_PASSWORD` | The password used to secure the redis database | maybe | -| `REDIS_PORT` | The port the redis database is using on the host | maybe | -| `MAIL_DRIVER` | The email driver (see [Mail drivers](#mail-drivers) for details) | yes | -| `MAIL_FROM` | The email that should be used as the sender email | yes | -| `MAIL_HOST` | The host of your mail driver instance | maybe | -| `MAIL_PORT` | The port of your mail driver instance | maybe | -| `MAIL_USERNAME` | The username for your mail driver | maybe | -| `MAIL_PASSWORD` | The password for your mail driver | maybe | - - -### Cache drivers -You can choose between different cache drivers depending on what you prefer. -We recommend redis when using docker as it can be started in a container easily. - -| Driver | Description | Required variables | -| -------- | ------------------------------------ | ------------------------------------------------------ | -| redis | host where redis is running | `REDIS_HOST` | -| redis | port redis is running on | `REDIS_PORT` | -| redis | redis database password | `REDIS_PASSWORD` | - -### Mail drivers -You can choose between different mail drivers according to your needs. -Every driver requires `MAIL_FROM` to be set. - -| Driver | Description | Required variables | -| -------- | ------------------------------------ | ------------------------------------------------------------- | -| mail | uses the installed php mail | | -| mandrill | [Mandrill](http://www.mandrill.com/) | `MAIL_USERNAME` | -| postmark | [Postmark](https://postmarkapp.com/) | `MAIL_USERNAME` | -| mailgun | [Mailgun](https://www.mailgun.com/) | `MAIL_USERNAME`, `MAIL_HOST` | -| smtp | Any SMTP server can be configured | `MAIL_USERNAME`, `MAIL_HOST`, `MAIL_PASSWORD`, `MAIL_PORT` | diff --git a/.github/docker/default.conf b/.github/docker/default.conf deleted file mode 100644 index b6105e5fa..000000000 --- a/.github/docker/default.conf +++ /dev/null @@ -1,51 +0,0 @@ -# If using Ubuntu this file should be placed in: -# /etc/nginx/sites-available/ -# -# If using CentOS this file should be placed in: -# /etc/nginx/conf.d/ -# -server { - listen 80; - server_name _; - - root /app/public; - index index.html index.htm index.php; - charset utf-8; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location = /favicon.ico { access_log off; log_not_found off; } - location = /robots.txt { access_log off; log_not_found off; } - - access_log off; - error_log /var/log/nginx/pterodactyl.app-error.log error; - - # allow larger file uploads and longer script runtimes - client_max_body_size 100m; - client_body_timeout 120s; - - sendfile off; - - location ~ \.php$ { - fastcgi_split_path_info ^(.+\.php)(/.+)$; - # the fastcgi_pass path needs to be changed accordingly when using CentOS - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param HTTP_PROXY ""; - fastcgi_intercept_errors off; - fastcgi_buffer_size 16k; - fastcgi_buffers 4 16k; - fastcgi_connect_timeout 300; - fastcgi_send_timeout 300; - fastcgi_read_timeout 300; - } - - location ~ /\.ht { - deny all; - } -} diff --git a/.github/docker/default_ssl.conf b/.github/docker/default_ssl.conf deleted file mode 100644 index 9ec5c10db..000000000 --- a/.github/docker/default_ssl.conf +++ /dev/null @@ -1,70 +0,0 @@ -# If using Ubuntu this file should be placed in: -# /etc/nginx/sites-available/ -# -server { - listen 80; - server_name ; - return 301 https://$server_name$request_uri; -} - -server { - listen 443 ssl http2; - server_name ; - - root /app/public; - index index.php; - - access_log /var/log/nginx/pterodactyl.app-access.log; - error_log /var/log/nginx/pterodactyl.app-error.log error; - - # allow larger file uploads and longer script runtimes - client_max_body_size 100m; - client_body_timeout 120s; - - sendfile off; - - # strengthen ssl security - ssl_certificate /etc/letsencrypt/live//fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live//privkey.pem; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - ssl_session_cache shared:SSL:10m; - ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; - - # See the link below for more SSL information: - # https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html - # - # ssl_dhparam /etc/ssl/certs/dhparam.pem; - - # Add headers to serve security related headers - add_header Strict-Transport-Security "max-age=15768000; preload;"; - add_header X-Content-Type-Options nosniff; - add_header X-XSS-Protection "1; mode=block"; - add_header X-Robots-Tag none; - add_header Content-Security-Policy "frame-ancestors 'self'"; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location ~ \.php$ { - fastcgi_split_path_info ^(.+\.php)(/.+)$; - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param HTTP_PROXY ""; - fastcgi_intercept_errors off; - fastcgi_buffer_size 16k; - fastcgi_buffers 4 16k; - fastcgi_connect_timeout 300; - fastcgi_send_timeout 300; - fastcgi_read_timeout 300; - include /etc/nginx/fastcgi_params; - } - - location ~ /\.ht { - deny all; - } -} \ No newline at end of file diff --git a/.github/docker/entrypoint.sh b/.github/docker/entrypoint.sh deleted file mode 100644 index d3df9c150..000000000 --- a/.github/docker/entrypoint.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/ash -e -cd /app - -mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php7/ \ - && chmod 777 /var/log/panel/logs/ \ - && ln -s /var/log/panel/logs/ /app/storage/logs/ - -## check for .env file and generate app keys if missing -if [ -f /app/var/.env ]; then - echo "external vars exist." - rm -rf /app/.env - ln -s /app/var/.env /app/ -else - echo "external vars don't exist." - rm -rf /app/.env - touch /app/var/.env - - ## manually generate a key because key generate --force fails - if [ -z $APP_KEY ]; then - echo -e "Generating key." - APP_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) - echo -e "Generated app key: $APP_KEY" - echo -e "APP_KEY=$APP_KEY" > /app/var/.env - else - echo -e "APP_KEY exists in environment, using that." - echo -e "APP_KEY=$APP_KEY" > /app/var/.env - fi - - ln -s /app/var/.env /app/ -fi - -echo "Checking if https is required." -if [ -f /etc/nginx/http.d/panel.conf ]; then - echo "Using nginx config already in place." - if [ $LE_EMAIL ]; then - echo "Checking for cert update" - certbot certonly -d $(echo $APP_URL | sed 's~http[s]*://~~g') --standalone -m $LE_EMAIL --agree-tos -n - else - echo "No letsencrypt email is set" - fi -else - echo "Checking if letsencrypt email is set." - if [ -z $LE_EMAIL ]; then - echo "No letsencrypt email is set using http config." - cp .github/docker/default.conf /etc/nginx/http.d/panel.conf - else - echo "writing ssl config" - cp .github/docker/default_ssl.conf /etc/nginx/http.d/panel.conf - echo "updating ssl config for domain" - sed -i "s||$(echo $APP_URL | sed 's~http[s]*://~~g')|g" /etc/nginx/http.d/panel.conf - echo "generating certs" - certbot certonly -d $(echo $APP_URL | sed 's~http[s]*://~~g') --standalone -m $LE_EMAIL --agree-tos -n - fi - echo "Removing the default nginx config" - rm -rf /etc/nginx/http.d/default.conf -fi - -if [[ -z $DB_PORT ]]; then - echo -e "DB_PORT not specified, defaulting to 3306" - DB_PORT=3306 -fi - -## check for DB up before starting the panel -echo "Checking database status." -until nc -z -v -w30 $DB_HOST $DB_PORT -do - echo "Waiting for database connection..." - # wait for 1 seconds before check again - sleep 1 -done - -## make sure the db is set up -echo -e "Migrating and Seeding D.B" -php artisan migrate --seed --force - -## start cronjobs for the queue -echo -e "Starting cron jobs." -crond -L /var/log/crond -l 5 - -echo -e "Starting supervisord." -exec "$@" diff --git a/.github/docker/php-fpm.conf b/.github/docker/php-fpm.conf new file mode 100644 index 000000000..9812e6610 --- /dev/null +++ b/.github/docker/php-fpm.conf @@ -0,0 +1,21 @@ +[global] +error_log = /dev/stderr +daemonize = no + +[www] +user = nobody +group = nobody + +listen = 127.0.0.1:9000 + +pm = dynamic +pm.start_servers = 4 +pm.min_spare_servers = 4 +pm.max_spare_servers = 16 +pm.max_children = 64 +pm.max_requests = 256 + +clear_env = no +catch_workers_output = yes + +decorate_workers_output = no diff --git a/.github/docker/supervisord.conf b/.github/docker/supervisord.conf index da6823aeb..be659165b 100644 --- a/.github/docker/supervisord.conf +++ b/.github/docker/supervisord.conf @@ -1,39 +1,57 @@ -[unix_http_server] -file=/tmp/supervisor.sock ; path to your socket file - [supervisord] -logfile=/var/log/supervisord/supervisord.log ; supervisord log file -logfile_maxbytes=50MB ; maximum size of logfile before rotation -logfile_backups=2 ; number of backed up logfiles -loglevel=error ; info, debug, warn, trace -pidfile=/var/run/supervisord.pid ; pidfile location -nodaemon=false ; run supervisord as a daemon -minfds=1024 ; number of startup file descriptors -minprocs=200 ; number of process descriptors -user=root ; default user -childlogdir=/var/log/supervisord/ ; where child log files will live +logfile=/dev/stdout +logfile_maxbytes=0 +loglevel=info +minfds=1024 +minprocs=200 +nodaemon=true +pidfile=/dev/null -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface +[unix_http_server] +file=/tmp/supervisor.sock [supervisorctl] -serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket +serverurl=unix:///tmp/supervisor.sock -[program:php-fpm] -command=/usr/local/sbin/php-fpm -F -autostart=true -autorestart=true +[rpcinterface:supervisor] +supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface -[program:queue-worker] -command=/usr/local/bin/php /app/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3 -user=nginx -autostart=true -autorestart=true - -[program:nginx] -command=/usr/sbin/nginx -g 'daemon off;' +[program:caddy] +command=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile autostart=true autorestart=true priority=10 -stdout_events_enabled=true -stderr_events_enabled=true \ No newline at end of file +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:php-fpm] +command=/usr/sbin/php-fpm --nodaemonize +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=LOG_CHANNEL="stderr" + +[program:queue-worker] +command=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=standard --sleep=3 --tries=3 +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=LOG_CHANNEL="stderr" + +[program:yacron] +command=/usr/local/bin/yacron -c /etc/yacron.yaml +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=LOG_CHANNEL="stderr" diff --git a/.github/docker/www.conf b/.github/docker/www.conf deleted file mode 100644 index c0c17903f..000000000 --- a/.github/docker/www.conf +++ /dev/null @@ -1,16 +0,0 @@ -[www] - -user = nginx -group = nginx - -listen = 127.0.0.1:9000 -listen.owner = nginx -listen.group = nginx -listen.mode = 0750 - -pm = ondemand -pm.max_children = 9 -pm.process_idle_timeout = 10s -pm.max_requests = 200 - -clear_env = no \ No newline at end of file diff --git a/.github/docker/yacron.yaml b/.github/docker/yacron.yaml new file mode 100644 index 000000000..c0dc75ecd --- /dev/null +++ b/.github/docker/yacron.yaml @@ -0,0 +1,8 @@ +jobs: + - name: scheduler + command: + - /usr/bin/php + - /var/www/pterodactyl/artisan + - schedule:run + schedule: "* * * * *" + utc: true diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 0e1a2b77e..515866472 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -41,7 +41,7 @@ jobs: if: "contains(github.ref, 'release/v')" with: context: . - file: ./Dockerfile + file: ./Containerfile push: true platforms: linux/amd64,linux/arm64 tags: ${{ steps.docker_meta.outputs.tags }} @@ -52,7 +52,7 @@ jobs: if: "contains(github.ref, 'develop')" with: context: . - file: ./Dockerfile + file: ./Containerfile push: ${{ github.event_name != 'pull_request' }} platforms: linux/amd64,linux/arm64 tags: ${{ steps.docker_meta.outputs.tags }} diff --git a/Containerfile b/Containerfile new file mode 100644 index 000000000..5634a2a3f --- /dev/null +++ b/Containerfile @@ -0,0 +1,79 @@ +# Stage 0 - Caddy +FROM docker.io/library/caddy:latest AS caddy + +# Stage 1 - Builder +FROM registry.access.redhat.com/ubi9/nodejs-16-minimal AS builder + +RUN npm install -g yarn + +WORKDIR /var/www/pterodactyl + +COPY --chown=1001:0 public ./public +COPY --chown=1001:0 resources/scripts ./resources/scripts +COPY --chown=1001:0 .eslintignore .eslintrc.js .prettierrc.json package.json tailwind.config.js tsconfig.json vite.config.ts yarn.lock . + +RUN /opt/app-root/src/.npm-global/bin/yarn install --frozen-lockfile \ + && /opt/app-root/src/.npm-global/bin/yarn build \ + && rm -rf resources/scripts .eslintignore .eslintrc.yml .yarnrc.yml package.json tailwind.config.js tsconfig.json vite.config.ts yarn.lock node_modules + +COPY --chown=1001:0 app ./app +COPY --chown=1001:0 bootstrap ./bootstrap +COPY --chown=1001:0 config ./config +COPY --chown=1001:0 database ./database +COPY --chown=1001:0 resources/lang ./resources/lang +COPY --chown=1001:0 resources/views ./resources/views +COPY --chown=1001:0 routes ./routes +COPY --chown=1001:0 .env.example ./.env +COPY --chown=1001:0 artisan CHANGELOG.md composer.json composer.lock LICENSE.md README.md SECURITY.md . + +# Stage 2 - Final +FROM registry.access.redhat.com/ubi9/ubi-minimal + +RUN useradd --home-dir /var/lib/caddy --create-home caddy \ + && microdnf update -y \ + && rpm --install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \ + && rpm --install https://rpms.remirepo.net/enterprise/remi-release-9.rpm \ + && microdnf update -y \ + && microdnf install -y ca-certificates tar tzdata unzip wget \ + && microdnf module -y reset php \ + && microdnf module -y enable php:remi-8.1 \ + && microdnf install -y cronie php-{bcmath,cli,common,fpm,gd,gmp,intl,json,mbstring,mysqlnd,opcache,pdo,pecl-redis5,pecl-zip,phpiredis,pgsql,process,sodium,xml,zstd} supervisor \ + && rm /etc/php-fpm.d/www.conf \ + && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ + && microdnf remove -y tar \ + && microdnf clean all \ + && mkdir /etc/caddy \ + && wget -O /usr/local/bin/yacron https://github.com/gjcarneiro/yacron/releases/download/0.17.0/yacron-0.17.0-x86_64-unknown-linux-gnu + +RUN chmod 755 /usr/local/bin/yacron + +COPY --chown=caddy:caddy --from=builder /var/www/pterodactyl /var/www/pterodactyl + +WORKDIR /var/www/pterodactyl + +RUN mkdir -p /tmp/pterodactyl/cache /tmp/pterodactyl/framework/{cache,sessions,views} storage/framework \ + && rm -rf bootstrap/cache storage/framework/sessions storage/framework/views storage/framework/cache \ + && ln -s /tmp/pterodactyl/cache /var/www/pterodactyl/bootstrap/cache \ + && ln -s /tmp/pterodactyl/framework/cache /var/www/pterodactyl/storage/framework/cache \ + && ln -s /tmp/pterodactyl/framework/sessions /var/www/pterodactyl/storage/framework/sessions \ + && ln -s /tmp/pterodactyl/framework/views /var/www/pterodactyl/storage/framework/views \ + && chmod -R 755 /var/www/pterodactyl/storage/* /tmp/pterodactyl/cache \ + && chown -R caddy:caddy /var/www/pterodactyl /tmp/pterodactyl/{cache,framework} + +USER caddy +ENV USER=caddy + +RUN composer install --no-dev --optimize-autoloader \ + && rm -rf bootstrap/cache/*.php \ +# && php artisan route:cache \ +# && php artisan view:cache \ + && rm -rf .env storage/logs/*.log + +COPY --from=caddy /usr/bin/caddy /usr/local/bin/caddy +COPY .github/docker/Caddyfile /etc/caddy/Caddyfile +COPY .github/docker/php-fpm.conf /etc/php-fpm.conf +COPY .github/docker/supervisord.conf /etc/supervisord.conf +COPY .github/docker/yacron.yaml /etc/yacron.yaml + +EXPOSE 8080 +CMD ["/usr/bin/supervisord", "--configuration=/etc/supervisord.conf"] diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index e215d9406..000000000 --- a/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -# Stage 0: -# Build the assets that are needed for the frontend. This build stage is then discarded -# since we won't need NodeJS anymore in the future. This Docker image ships a final production -# level distribution of Pterodactyl. -FROM --platform=$TARGETOS/$TARGETARCH mhart/alpine-node:14 -WORKDIR /app -COPY . ./ -RUN yarn install --frozen-lockfile \ - && yarn run build:production - -# Stage 1: -# Build the actual container with all of the needed PHP dependencies that will run the application. -FROM --platform=$TARGETOS/$TARGETARCH php:8.1-fpm-alpine -WORKDIR /app -COPY . ./ -COPY --from=0 /app/public/assets ./public/assets -RUN apk add --no-cache --update ca-certificates dcron curl git supervisor tar unzip nginx libpng-dev libxml2-dev libzip-dev certbot certbot-nginx \ - && docker-php-ext-configure zip \ - && docker-php-ext-install bcmath gd pdo_mysql zip \ - && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ - && cp .env.example .env \ - && mkdir -p bootstrap/cache/ storage/logs storage/framework/sessions storage/framework/views storage/framework/cache \ - && chmod 777 -R bootstrap storage \ - && composer install --no-dev --optimize-autoloader \ - && rm -rf .env bootstrap/cache/*.php \ - && chown -R nginx:nginx . - -RUN rm /usr/local/etc/php-fpm.conf \ - && echo "* * * * * /usr/local/bin/php /app/artisan schedule:run >> /dev/null 2>&1" >> /var/spool/cron/crontabs/root \ - && echo "0 23 * * * certbot renew --nginx --quiet" >> /var/spool/cron/crontabs/root \ - && sed -i s/ssl_session_cache/#ssl_session_cache/g /etc/nginx/nginx.conf \ - && mkdir -p /var/run/php /var/run/nginx - -COPY .github/docker/default.conf /etc/nginx/http.d/default.conf -COPY .github/docker/www.conf /usr/local/etc/php-fpm.conf -COPY .github/docker/supervisord.conf /etc/supervisord.conf - -EXPOSE 80 443 -ENTRYPOINT [ "/bin/ash", ".github/docker/entrypoint.sh" ] -CMD [ "supervisord", "-n", "-c", "/etc/supervisord.conf" ]