mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 00:26:51 +01:00 
			
		
		
		
	
						commit
						a067419d6e
					
				
							
								
								
									
										10
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | .git | ||||||
|  | node_modules | ||||||
|  | vendor | ||||||
|  | database/database.sqlite | ||||||
|  | storage/debugbar/*.json | ||||||
|  | storage/logs/*.log | ||||||
|  | storage/framework/cache/data/* | ||||||
|  | storage/framework/sessions/* | ||||||
|  | storage/framework/testing | ||||||
|  | storage/framework/views/*.php | ||||||
| @ -4,7 +4,6 @@ APP_KEY= | |||||||
| APP_TIMEZONE=UTC | APP_TIMEZONE=UTC | ||||||
| APP_URL=http://panel.test | APP_URL=http://panel.test | ||||||
| APP_LOCALE=en | APP_LOCALE=en | ||||||
| APP_INSTALLED=false |  | ||||||
| 
 | 
 | ||||||
| LOG_CHANNEL=daily | LOG_CHANNEL=daily | ||||||
| LOG_STACK=single | LOG_STACK=single | ||||||
|  | |||||||
							
								
								
									
										83
									
								
								.github/docker/entrypoint.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								.github/docker/entrypoint.sh
									
									
									
									
										vendored
									
									
								
							| @ -1,81 +1,58 @@ | |||||||
| #!/bin/ash -e | #!/bin/ash -e | ||||||
| cd /app |  | ||||||
| 
 | 
 | ||||||
| mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php8/ \ | #mkdir -p /var/log/supervisord/ /var/log/php8/ \ | ||||||
|   && chmod 777 /var/log/panel/logs/ \ |  | ||||||
|   && ln -s /app/storage/logs/ /var/log/panel/ |  | ||||||
| 
 | 
 | ||||||
| ## check for .env file and generate app keys if missing | ## check for .env file and generate app keys if missing | ||||||
| if [ -f /app/var/.env ]; then | if [ -f /pelican-data/.env ]; then | ||||||
|   echo "external vars exist." |   echo "external vars exist." | ||||||
|   rm -rf /app/.env |   rm -rf /var/www/html/.env | ||||||
|   ln -s /app/var/.env /app/ |  | ||||||
| else | else | ||||||
|   echo "external vars don't exist." |   echo "external vars don't exist." | ||||||
|   rm -rf /app/.env |   rm -rf /var/www/html/.env | ||||||
|   touch /app/var/.env |   touch /pelican-data/.env | ||||||
| 
 | 
 | ||||||
|   ## manually generate a key because key generate --force fails |   ## manually generate a key because key generate --force fails | ||||||
|   if [ -z $APP_KEY ]; then |   if [ -z $APP_KEY ]; then | ||||||
|      echo -e "Generating key." |      echo -e "Generating key." | ||||||
|      APP_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) |      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 "Generated app key: $APP_KEY" | ||||||
|      echo -e "APP_KEY=$APP_KEY" > /app/var/.env |      echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env | ||||||
|   else |   else | ||||||
|     echo -e "APP_KEY exists in environment, using that." |     echo -e "APP_KEY exists in environment, using that." | ||||||
|     echo -e "APP_KEY=$APP_KEY" > /app/var/.env |     echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env | ||||||
|   fi |   fi | ||||||
| 
 |  | ||||||
|   ln -s /app/var/.env /app/ |  | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| echo "Checking if https is required." | mkdir /pelican-data/database | ||||||
| if [ -f /etc/nginx/http.d/panel.conf ]; then | ln -s /pelican-data/.env /var/www/html/ | ||||||
|   echo "Using nginx config already in place." | ln -s /pelican-data/database/database.sqlite /var/www/html/database/ | ||||||
|   if [ $LE_EMAIL ]; then | 
 | ||||||
|     echo "Checking for cert update" | if ! grep -q "APP_KEY=" .env || grep -q "APP_KEY=$" .env; then | ||||||
|     certbot certonly -d $(echo $APP_URL | sed 's~http[s]*://~~g')  --standalone -m $LE_EMAIL --agree-tos -n |   echo "Generating APP_KEY..." | ||||||
|   else |   php artisan key:generate --force | ||||||
|     echo "No letsencrypt email is set" |  | ||||||
|   fi |  | ||||||
| else | else | ||||||
|   echo "Checking if letsencrypt email is set." |   echo "APP_KEY is already 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|<domain>|$(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 | 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 | ## make sure the db is set up | ||||||
| echo -e "Migrating and Seeding D.B" | echo -e "Migrating Database" | ||||||
| php artisan migrate --seed --force | php artisan migrate --force | ||||||
| 
 | 
 | ||||||
| ## start cronjobs for the queue | ## start cronjobs for the queue | ||||||
| echo -e "Starting cron jobs." | echo -e "Starting cron jobs." | ||||||
| crond -L /var/log/crond -l 5 | crond -L /var/log/crond -l 5 | ||||||
| 
 | 
 | ||||||
| echo -e "Starting supervisord." | export SUPERVISORD_CADDY=false | ||||||
|  | 
 | ||||||
|  | ## disable caddy if SKIP_CADDY is set | ||||||
|  | if [[ -z $SKIP_CADDY ]]; then | ||||||
|  |   echo "Starting PHP-FPM and Caddy" | ||||||
|  |   export SUPERVISORD_CADDY=true | ||||||
|  | else | ||||||
|  |   echo "Starting PHP-FPM only" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | chown -R www-data:www-data . /pelican-data/.env /pelican-data/database | ||||||
|  | 
 | ||||||
|  | echo "Starting Supervisord" | ||||||
| exec "$@" | exec "$@" | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								.github/docker/supervisord.conf
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/docker/supervisord.conf
									
									
									
									
										vendored
									
									
								
							| @ -25,15 +25,15 @@ autostart=true | |||||||
| autorestart=true | autorestart=true | ||||||
| 
 | 
 | ||||||
| [program:queue-worker] | [program:queue-worker] | ||||||
| command=/usr/local/bin/php /app/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3 | command=/usr/local/bin/php /var/www/html/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3 | ||||||
| user=nginx | user=www-data | ||||||
| autostart=true | autostart=true | ||||||
| autorestart=true | autorestart=true | ||||||
| 
 | 
 | ||||||
| [program:nginx] | [program:caddy] | ||||||
| command=/usr/sbin/nginx -g 'daemon off;' | command=caddy run --config /etc/caddy/Caddyfile --adapter caddyfile | ||||||
| autostart=true | autostart=%(ENV_SUPERVISORD_CADDY)s | ||||||
| autorestart=true | autorestart=%(ENV_SUPERVISORD_CADDY)s | ||||||
| priority=10 | priority=10 | ||||||
| stdout_events_enabled=true | stdout_events_enabled=true | ||||||
| stderr_events_enabled=true | stderr_events_enabled=true | ||||||
							
								
								
									
										11
									
								
								Caddyfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Caddyfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | { | ||||||
|  |     email {$ADMIN_EMAIL} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | {$APP_URL} { | ||||||
|  |     root * /var/www/html/public | ||||||
|  |     encode gzip | ||||||
|  | 
 | ||||||
|  |     php_fastcgi 127.0.0.1:9000 | ||||||
|  |     file_server | ||||||
|  | } | ||||||
							
								
								
									
										85
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								Dockerfile
									
									
									
									
									
								
							| @ -1,41 +1,58 @@ | |||||||
| # Stage 0: | # Pelican Production Dockerfile | ||||||
| # 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 | FROM node:20-alpine AS yarn | ||||||
| # level distribution | #FROM --platform=$TARGETOS/$TARGETARCH node:20-alpine AS yarn | ||||||
| FROM --platform=$TARGETOS/$TARGETARCH node:20-alpine | 
 | ||||||
| WORKDIR /app | WORKDIR /build | ||||||
|  | 
 | ||||||
| COPY . ./ | COPY . ./ | ||||||
| RUN yarn install --frozen-lockfile \ |  | ||||||
|     && yarn run build:production |  | ||||||
| 
 | 
 | ||||||
| # Stage 1: | RUN yarn install --frozen-lockfile && yarn run build:production | ||||||
| # Build the actual container with all of the needed PHP dependencies that will run the application. |  | ||||||
| FROM --platform=$TARGETOS/$TARGETARCH php:8.3-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 icu-dev certbot certbot-nginx \ |  | ||||||
|     && docker-php-ext-configure zip \ |  | ||||||
|     && docker-php-ext-install bcmath gd intl 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 \ |  | ||||||
|     && mkdir -p /app/storage/logs/ \ |  | ||||||
|     && chown -R nginx:nginx . |  | ||||||
| 
 | 
 | ||||||
| RUN rm /usr/local/etc/php-fpm.conf \ | FROM php:8.3-fpm-alpine | ||||||
|     && echo "* * * * * /usr/local/bin/php /app/artisan schedule:run >> /dev/null 2>&1" >> /var/spool/cron/crontabs/root \ | # FROM --platform=$TARGETOS/$TARGETARCH php:8.3-fpm-alpine | ||||||
|     && 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 --from=composer:latest /usr/bin/composer /usr/local/bin/composer | ||||||
| COPY .github/docker/www.conf /usr/local/etc/php-fpm.conf | 
 | ||||||
| COPY .github/docker/supervisord.conf /etc/supervisord.conf | WORKDIR /var/www/html | ||||||
|  | 
 | ||||||
|  | # Install dependencies | ||||||
|  | RUN apk update && apk add --no-cache \ | ||||||
|  |     libpng-dev libjpeg-turbo-dev freetype-dev libzip-dev icu-dev \ | ||||||
|  |     zip unzip curl \ | ||||||
|  |     caddy ca-certificates supervisor \ | ||||||
|  |     && docker-php-ext-install bcmath gd intl zip opcache pcntl posix pdo_mysql | ||||||
|  | 
 | ||||||
|  | # Copy the Caddyfile to the container | ||||||
|  | COPY Caddyfile /etc/caddy/Caddyfile | ||||||
|  | 
 | ||||||
|  | # Copy the application code to the container | ||||||
|  | COPY . . | ||||||
|  | 
 | ||||||
|  | COPY --from=yarn /build/public/assets ./public/assets | ||||||
|  | 
 | ||||||
|  | RUN touch .env | ||||||
|  | 
 | ||||||
|  | RUN composer install --no-dev --optimize-autoloader | ||||||
|  | 
 | ||||||
|  | # Set file permissions | ||||||
|  | RUN chmod -R 755 /var/www/html/storage \ | ||||||
|  |     && chmod -R 755 /var/www/html/bootstrap/cache | ||||||
|  | 
 | ||||||
|  | # Add scheduler to cron | ||||||
|  | RUN echo "* * * * * php /var/www/html/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data - | ||||||
|  | 
 | ||||||
|  | ## supervisord config and log dir | ||||||
|  | RUN cp .github/docker/supervisord.conf /etc/supervisord.conf && \ | ||||||
|  |     mkdir /var/log/supervisord/ | ||||||
|  | 
 | ||||||
|  | HEALTHCHECK --interval=5m --timeout=10s --start-period=5s --retries=3 \ | ||||||
|  |   CMD curl -f http://localhost/up || exit 1 | ||||||
|  | 
 | ||||||
|  | EXPOSE 80:2019 | ||||||
|  | EXPOSE 443 | ||||||
|  | 
 | ||||||
|  | VOLUME /pelican-data | ||||||
| 
 | 
 | ||||||
| EXPOSE 80 443 |  | ||||||
| ENTRYPOINT [ "/bin/ash", ".github/docker/entrypoint.sh" ] | ENTRYPOINT [ "/bin/ash", ".github/docker/entrypoint.sh" ] | ||||||
| CMD [ "supervisord", "-n", "-c", "/etc/supervisord.conf" ] | CMD [ "supervisord", "-n", "-c", "/etc/supervisord.conf" ] | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ use App\Filament\Pages\Installer\Steps\DatabaseStep; | |||||||
| use App\Filament\Pages\Installer\Steps\EnvironmentStep; | use App\Filament\Pages\Installer\Steps\EnvironmentStep; | ||||||
| use App\Filament\Pages\Installer\Steps\RedisStep; | use App\Filament\Pages\Installer\Steps\RedisStep; | ||||||
| use App\Filament\Pages\Installer\Steps\RequirementsStep; | use App\Filament\Pages\Installer\Steps\RequirementsStep; | ||||||
|  | use App\Models\User; | ||||||
| use App\Services\Users\UserCreationService; | use App\Services\Users\UserCreationService; | ||||||
| use App\Traits\CheckMigrationsTrait; | use App\Traits\CheckMigrationsTrait; | ||||||
| use App\Traits\EnvironmentWriterTrait; | use App\Traits\EnvironmentWriterTrait; | ||||||
| @ -43,11 +44,22 @@ class PanelInstaller extends SimplePage implements HasForms | |||||||
|         return MaxWidth::SevenExtraLarge; |         return MaxWidth::SevenExtraLarge; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public static function show(): bool | ||||||
|  |     { | ||||||
|  |         if (User::count() <= 0) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (config('panel.client_features.installer.enabled')) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public function mount() |     public function mount() | ||||||
|     { |     { | ||||||
|         if (is_installed()) { |         abort_unless(self::show(), 404); | ||||||
|             abort(404); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         $this->form->fill(); |         $this->form->fill(); | ||||||
|     } |     } | ||||||
| @ -122,7 +134,7 @@ class PanelInstaller extends SimplePage implements HasForms | |||||||
|             $user = app(UserCreationService::class)->handle($userData); |             $user = app(UserCreationService::class)->handle($userData); | ||||||
| 
 | 
 | ||||||
|             // Install setup complete
 |             // Install setup complete
 | ||||||
|             $this->writeToEnvironment(['APP_INSTALLED' => 'true']); |             $this->writeToEnvironment(['APP_INSTALLER' => 'false']); | ||||||
| 
 | 
 | ||||||
|             $this->rememberData(); |             $this->rememberData(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,11 +16,11 @@ class AdminUserStep | |||||||
|                     ->label('Admin E-Mail') |                     ->label('Admin E-Mail') | ||||||
|                     ->required() |                     ->required() | ||||||
|                     ->email() |                     ->email() | ||||||
|                     ->default('admin@example.com'), |                     ->placeholder('admin@example.com'), | ||||||
|                 TextInput::make('user.username') |                 TextInput::make('user.username') | ||||||
|                     ->label('Admin Username') |                     ->label('Admin Username') | ||||||
|                     ->required() |                     ->required() | ||||||
|                     ->default('admin'), |                     ->placeholder('admin'), | ||||||
|                 TextInput::make('user.password') |                 TextInput::make('user.password') | ||||||
|                     ->label('Admin Password') |                     ->label('Admin Password') | ||||||
|                     ->required() |                     ->required() | ||||||
|  | |||||||
| @ -23,9 +23,9 @@ class EnvironmentStep | |||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     public const QUEUE_DRIVERS = [ |     public const QUEUE_DRIVERS = [ | ||||||
|  |         'sync' => 'Sync', | ||||||
|         'database' => 'Database', |         'database' => 'Database', | ||||||
|         'redis' => 'Redis', |         'redis' => 'Redis', | ||||||
|         'sync' => 'Synchronous', |  | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     public const DATABASE_DRIVERS = [ |     public const DATABASE_DRIVERS = [ | ||||||
| @ -76,7 +76,7 @@ class EnvironmentStep | |||||||
|                 ToggleButtons::make('env.QUEUE_CONNECTION') |                 ToggleButtons::make('env.QUEUE_CONNECTION') | ||||||
|                     ->label('Queue Driver') |                     ->label('Queue Driver') | ||||||
|                     ->hintIcon('tabler-question-mark') |                     ->hintIcon('tabler-question-mark') | ||||||
|                     ->hintIconTooltip('The driver used for handling queues. We recommend "Database".') |                     ->hintIconTooltip('The driver used for handling queues. We recommend "Sync" or "Database".') | ||||||
|                     ->required() |                     ->required() | ||||||
|                     ->inline() |                     ->inline() | ||||||
|                     ->options(self::QUEUE_DRIVERS) |                     ->options(self::QUEUE_DRIVERS) | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| namespace App\Http\Controllers\Auth; | namespace App\Http\Controllers\Auth; | ||||||
| 
 | 
 | ||||||
|  | use App\Filament\Pages\Installer\PanelInstaller; | ||||||
| use Carbon\CarbonImmutable; | use Carbon\CarbonImmutable; | ||||||
| use Illuminate\Support\Str; | use Illuminate\Support\Str; | ||||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||||
| @ -17,8 +18,12 @@ class LoginController extends AbstractLoginController | |||||||
|      * base authentication view component. React will take over at this point and |      * base authentication view component. React will take over at this point and | ||||||
|      * turn the login area into an SPA. |      * turn the login area into an SPA. | ||||||
|      */ |      */ | ||||||
|     public function index(): View |     public function index() | ||||||
|     { |     { | ||||||
|  |         if (PanelInstaller::show()) { | ||||||
|  |             return redirect('/installer'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         return view('templates/auth.core'); |         return view('templates/auth.core'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,34 +17,3 @@ if (!function_exists('is_ip')) { | |||||||
|         return $address !== null && filter_var($address, FILTER_VALIDATE_IP) !== false; |         return $address !== null && filter_var($address, FILTER_VALIDATE_IP) !== false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| if (!function_exists('object_get_strict')) { |  | ||||||
|     /** |  | ||||||
|      * Get an object using dot notation. An object key with a value of null is still considered valid |  | ||||||
|      * and will not trigger the response of a default value (unlike object_get). |  | ||||||
|      */ |  | ||||||
|     function object_get_strict(object $object, ?string $key, mixed $default = null): mixed |  | ||||||
|     { |  | ||||||
|         if (is_null($key) || trim($key) == '') { |  | ||||||
|             return $object; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         foreach (explode('.', $key) as $segment) { |  | ||||||
|             if (!is_object($object) || !property_exists($object, $segment)) { |  | ||||||
|                 return value($default); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             $object = $object->{$segment}; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return $object; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| if (!function_exists('is_installed')) { |  | ||||||
|     function is_installed(): bool |  | ||||||
|     { |  | ||||||
|         // This defaults to true so existing panels count as "installed"
 |  | ||||||
|         return env('APP_INSTALLED', true); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
							
								
								
									
										58
									
								
								compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | x-common: | ||||||
|  |   panel: | ||||||
|  |     &panel-environment | ||||||
|  |     APP_URL: "https://localhost" # can be set to 'http://localhost' on port 80 only | ||||||
|  |     ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" | ||||||
|  | 
 | ||||||
|  |     APP_DEBUG: "false" | ||||||
|  |     APP_ENVIRONMENT_ONLY: "false" | ||||||
|  |     APP_ENV: "production" | ||||||
|  |     SESSION_DRIVER: "file" | ||||||
|  | 
 | ||||||
|  |   mail: | ||||||
|  |     &mail-environment | ||||||
|  |     MAIL_DRIVER: "log" | ||||||
|  |     # MAIL_HOST: "" | ||||||
|  |     # MAIL_PORT: "" | ||||||
|  |     # MAIL_FROM: "" | ||||||
|  |     # MAIL_USERNAME: "" | ||||||
|  |     # MAIL_PASSWORD: "" | ||||||
|  |     # MAIL_ENCRYPTION: "" | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # ------------------------------------------------------------------------------------------ | ||||||
|  | # DANGER ZONE BELOW | ||||||
|  | # | ||||||
|  | # The remainder of this file likely does not need to be changed. Please only make modifications | ||||||
|  | # below if you understand what you are doing. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | services: | ||||||
|  |   panel: | ||||||
|  |     image: ghcr.io/pelican-dev/panel:latest | ||||||
|  |     restart: always | ||||||
|  |     networks: | ||||||
|  |       - default | ||||||
|  |     ports: | ||||||
|  |       - "80:80" | ||||||
|  |       - "443:443" | ||||||
|  |       # - "9000:9000" # enable when not using caddy to be abel to reach php-fpm | ||||||
|  |     extra_hosts: | ||||||
|  |       - "host.docker.internal:host-gateway" # shows the panel on te internal docker network as well. usually '172.17.0.1' | ||||||
|  |     volumes: | ||||||
|  |       - pelican-data:/pelican-data | ||||||
|  |       - pelican-logs:/var/www/html/storage/logs | ||||||
|  |     environment: | ||||||
|  |       <<: [*panel-environment, *mail-environment] | ||||||
|  |       XDG_DATA_HOME: /pelican-data | ||||||
|  |       # SKIP_CADDY: true # enable when not using caddy. | ||||||
|  | 
 | ||||||
|  | volumes: | ||||||
|  |   pelican-data: | ||||||
|  |   pelican-logs: | ||||||
|  | 
 | ||||||
|  | networks: | ||||||
|  |   default: | ||||||
|  |     ipam: | ||||||
|  |       config: | ||||||
|  |         - subnet: 172.20.0.0/16 | ||||||
| @ -7,7 +7,6 @@ | |||||||
|         "ext-json": "*", |         "ext-json": "*", | ||||||
|         "ext-mbstring": "*", |         "ext-mbstring": "*", | ||||||
|         "ext-pdo": "*", |         "ext-pdo": "*", | ||||||
|         "ext-pdo_mysql": "*", |  | ||||||
|         "ext-zip": "*", |         "ext-zip": "*", | ||||||
|         "abdelhamiderrahmouni/filament-monaco-editor": "0.2.1", |         "abdelhamiderrahmouni/filament-monaco-editor": "0.2.1", | ||||||
|         "aws/aws-sdk-php": "~3.288.1", |         "aws/aws-sdk-php": "~3.288.1", | ||||||
|  | |||||||
| @ -1,5 +1,11 @@ | |||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
|  | $database = env('DB_DATABASE', 'database.sqlite'); | ||||||
|  | $datapasePath = database_path($database); | ||||||
|  | if (str($database)->startsWith('/')) { | ||||||
|  |     $databasePath = $database; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| return [ | return [ | ||||||
| 
 | 
 | ||||||
|     'default' => env('DB_CONNECTION', 'sqlite'), |     'default' => env('DB_CONNECTION', 'sqlite'), | ||||||
| @ -8,7 +14,7 @@ return [ | |||||||
|         'sqlite' => [ |         'sqlite' => [ | ||||||
|             'driver' => 'sqlite', |             'driver' => 'sqlite', | ||||||
|             'url' => env('DB_URL'), |             'url' => env('DB_URL'), | ||||||
|             'database' => database_path(env('DB_DATABASE', 'database.sqlite')), |             'database' => $datapasePath, | ||||||
|             'prefix' => '', |             'prefix' => '', | ||||||
|             'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), |             'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), | ||||||
|         ], |         ], | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ return [ | |||||||
|     | Client Features |     | Client Features | ||||||
|     |-------------------------------------------------------------------------- |     |-------------------------------------------------------------------------- | ||||||
|     | |     | | ||||||
|     | Allow clients to create their own databases. |     | Allow clients to turn features on or off | ||||||
|     */ |     */ | ||||||
| 
 | 
 | ||||||
|     'client_features' => [ |     'client_features' => [ | ||||||
| @ -93,6 +93,10 @@ return [ | |||||||
|             'range_start' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_START'), |             'range_start' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_START'), | ||||||
|             'range_end' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_END'), |             'range_end' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_END'), | ||||||
|         ], |         ], | ||||||
|  | 
 | ||||||
|  |         'installer' => [ | ||||||
|  |             'enabled' => env('APP_INSTALLER', true), | ||||||
|  |         ], | ||||||
|     ], |     ], | ||||||
| 
 | 
 | ||||||
|     /* |     /* | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lance Pioch
						Lance Pioch