diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7476aa0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +*.md \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4a4e37e..cf417ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ FROM registry.s-web.fr/ldc-web/projets/ldc-web-images-docker/ldcweb-production-7.3:latest -COPY . /app/srcs -COPY ./public/build /app/srcs/public/build -COPY ./vendor /app/srcs/vendor \ No newline at end of file +COPY --chown=www-data:www-data . /app/srcs +USER root +RUN chmod -R 755 /app/srcs/storage +USER www-data \ No newline at end of file diff --git a/config/logging.php b/config/logging.php index 873bc0f..1e2fad7 100644 --- a/config/logging.php +++ b/config/logging.php @@ -113,6 +113,23 @@ return [ 'emergency' => [ 'path' => storage_path('logs/laravel.log'), ], + + 'stdout' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDOUT_FORMATTER'), + 'with' => [ + 'stream' => 'php://stdout', + ], + ], + + 'k8s' => [ + 'driver' => 'stack', + 'channels' => ['daily', 'stdout'], + 'ignore_exceptions' => false, + ], + ], ]; diff --git a/manifest.yaml b/manifest.yaml index 822ec89..43639b8 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -4,39 +4,32 @@ kind: ConfigMap metadata: name: ${CI_PROJECT_PATH_SLUG}-config-map data: - APP_NAME: "poc-oe-wdmr" - APP_ENV: "dev" - APP_KEY: "base64:Juxmv7LhkCAkxyhw/8J4dPdnTZbVJkyvRG8jIMxqBZA=" - APP_DEBUG: "true" - APP_URL: "" - ASSET_URL: "storage/" - LOG_CHANNEL: "stack" - LOG_DEPRECATIONS_CHANNEL: "null" - LOG_LEVEL: "debug" - DB_CONNECTION: "mysql" + APP_NAME: "${APP_APP_NAME}" + APP_ENV: "${APP_APP_ENV}" + APP_KEY: "${APP_APP_KEY}" + APP_DEBUG: "${APP_APP_DEBUG}" + APP_URL: "https://www.${APP_DOMAIN}" + LOG_CHANNEL: "k8s" DB_HOST: "mariadb-service.common-services" - DB_PORT: "3306" - DB_DATABASE: "poc-oe-wdmr" - DB_USERNAME: "poc-oe-wdmr" - DB_PASSWORD: "poc-oe-wdmr" - BROADCAST_DRIVER: "log" - CACHE_DRIVER: "file" - FILESYSTEM_DISK: "local" - QUEUE_CONNECTION: "sync" - SESSION_DRIVER: "file" - SESSION_LIFETIME: "120" - MAIL_MAILER: "smtp" - MAIL_HOST: "" - MAIL_PORT: "" - MAIL_USERNAME: "" - MAIL_PASSWORD: "" - MAIL_ENCRYPTION: "null" - MAIL_FROM_ADDRESS: "" - MAIL_FROM_NAME: "poc-oe-wdmr" - LDC_STATUS_CHECKER_API_KEY: "MY_KEY" - LDC_STATUS_CHECKER_UUID: "UUID_PROJECT" - LDC_WEB_API_KEY: "MY_KEY" - GOOGLE_MAPS_KEY: "" + DB_DATABASE: "${APP_DB_DATABASE}" + DB_USERNAME: "${APP_DB_USERNAME}" + DB_PASSWORD: "${APP_DB_PASSWORD}" + MAIL_HOST: "${APP_MAIL_HOST}" + MAIL_PORT: "${APP_MAIL_PORT}" + MAIL_USERNAME: "${APP_MAIL_USERNAME}" + MAIL_PASSWORD: "${APP_MAIL_PASSWORD}" + MAIL_ENCRYPTION: "${APP_MAIL_ENCRYPTION}" + MAIL_FROM_ADDRESS: "${APP_MAIL_FROM_ADDRESS}" + MAIL_FROM_NAME: "${APP_APP_NAME}" + MAIL_LIST_CONTACTFORM: "${APP_MAIL_LIST_CONTACTFORM}" + LDC_STATUS_CHECKER_API_KEY: "${APP_LDC_WEB_API_KEY}" + LDC_STATUS_CHECKER_UUID: "${APP_LDC_STATUS_CHECKER_UUID}" + LDC_WEB_API_KEY: "${APP_LDC_WEB_API_KEY}" + GOOGLE_RECAPTCHA_PRIVATE: "${APP_GOOGLE_RECAPTCHA_PRIVATE}" + GOOGLE_RECAPTCHA_PUBLIC: "${APP_GOOGLE_RECAPTCHA_PUBLIC}" + GOOGLE_RECAPTCHA_VERSION: "${APP_GOOGLE_RECAPTCHA_VERSION}" + SENTRY_LARAVEL_DSN: "${APP_SENTRY_LARAVEL_DSN}" + MATOMO_SITE_ID: "${APP_MATOMO_SITE_ID}" --- apiVersion: v1 @@ -49,7 +42,7 @@ spec: - ReadWriteOnce resources: requests: - storage: 1Gi + storage: $APP_PVC_SIZE --- apiVersion: apps/v1 @@ -74,9 +67,14 @@ spec: name: ${CI_PROJECT_PATH_SLUG}-config-map volumeMounts: - name: storage - mountPath: /app/srcs/storage/app/public + mountPath: /app/srcs/storage imagePullSecrets: - name: docker-registry-credentials + securityContext: + runAsUser: 33 + runAsGroup: 33 + fsGroup: 33 + fsGroupChangePolicy: "OnRootMismatch" volumes: - name: storage persistentVolumeClaim: @@ -93,7 +91,7 @@ spec: app: ${CI_PROJECT_PATH_SLUG}-app ports: - port: 80 - targetPort: 8080 + targetPort: 443 --- apiVersion: traefik.containo.us/v1alpha1 @@ -105,24 +103,77 @@ spec: - web - websecure routes: - - match: Host(`$DOMAIN`) + - match: Host(`${APP_DOMAIN}`, `www.${APP_DOMAIN}`) kind: Rule services: - name: ${CI_PROJECT_PATH_SLUG}-service port: 80 + middlewares: + - name: redirect-no-www-to-www + namespace: common-services tls: - secretName: $DOMAIN + secretName: $APP_DOMAIN --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: - name: $DOMAIN + name: $APP_DOMAIN spec: dnsNames: - - $DOMAIN - secretName: $DOMAIN + - $APP_DOMAIN + - www.${APP_DOMAIN} + secretName: $APP_DOMAIN issuerRef: - name: letsencrypt-staging-dns01 + name: $APP_CERT_ISSUER kind: ClusterIssuer +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: ${CI_PROJECT_PATH_SLUG}-cronjob +spec: + schedule: "* * * * *" + jobTemplate: + spec: + template: + spec: + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - ${CI_PROJECT_PATH_SLUG}-app + topologyKey: "kubernetes.io/hostname" + namespaces: [$KUBE_NAMESPACE] + containers: + - name: ${CI_PROJECT_PATH_SLUG}-scheduled + image: $IMAGE_TAG + imagePullPolicy: Always + command: + - "php" + args: + - "artisan" + - "schedule:run" + envFrom: + - configMapRef: + name: ${CI_PROJECT_PATH_SLUG}-config-map + volumeMounts: + - name: storage + mountPath: /app/srcs/storage + imagePullSecrets: + - name: docker-registry-credentials + volumes: + - name: storage + persistentVolumeClaim: + claimName: ${CI_PROJECT_PATH_SLUG}-pvc-storage + securityContext: + runAsUser: 33 + runAsGroup: 33 + fsGroup: 33 + fsGroupChangePolicy: "OnRootMismatch" + restartPolicy: OnFailure