fix(laravel): apply runtime DB config and startup entrypoint
Laravel images no longer bake config:cache at build time, which ignored K8s DB env vars. Add DB_CONNECTION, clear config on boot, generate APP_KEY when missing, run migrations, and rebuild caches at container start. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -90,6 +90,25 @@ PostgreSQL PGDATA path — must be a subdirectory of the mount to avoid "initdb:
|
|||||||
/var/lib/postgresql/data/pgdata
|
/var/lib/postgresql/data/pgdata
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "cloudhost-app.laravelDbConnection" -}}
|
||||||
|
{{- if eq .Values.database.type "postgresql" }}pgsql{{- else if eq .Values.database.type "mongodb" }}mongodb{{- else }}mysql{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Laravel-specific DB env vars (DB_CONNECTION, DB_DATABASE, DB_USERNAME)
|
||||||
|
*/}}
|
||||||
|
{{- define "cloudhost-app.laravelDbEnv" -}}
|
||||||
|
- name: DB_CONNECTION
|
||||||
|
value: {{ include "cloudhost-app.laravelDbConnection" . | quote }}
|
||||||
|
- name: DB_DATABASE
|
||||||
|
value: {{ include "cloudhost-app.dbName" . }}
|
||||||
|
- name: DB_USERNAME
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "cloudhost-app.name" . }}-db-secret
|
||||||
|
key: username
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
App storage mount path based on runtime
|
App storage mount path based on runtime
|
||||||
*/}}
|
*/}}
|
||||||
|
|||||||
@@ -54,13 +54,7 @@ spec:
|
|||||||
- name: DATABASE_URL
|
- name: DATABASE_URL
|
||||||
value: "postgresql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:5432/{{ include "cloudhost-app.dbName" . }}"
|
value: "postgresql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:5432/{{ include "cloudhost-app.dbName" . }}"
|
||||||
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
||||||
- name: DB_DATABASE
|
{{ include "cloudhost-app.laravelDbEnv" . }}
|
||||||
value: {{ include "cloudhost-app.dbName" . }}
|
|
||||||
- name: DB_USERNAME
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: {{ $name }}-db-secret
|
|
||||||
key: username
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if and .Values.database.enabled (eq .Values.database.type "mysql") }}
|
{{- if and .Values.database.enabled (eq .Values.database.type "mysql") }}
|
||||||
@@ -83,13 +77,7 @@ spec:
|
|||||||
- name: DATABASE_URL
|
- name: DATABASE_URL
|
||||||
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
|
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
|
||||||
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
||||||
- name: DB_DATABASE
|
{{ include "cloudhost-app.laravelDbEnv" . }}
|
||||||
value: {{ include "cloudhost-app.dbName" . }}
|
|
||||||
- name: DB_USERNAME
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: {{ $name }}-db-secret
|
|
||||||
key: username
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if and .Values.database.enabled (eq .Values.database.type "mariadb") }}
|
{{- if and .Values.database.enabled (eq .Values.database.type "mariadb") }}
|
||||||
@@ -112,13 +100,7 @@ spec:
|
|||||||
- name: DATABASE_URL
|
- name: DATABASE_URL
|
||||||
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
|
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
|
||||||
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
||||||
- name: DB_DATABASE
|
{{ include "cloudhost-app.laravelDbEnv" . }}
|
||||||
value: {{ include "cloudhost-app.dbName" . }}
|
|
||||||
- name: DB_USERNAME
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: {{ $name }}-db-secret
|
|
||||||
key: username
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if and .Values.database.enabled (eq .Values.database.type "mongodb") }}
|
{{- if and .Values.database.enabled (eq .Values.database.type "mongodb") }}
|
||||||
@@ -143,13 +125,7 @@ spec:
|
|||||||
- name: DATABASE_URL
|
- name: DATABASE_URL
|
||||||
value: "mongodb://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:27017/{{ include "cloudhost-app.dbName" . }}?authSource=admin"
|
value: "mongodb://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:27017/{{ include "cloudhost-app.dbName" . }}?authSource=admin"
|
||||||
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
|
||||||
- name: DB_DATABASE
|
{{ include "cloudhost-app.laravelDbEnv" . }}
|
||||||
value: {{ include "cloudhost-app.dbName" . }}
|
|
||||||
- name: DB_USERNAME
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: {{ $name }}-db-secret
|
|
||||||
key: username
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- /* Redis connection env vars */}}
|
{{- /* Redis connection env vars */}}
|
||||||
|
|||||||
@@ -1009,7 +1009,7 @@ RUN composer dump-autoload --optimize --no-dev
|
|||||||
# --- Production stage ---
|
# --- Production stage ---
|
||||||
FROM php:${phpVersion}-fpm-alpine
|
FROM php:${phpVersion}-fpm-alpine
|
||||||
|
|
||||||
RUN apk add --no-cache nginx supervisor curl \\
|
RUN apk add --no-cache nginx supervisor curl openssl \\
|
||||||
&& docker-php-ext-install pdo pdo_mysql opcache \\
|
&& docker-php-ext-install pdo pdo_mysql opcache \\
|
||||||
&& docker-php-ext-install pdo_pgsql 2>/dev/null || true
|
&& docker-php-ext-install pdo_pgsql 2>/dev/null || true
|
||||||
|
|
||||||
@@ -1063,14 +1063,20 @@ RUN [ -f docker/supervisord.conf ] && cp docker/supervisord.conf /etc/supervisor
|
|||||||
# Ensure storage and cache directories exist and are writable
|
# Ensure storage and cache directories exist and are writable
|
||||||
RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache \\
|
RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache \\
|
||||||
&& chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
|
&& chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
|
||||||
RUN php artisan config:cache && php artisan route:cache && php artisan view:cache || true
|
|
||||||
RUN php artisan storage:link || true
|
|
||||||
|
|
||||||
RUN echo '#!/bin/sh' > /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
RUN echo '#!/bin/sh' > /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
echo 'set -e' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
echo 'set -e' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
echo 'cd /var/www/html' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
echo 'cd /var/www/html' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
echo 'mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
echo 'mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views storage/app/public bootstrap/cache' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
echo 'chown -R www-data:www-data storage' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
echo 'chown -R www-data:www-data storage bootstrap/cache' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'if [ -z "$APP_KEY" ] || [ "$APP_KEY" = "null" ]; then export APP_KEY="base64:$(openssl rand -base64 32)"; fi' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan config:clear || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan cache:clear || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan migrate --force --no-interaction || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan storage:link || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan config:cache || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan route:cache || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
|
echo 'php artisan view:cache || true' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
echo 'exec /usr/bin/supervisord -c /etc/supervisord.conf' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
echo 'exec /usr/bin/supervisord -c /etc/supervisord.conf' >> /usr/local/bin/cloudhost-laravel-entrypoint.sh && \\
|
||||||
chmod +x /usr/local/bin/cloudhost-laravel-entrypoint.sh
|
chmod +x /usr/local/bin/cloudhost-laravel-entrypoint.sh
|
||||||
|
|
||||||
|
|||||||
@@ -435,7 +435,14 @@ export class KubernetesService implements OnModuleInit {
|
|||||||
(ctx.runtime === AppRuntime.LARAVEL || ctx.runtime === AppRuntime.PHP) &&
|
(ctx.runtime === AppRuntime.LARAVEL || ctx.runtime === AppRuntime.PHP) &&
|
||||||
ctx.databaseType !== DatabaseType.NONE
|
ctx.databaseType !== DatabaseType.NONE
|
||||||
) {
|
) {
|
||||||
|
const dbConnection =
|
||||||
|
ctx.databaseType === DatabaseType.POSTGRESQL
|
||||||
|
? 'pgsql'
|
||||||
|
: ctx.databaseType === DatabaseType.MONGODB
|
||||||
|
? 'mongodb'
|
||||||
|
: 'mysql';
|
||||||
extraEnv.push(
|
extraEnv.push(
|
||||||
|
{ name: 'DB_CONNECTION', value: dbConnection },
|
||||||
{ name: 'DB_DATABASE', value: ctx.appName.replace(/-/g, '_') },
|
{ name: 'DB_DATABASE', value: ctx.appName.replace(/-/g, '_') },
|
||||||
{ name: 'DB_USERNAME', valueFrom: { secretKeyRef: { name: `${ctx.appName}-db-secret`, key: 'username' } } },
|
{ name: 'DB_USERNAME', valueFrom: { secretKeyRef: { name: `${ctx.appName}-db-secret`, key: 'username' } } },
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user