Compare commits

...

43 Commits

Author SHA1 Message Date
David Bomba
24ef742ce1 Update README.md 2022-10-02 20:41:25 +11:00
David Bomba
886dfe7832 Update README.md 2022-10-02 20:41:04 +11:00
David Bomba
4b82f750fc Update docker-compose.yml 2022-07-25 08:58:43 +10:00
David Bomba
97d339df4e Update Dockerfile 2022-07-25 08:58:19 +10:00
David Bomba
906cfb0c87 Merge pull request #453 from Psycho0verload/master
[BUGFIX] Error building the mysql backup build
2022-07-22 20:15:03 +10:00
Jonathan Starck
62a7f6d7cf [BUGFIX] TRUSTED_PROXIES is not in env
Bugfix for Issue #454
2022-07-22 12:08:42 +02:00
Jonathan Starck
1d97234b51 Change MYSQL5 to MYSQL5-Debian so that build works for the backup cronjob 2022-07-20 18:06:34 +02:00
David Bomba
aab280dcc1 Prep container for PHP 8.1 (#450) 2022-07-20 23:32:52 +08:00
David Bomba
25b3654a53 Merge pull request #437 from sleeyax/master
Bump helm version to 5.3.80
2022-04-20 11:26:52 +09:30
Sleeyax
46cd35bf32 Bump chart version 2022-04-20 02:20:39 +02:00
Sleeyax
53b4e6dafd Bump helm version to 5.3.80 2022-04-20 02:07:00 +02:00
David Bomba
27b6c82fe4 Merge pull request #428 from VeselaHouba/master
Revert #419 (email and password escaping)
2022-01-14 09:35:30 +11:00
Michalek
64fdd58ba9 Revert #419 (email and password escaping) 2022-01-13 23:31:21 +01:00
Ffaen
85519a0038 Bump helm version to 5.3.39 (#420) 2021-12-26 08:22:10 +08:00
Ffaen
5d5f34b7e7 Escape email and password upon IN User Creation (#419)
Fixes #415
2021-12-26 08:19:35 +08:00
David Bomba
774b8cb6eb Update Dockerfile 2021-12-12 18:55:12 +11:00
David Bomba
76a0886278 Update Dockerfile 2021-12-10 17:24:41 +11:00
Ffaen
2bac5707ae Bump helm version to 5.3.29 (#406)
* Bump helm version to 5.3.29

Closes #405

* Update charts/invoiceninja/Chart.yaml
2021-11-08 09:45:25 +08:00
Fabian
c17e37c4b8 Fix: mysqladmin ping timeout from 12 hours to 15 seconds (#392)
* Update deployment.yaml

Changed init-container "wait-db" for waiting 15 seconds instead of 12 hours (default) in case of a timeout

* Update Chart.yaml
2021-08-22 20:45:21 +08:00
Ween Jiann
08f9493f0d Release Candidate and change PDF generation key (#386)
* Fix PDF generation

* Default to internal Nginx

* Set Redis replica to 1

* Fix readme

* Updated dependency
2021-07-16 10:04:47 +08:00
David Bomba
40f483a32d Update README.md 2021-07-14 17:23:40 +10:00
David Bomba
eb58c26ebf Update env 2021-07-12 21:01:48 +10:00
Ween Jiann
d50bfde676 Remove storage persistence (#383) 2021-07-10 11:25:40 +08:00
Ween Jiann
c12e985f81 Refactor Github workflow files (#382)
* Refactor

* Add sha

* Add missing dash
2021-07-10 11:20:09 +08:00
Ween Jiann
8ef0df3d41 Check init via tinker (#381) 2021-07-10 02:43:43 +08:00
Ween Jiann
f55e9a2b49 Temporarily re-enable storage persistence (#380)
* Temporarily re-enable storage persistence

* Bump version
2021-07-10 01:04:30 +08:00
Ween Jiann
e3f47d2932 Add appURL override to chart (#379)
* Add appURL override

* Bump version
2021-07-10 00:42:44 +08:00
Ween Jiann
1636faf40d Add access modes to PVC in chart (#378)
* Add accessmodes

* Bump chart version
2021-07-09 22:23:18 +08:00
Ween Jiann
ea285c41ec Add Nginx to IN pod in chart (#377)
* Add inline-nginx

* Bump chart version

* Fix missing s in key

* Update lock file

* Add ingress
2021-07-09 20:48:21 +08:00
Ween Jiann
1537b87a3d Default persistence for storage to false in chart (#376)
* Default storage persistence to false

* Bump chart version

* Updated README.md
2021-07-09 16:37:56 +08:00
Ween Jiann
225c0eb275 Allow use of existing secret in chart (#375)
* Added existingSecrets

* Bump chart version
2021-07-09 11:42:15 +08:00
Ween Jiann
34878d0f93 Extend liveness probe delay to prevent first migration failure (#374)
* Change liveness probe type

* Change liveness probe values

* Bump chart version
2021-07-09 11:16:24 +08:00
Ween Jiann
8b9e69d51b Updated Redis chart dependencies (#372)
* Updated chart dependencies

* Change redis password flag
2021-07-08 02:11:39 +08:00
Ween Jiann
7238e521e6 Automatically set values for Nginx sub-chart based on install name (#370)
* Automatically set serverblock from IN chart

* Automatically set nginx PVC

* Bump chart version

* Upgrade dependencies

* Updated k8s test versions
2021-07-07 04:19:03 +08:00
Ween Jiann
5a1bf5c430 Refactor dockerfile for caching (#371)
* Improve caching

* Updated publish-image workflow
2021-07-06 17:11:08 +08:00
Ween Jiann
7a935a0eef Add caching to build (#369)
* Rename publish workflow

* Add caching to v5

* Updated cache buster
2021-07-02 21:42:18 +08:00
Ween Jiann
ff897d568f Change php-alpine from latest to 3.13 (#367) 2021-06-27 18:00:41 +08:00
David Bomba
b0bb0ffd25 Merge pull request #366 from turbo124/master
Rollback php-installer tags
2021-06-27 15:57:54 +10:00
David Bomba
3902b40bc1 remove tags 2021-06-27 15:55:52 +10:00
David Bomba
29e2d93e59 Merge pull request #365 from turbo124/master
Download php-installer
2021-06-27 15:21:28 +10:00
David Bomba
b7aea66e62 Download php-installer 2021-06-27 15:17:43 +10:00
David Bomba
e2db08f207 Update env
Set QUEUE_CONNECTION=database as default
2021-06-07 08:01:09 +10:00
Ffaen
59291d8687 Set trusted proxy value to allow invoiceninja to read nginx headers (#356)
Fixes #355
2021-05-27 00:32:56 +08:00
26 changed files with 926 additions and 226 deletions

View File

@@ -3,4 +3,4 @@ chart-dirs:
chart-repos: chart-repos:
- bitnami=https://charts.bitnami.com/bitnami - bitnami=https://charts.bitnami.com/bitnami
check-version-increment: true check-version-increment: true
debug: true debug: false

57
.github/workflows/build-image-v4.yaml vendored Normal file
View File

@@ -0,0 +1,57 @@
name: Build Container Image v4
# When its time to do a release do a full cross platform build for all supported
# architectures and push all of them to Docker Hub.
# Only trigger on semver shaped tags.
# Ref: https://github.com/metcalfc/docker-action-examples/blob/main/.github/workflows/release.yml
on:
pull_request:
paths:
- "alpine/4/**"
push:
paths:
- "alpine/4/**"
branches:
- master
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
with:
platforms: all
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-4-${{ hashFiles('alpine/5/cache_buster') }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-4-${{ hashFiles('alpine/5/cache_buster') }}-
- name: Build
id: docker_build
uses: docker/build-push-action@v2
with:
builder: ${{ steps.buildx.outputs.name }}
context: ./alpine/4/
build-args: INVOICENINJA_VERSION=4.5.42
target: prod
platforms: linux/amd64,linux/arm64
tags: invoiceninja/invoiceninja:cache
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache

57
.github/workflows/build-image-v5.yaml vendored Normal file
View File

@@ -0,0 +1,57 @@
name: Build Container Image
# When its time to do a release do a full cross platform build for all supported
# architectures and push all of them to Docker Hub.
# Only trigger on semver shaped tags.
# Ref: https://github.com/metcalfc/docker-action-examples/blob/main/.github/workflows/release.yml
on:
pull_request:
paths:
- "alpine/5/**"
push:
paths:
- "alpine/5/**"
branches:
- master
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
with:
platforms: all
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-5-${{ hashFiles('alpine/5/cache_buster') }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-5-${{ hashFiles('alpine/5/cache_buster') }}-
- name: Build
id: docker_build
uses: docker/build-push-action@v2
with:
builder: ${{ steps.buildx.outputs.name }}
context: ./alpine/5/
build-args: INVOICENINJA_VERSION=5-stable
target: prod
platforms: linux/amd64,linux/arm64
tags: invoiceninja/invoiceninja:cache
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache

View File

@@ -1,4 +1,4 @@
name: Publish Releases to Hub name: Publish Container Image
# When its time to do a release do a full cross platform build for all supported # When its time to do a release do a full cross platform build for all supported
# architectures and push all of them to Docker Hub. # architectures and push all of them to Docker Hub.
@@ -44,13 +44,13 @@ jobs:
id: buildx id: buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v1
# - name: Cache Docker layers - name: Cache Docker layers
# uses: actions/cache@v2 uses: actions/cache@v2
# with: with:
# path: /tmp/.buildx-cache path: /tmp/.buildx-cache
# key: ${{ runner.os }}-buildx-${{ github.sha }} key: ${{ runner.os }}-buildx-${{ steps.prep.outputs.major }}-${{ hashFiles('alpine/${{ steps.prep.outputs.major }}/cache_buster') }}-${{ github.sha }}
# restore-keys: | restore-keys: |
# ${{ runner.os }}-buildx- ${{ runner.os }}-buildx-${{ steps.prep.outputs.major }}-${{ hashFiles('alpine/${{ steps.prep.outputs.major }}/cache_buster') }}-
- name: Login to DockerHub - name: Login to DockerHub
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
@@ -70,8 +70,13 @@ jobs:
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.prep.outputs.tags }} tags: ${{ steps.prep.outputs.tags }}
cache-from: invoiceninja/invoiceninja:${{ steps.prep.outputs.major }} cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=inline cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
- name: Image digest - name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }} run: echo ${{ steps.docker_build.outputs.digest }}

View File

@@ -13,9 +13,8 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
with:
- name: Fetch history fetch-depth: 0
run: git fetch --prune --unshallow
- name: Set up Helm - name: Set up Helm
uses: azure/setup-helm@v1 uses: azure/setup-helm@v1
@@ -41,6 +40,7 @@ jobs:
- name: Run chart-testing (lint) - name: Run chart-testing (lint)
run: ct lint --config .github/ct-lint.yaml run: ct lint --config .github/ct-lint.yaml
kubeval-chart: kubeval-chart:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: needs:
@@ -49,9 +49,9 @@ jobs:
matrix: matrix:
chart: ${{ fromJson(needs.lint-chart.outputs.matrix) }} chart: ${{ fromJson(needs.lint-chart.outputs.matrix) }}
k8s: k8s:
- v1.17.11 - v1.19.11
- v1.18.8 - v1.20.7
- v1.19.4 - v1.21.2
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v1 uses: actions/checkout@v1
@@ -79,20 +79,26 @@ jobs:
strategy: strategy:
matrix: matrix:
k8s: k8s:
- v1.17.11 - v1.19.11
- v1.18.8 - v1.20.7
- v1.19.4 - v1.21.2
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Create kind ${{ matrix.k8s }} cluster - name: Create kind ${{ matrix.k8s }} cluster
uses: helm/kind-action@v1.1.0 uses: helm/kind-action@v1.2.0
with: with:
node_image: kindest/node:${{ matrix.k8s }} node_image: kindest/node:${{ matrix.k8s }}
- name: Run chart-testing (install) - uses: actions/setup-python@v2
uses: helm/chart-testing-action@v2.0.1
with: with:
command: install python-version: 3.7
config: .github/ct-install.yaml
- name: Set up chart-testing
uses: helm/chart-testing-action@v2.0.1
- name: Run chart-testing (install)
run: ct install --config .github/ct-install.yaml

View File

@@ -2,7 +2,7 @@
[![Docker image, latest](https://img.shields.io/docker/image-size/invoiceninja/invoiceninja/latest?label=latest)](https://hub.docker.com/r/invoiceninja/invoiceninja) [![Docker image, latest](https://img.shields.io/docker/image-size/invoiceninja/invoiceninja/latest?label=latest)](https://hub.docker.com/r/invoiceninja/invoiceninja)
[![Docker image, alpine](https://img.shields.io/docker/image-size/invoiceninja/invoiceninja/alpine?label=alpine)](https://hub.docker.com/r/invoiceninja/invoiceninja) [![Docker image, alpine](https://img.shields.io/docker/image-size/invoiceninja/invoiceninja/alpine?label=alpine)](https://hub.docker.com/r/invoiceninja/invoiceninja)
[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/invoiceninja)](https://artifacthub.io/packages/search?repo=invoiceninja) [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/invoiceninja)](https://artifacthub.io/packages/search?repo=invoiceninja)
[![Pusblish Image](https://github.com/invoiceninja/dockerfiles/actions/workflows/publish-image.yaml/badge.svg)](https://github.com/invoiceninja/dockerfiles/actions/workflows/publish-image.yaml) [![Cache v5 Image](https://github.com/invoiceninja/dockerfiles/actions/workflows/build-image-v5.yaml/badge.svg)](https://github.com/invoiceninja/dockerfiles/actions/workflows/build-image-v5.yaml)
# Docker for [Invoice Ninja](https://www.invoiceninja.com/) # Docker for [Invoice Ninja](https://www.invoiceninja.com/)
@@ -20,7 +20,8 @@ Introducing our very own [Helm Chart](https://github.com/invoiceninja/dockerfile
Other resources: Other resources:
[Helm Chart](https://github.com/Saddamus/invoiceninja-helm) by @Saddamus [Helm Chart](https://github.com/Saddamus/invoiceninja-helm) by @Saddamus
[K8s Manifest](https://github.com/invoiceninja/dockerfiles/issues/94) by @spacepluk [K8s Manifest](https://github.com/invoiceninja/dockerfiles/issues/94) by @spacepluk
[You Tube installation video by DBTech](https://www.youtube.com/watch?v=xo6a3KtLC2g&ab_channel=DBTech)
## Alternatively get started with Docker Compose ## Alternatively get started with Docker Compose
@@ -96,6 +97,10 @@ git pull
You may need to manually merge any changes that cannot be merged automatically by git. You may need to manually merge any changes that cannot be merged automatically by git.
### Thanks
Massive thank you to [lwj5](https://github.com/lwj5) for the tireless work to continually improve the dockerfile and its associated tooling.
## Support ## Support
If you discover a bug, please create and issue, if you query is general in nature please visit us on our [Forum ](https://forum.invoiceninja.com/) If you discover a bug, please create and issue, if you query is general in nature please visit us on our [Forum ](https://forum.invoiceninja.com/)

View File

@@ -1,4 +1,4 @@
ARG PHP_VERSION=7.2 ARG PHP_VERSION=7.3
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/ ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/ ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
@@ -70,4 +70,4 @@ ENV SELF_UPDATER_SOURCE ''
VOLUME /var/www/app/public VOLUME /var/www/app/public
ENTRYPOINT ["docker-entrypoint"] ENTRYPOINT ["docker-entrypoint"]
CMD ["php-fpm"] CMD ["php-fpm"]

1
alpine/4/cache_buster Normal file
View File

@@ -0,0 +1 @@
Fri Jul 2 7:33:22 +00 2021

View File

@@ -1,14 +1,12 @@
ARG PHP_VERSION=7.4 ARG PHP_VERSION=8.1
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/ ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/ ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
# Get Invoice Ninja and install nodejs packages # Get Invoice Ninja and install nodejs packages
FROM --platform=$BUILDPLATFORM node:lts-alpine as build FROM --platform=$BUILDPLATFORM node:lts-alpine as build
ARG INVOICENINJA_VERSION
ARG BAK_STORAGE_PATH
ARG BAK_PUBLIC_PATH
# Download Invoice Ninja # Download Invoice Ninja
ARG INVOICENINJA_VERSION
ADD https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION /tmp/ninja.tar.gz ADD https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION /tmp/ninja.tar.gz
# Extract Invoice Ninja # Extract Invoice Ninja
@@ -21,17 +19,16 @@ RUN mkdir -p /var/www/app \
WORKDIR /var/www/app/ WORKDIR /var/www/app/
# Install node packages # Install node packages
RUN npm install --production \ ARG BAK_STORAGE_PATH
ARG BAK_PUBLIC_PATH
RUN --mount=target=/var/www/app/node_modules,type=cache \
npm install --production \
&& npm run production \ && npm run production \
&& rm -rf node_modules \
&& mv /var/www/app/storage $BAK_STORAGE_PATH \ && mv /var/www/app/storage $BAK_STORAGE_PATH \
&& mv /var/www/app/public $BAK_PUBLIC_PATH && mv /var/www/app/public $BAK_PUBLIC_PATH
# Prepare php image # Prepare php image
FROM php:${PHP_VERSION}-fpm-alpine as prod FROM php:${PHP_VERSION}-fpm-alpine3.15 as prod
ARG INVOICENINJA_VERSION
ARG BAK_STORAGE_PATH
ARG BAK_PUBLIC_PATH
LABEL maintainer="David Bomba <turbo124@gmail.com>" LABEL maintainer="David Bomba <turbo124@gmail.com>"
@@ -78,6 +75,9 @@ RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \
"$INVOICENINJA_USER" "$INVOICENINJA_USER"
# Set up app # Set up app
ARG INVOICENINJA_VERSION
ARG BAK_STORAGE_PATH
ARG BAK_PUBLIC_PATH
ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION
ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH
ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH
@@ -88,8 +88,7 @@ WORKDIR /var/www/app
# Do not remove this ENV # Do not remove this ENV
ENV IS_DOCKER true ENV IS_DOCKER true
RUN /usr/local/bin/composer install --no-dev --quiet \ RUN /usr/local/bin/composer install --no-dev --quiet
&& rm .env
# Override the environment settings from projects .env file # Override the environment settings from projects .env file
ENV APP_ENV production ENV APP_ENV production

1
alpine/5/cache_buster Normal file
View File

@@ -0,0 +1 @@
Fri Jul 2 7:33:22 +00 2021

View File

@@ -65,11 +65,6 @@ if [ -d "$BAK_STORAGE_PATH" ]; then
rm -rf "$BAK_STORAGE_PATH" rm -rf "$BAK_STORAGE_PATH"
fi fi
# prevent init scripts from running when upgrading from IN <= 5.1.62
if [ -f /var/www/app/public/version ] && [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then
touch /var/www/app/storage/.initialized
fi
# create public volume # create public volume
if [ -d "$BAK_PUBLIC_PATH" ]; then if [ -d "$BAK_PUBLIC_PATH" ]; then
if [ ! -d /var/www/app/public ]; then if [ ! -d /var/www/app/public ]; then

View File

@@ -38,7 +38,7 @@ fi
php artisan migrate --force php artisan migrate --force
# If first IN run, it needs to be initialized # If first IN run, it needs to be initialized
if [ ! -f /var/www/app/storage/.initialized ]; then IN_INIT=$(php artisan tinker --execute='echo Schema::hasTable("accounts") && !App\Models\Account::all()->first();')
if [ "$IN_INIT" == "1" ]; then
docker_process_init_files /docker-entrypoint-init.d/* docker_process_init_files /docker-entrypoint-init.d/*
touch /var/www/app/storage/.initialized
fi fi

View File

@@ -1,15 +1,15 @@
dependencies: dependencies:
- name: common - name: common
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 1.4.3 version: 1.7.0
- name: nginx - name: nginx
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 8.8.5 version: 9.3.7
- name: mariadb - name: mariadb
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 9.3.11 version: 9.3.17
- name: redis - name: redis
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 12.9.2 version: 14.7.1
digest: sha256:4255a558312b033e820635f491b0960bd4ec8e716164025212af06adafbd4cb9 digest: sha256:495d7cedf5284501249705101853f33d1bb479b35ce11a518631682cdb38c15f
generated: "2021-05-11T09:31:45.433+08:00" generated: "2021-07-16T00:53:22.586326+08:00"

View File

@@ -13,11 +13,11 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.5.0 version: 0.9.2
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 5.1.64 appVersion: 5.3.80
keywords: keywords:
- invoiceninja - invoiceninja
home: https://invoiceninja.github.io/dockerfiles home: https://invoiceninja.github.io/dockerfiles
@@ -30,9 +30,10 @@ dependencies:
tags: tags:
- bitnami-common - bitnami-common
version: 1.x.x version: 1.x.x
- name: nginx - condition: nginx.enabled
name: nginx
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 8.8.x version: 9.x.x
- condition: mariadb.enabled - condition: mariadb.enabled
name: mariadb name: mariadb
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
@@ -40,7 +41,7 @@ dependencies:
- condition: redis.enabled - condition: redis.enabled
name: redis name: redis
repository: https://charts.bitnami.com/bitnami repository: https://charts.bitnami.com/bitnami
version: 12.9.x version: 14.x.x
maintainers: maintainers:
- email: lwj5@hotmail.com - email: lwj5@hotmail.com
name: lwj5 name: lwj5

View File

@@ -13,7 +13,7 @@ Please read [Upgrading](#upgrading) section before upgrading MAJOR versions.
- The Bitnami [mariadb](https://github.com/bitnami/charts/tree/master/bitnami/mariadb) helm chart - The Bitnami [mariadb](https://github.com/bitnami/charts/tree/master/bitnami/mariadb) helm chart
- The Bitnami [nginx](https://github.com/bitnami/charts/tree/master/bitnami/nginx) helm chart - The Bitnami [nginx](https://github.com/bitnami/charts/tree/master/bitnami/nginx) helm chart
- The Bitnami [redis](https://github.com/bitnami/charts/tree/master/bitnami/redis) helm chart - The Bitnami [redis](https://github.com/bitnami/charts/tree/master/bitnami/redis) helm chart
- Tested on Kubernetes 1.17+ - Tested on Kubernetes 1.19+
## Installing the Chart ## Installing the Chart
@@ -21,7 +21,7 @@ To install the chart with the release name `invoiceninja`:
```bash ```bash
helm repo add invoiceninja https://invoiceninja.github.io/dockerfiles helm repo add invoiceninja https://invoiceninja.github.io/dockerfiles
helm install invoiceninja invoiceninja/invoiceninja helm install invoiceninja invoiceninja/invoiceninja --set appKey=changeit --set mariadb.auth.rootPassword=changeit --set mariadb.auth.password=changeit --set redis.auth.password=changeit
``` ```
The command deploys Invoice Ninja on the Kubernetes cluster in the default namespace. The [Parameters](#parameters) section lists the parameters that can be configured during installation. The command deploys Invoice Ninja on the Kubernetes cluster in the default namespace. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
@@ -68,44 +68,68 @@ The following table shows the configuration options for the Invoice Ninja helm c
| `kubeVersion` | Force target Kubernetes version (using Helm capabilities if not set) | `nil` | | `kubeVersion` | Force target Kubernetes version (using Helm capabilities if not set) | `nil` |
| `extraDeploy` | Array of extra objects to deploy with the release | `[]` (evaluated as a template) | | `extraDeploy` | Array of extra objects to deploy with the release | `[]` (evaluated as a template) |
### Invoice Ninja parameters ### Invoice Ninja container parameters
| Parameter | Description | Default | | Parameter | Description | Default |
| -------------------- | ---------------------------------------------------------------- | ------------------------------------------------------- | | ------------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------- |
| `image.registry` | Invoice Ninja image registry | `docker.io` | | `image.registry` | Invoice Ninja image registry | `docker.io` |
| `image.repository` | Invoice Ninja image name | `invoiceninja/invoiceninja` | | `image.repository` | Invoice Ninja image name | `invoiceninja/invoiceninja` |
| `image.tag` | Invoice Ninja image tag | Check `values.yaml` file | | `image.tag` | Invoice Ninja image tag | Check `values.yaml` file |
| `image.pullPolicy` | Invoice Ninja image pull policy | `IfNotPresent` | | `image.pullPolicy` | Invoice Ninja image pull policy | `IfNotPresent` |
| `image.pullSecrets` | Specify docker-registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) | | `image.pullSecrets` | Specify docker-registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |
| `image.debug` | Specify if debug logs should be enabled | `false` | | `image.debug` | Specify if debug logs should be enabled | `false` |
| `serviceAccountName` | Name of a service account for the Invoice Ninja pods | `default` | | `debug` | Turn on debug mode on Invoice Ninja | `false` |
| `debug` | Turn on debug mode on Invoice Ninja | `false` | | `appKey` | Laravel Application Key (ignored if existing secret is provided) | _random 32 character alphanumeric string_ |
| `appKey` | Laravel Application Key | _random 32 character alphanumeric string_ | | `appURL` | Override Laravel Application URL (automatically set if blank) | `""` |
| `userEmail` | Initial user email address | `admin@example.com` | | `userEmail` | Initial user email address | `admin@example.com` |
| `userPassword` | Initial user password | `changeme!` | | `userPassword` | Initial user password (ignored if existing secret is provided) | `changeme!` |
| `logChannel` | Name of log channel to use | `nil` | | `logChannel` | Name of log channel to use | `nil` |
| `broadcastDriver` | Name of broadcast driver to use | `nil` | | `broadcastDriver` | Name of broadcast driver to use | `nil` |
| `cacheDriver` | Name of cache driver to use | `nil` | | `cacheDriver` | Name of cache driver to use | `nil` |
| `sessionDriver` | Name of session driver to use | `nil` | | `sessionDriver` | Name of session driver to use | `nil` |
| `queueConnection` | Name of queue connection to use | `nil` | | `queueConnection` | Name of queue connection to use | `nil` |
| `snappdf` | Use snappdf instead of Phantom JS PDF generation | `true` | | `pdfGenerator` | PDF generation method (Allowed values: `snappdf` or `phantom`) | `snappdf` |
| `mailer` | Name of the mailer to use (log, smtp, etc.) | `log` | | `mailer` | Name of the mailer to use (log, smtp, etc.) | `log` |
| `requireHttps` | Force HTTPS for internal connections to Invoice Ninja (see #349) | `false` | | `requireHttps` | Force HTTPS for internal connections to Invoice Ninja (see #349) | `false` |
| `extraEnvVars` | Extra environment variables to be set on Invoice Ninja container | `{}` | | `existingSecret` | Use existing secret that contain the keys `APP_KEY` and `IN_PASSWORD` | `nil` |
| `extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars | `nil` | | `extraEnvVars` | Extra environment variables to be set on Invoice Ninja container | `{}` |
| `extraEnvVarsSecret` | Name of existing Secret containing extra env vars | `nil` | | `extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars | `nil` |
| `extraEnvVarsSecret` | Name of existing Secret containing extra env vars | `nil` |
| `trustedProxy` | List of trusted proxies for Invoice Ninja to communicate with the nginx proxy | `'*'` |
| `extraVolumeMounts` | Additional volume mounts | `[]` |
| `resources` | The resources for the Invoice Ninja container | `{}` |
| `livenessProbe` | Liveness probe configuration for Invoice Ninja | Check `values.yaml` file |
| `readinessProbe` | Readiness probe configuration for Invoice Ninja | Check `values.yaml` file |
| `containerPorts.fastcgi` | FastCGI port to expose at container level | `9000` |
### Inline web server container parameters (only used when `nginx.enabled` is **not** set to true)
| Parameter | Description | Default |
| ------------------------ | -------------------------------------------------------- | ------------------------------------------------------- |
| `http.image.registry` | Nginx image registry | `docker.io` |
| `http.image.repository` | Nginx image name | `invoiceninja/invoiceninja` |
| `http.image.tag` | Nginx image tag | Check `values.yaml` file |
| `http.image.pullPolicy` | Nginx image pull policy | `IfNotPresent` |
| `http.image.pullSecrets` | Specify docker-registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |
| `http.image.debug` | Specify if debug logs should be enabled | `false` |
| `extraEnvVars` | Extra environment variables to be set on Nginx container | `{}` |
| `extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars | `nil` |
| `extraEnvVarsSecret` | Name of existing Secret containing extra env vars | `nil` |
| `extraVolumeMounts` | Additional volume mounts | `[]` |
| `resources` | The resources for the Nginx container | `{}` |
| `livenessProbe` | Liveness probe configuration for Nginx | Check `values.yaml` file |
| `readinessProbe` | Readiness probe configuration for Nginx | Check `values.yaml` file |
| `containerPorts.http` | HTTP port to expose at container level | `9000` |
| `containerPorts.https` | HTTPS port to expose at container level | `9000` |
### Invoice Ninja deployment parameters ### Invoice Ninja deployment parameters
| Parameter | Description | Default | | Parameter | Description | Default |
| --------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------ | | --------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------ |
| `replicaCount` | Number of Invoice Ninja Pods to run | `1` | | `replicaCount` | Number of Invoice Ninja Pods to run | `1` |
| `containerPorts.fastcgi` | FastCGI port to expose at container level | `9000` | | `serviceAccountName` | Name of a service account for the Invoice Ninja pods | `default` |
| `podSecurityContext` | Invoice Ninja pods' Security Context | Check `values.yaml` file |
| `containerSecurityContext` | Invoice Ninja containers' Security Context | Check `values.yaml` file | | `containerSecurityContext` | Invoice Ninja containers' Security Context | Check `values.yaml` file |
| `resources` | The resources for the Invoice Ninja container | `{}` | | `podSecurityContext` | Invoice Ninja pods' Security Context | Check `values.yaml` file |
| `livenessProbe` | Liveness probe configuration for Invoice Ninja | Check `values.yaml` file |
| `readinessProbe` | Readiness probe configuration for Invoice Ninja | Check `values.yaml` file |
| `updateStrategy` | Set up update strategy | `RollingUpdate` | | `updateStrategy` | Set up update strategy | `RollingUpdate` |
| `podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `soft` | | `podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `soft` |
| `nodeAffinityPreset.type` | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` | | `nodeAffinityPreset.type` | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` |
@@ -116,7 +140,6 @@ The following table shows the configuration options for the Invoice Ninja helm c
| `tolerations` | Tolerations for pod assignment | `[]` (evaluated as a template) | | `tolerations` | Tolerations for pod assignment | `[]` (evaluated as a template) |
| `podLabels` | Extra labels for Invoice Ninja pods | `{}` | | `podLabels` | Extra labels for Invoice Ninja pods | `{}` |
| `podAnnotations` | Annotations for Invoice Ninja pods | `{}` | | `podAnnotations` | Annotations for Invoice Ninja pods | `{}` |
| `extraVolumeMounts` | Additional volume mounts | `[]` |
| `extraVolumes` | Additional volumes | `[]` | | `extraVolumes` | Additional volumes | `[]` |
### Volume Permissions parameters ### Volume Permissions parameters
@@ -133,6 +156,8 @@ The following table shows the configuration options for the Invoice Ninja helm c
### Exposure parameters ### Exposure parameters
#### FastCGI
| Parameter | Description | Default | | Parameter | Description | Default |
| ---------------------------------- | -------------------------------------------------------------------------- | ------------------------------ | | ---------------------------------- | -------------------------------------------------------------------------- | ------------------------------ |
| `service.type` | Kubernetes Service type | `ClusterIP` | | `service.type` | Kubernetes Service type | `ClusterIP` |
@@ -144,45 +169,84 @@ The following table shows the configuration options for the Invoice Ninja helm c
| `service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | | `service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` |
| `service.annotations` | Service annotations | `{}` (evaluated as a template) | | `service.annotations` | Service annotations | `{}` (evaluated as a template) |
#### Inline web server (only used when `nginx.enabled` is **not** set to true)
| Parameter | Description | Default |
| --------------------------------------- | -------------------------------------------------------------------------- | ------------------------------ |
| `service.http.type` | Kubernetes Service type | `ClusterIP` |
| `service.http.ports.http` | Service HTTP port | `9000` |
| `service.http.ports.https` | Service HTTPS port | `9000` |
| `service.http.nodePorts.http` | Kubernetes HTTP node port | `""` |
| `service.http.nodePorts.https` | Kubernetes HTTPS node port | `""` |
| `service.http.clusterIP` | Invoice Ninja service clusterIP IP | `None` |
| `service.http.loadBalancerSourceRanges` | Restricts access for LoadBalancer (only with `service.type: LoadBalancer`) | `[]` |
| `service.http.loadBalancerIP` | loadBalancerIP if service type is `LoadBalancer` | `nil` |
| `service.http.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` |
| `service.http.annotations` | Service annotations | `{}` (evaluated as a template) |
### Ingress parameters ### Ingress parameters
| Parameter | Description | Default | #### Inline web server (only used when `nginx.enabled` is **not** set to true)
| ------------------------------------------------------- | ------------------------------------- | ------------------------ |
| `nginx.service.type` | Kubernetes Service type | `ClusterIP` | | Parameter | Description | Default |
| `nginx.ingress.enabled` | Enable ingress controller resource | `true` | | -------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------ |
| `nginx.ingress.hostname` | Default host for the ingress resource | `invoiceninja.local` | | `ingress.enabled` | Enable ingress | `true` |
| `nginx.serverBlock` | Custom NGINX server block | `nil` | | `ingress.certManager` | Add the corresponding annotations for cert-manager integration | `false` |
| `nginx.extraVolumes` | Array to add extra volumes | Check `values.yaml` file | | `ingress.pathType` | Ingress path type | `ImplementationSpecific` |
| `nginx.extraVolumes[0].persistentVolumeClaim.claimName` | Name of Invoice Ninja public PVC | `invoiceninja-public` | | `ingress.apiVersion` | Force Ingress API version (automatically detected if not set) | `nil` |
| `nginx.extraVolumeMounts` | Array to add extra mount | Check `values.yaml` file | | `ingress.ingressClassName` | IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) | `nil` |
| `ingress.hostname` | Default host for the ingress record | `invoiceninja.local` |
| `ingress.path` | Default path for the ingress record | `/` |
| `ingress.annotations` | Additional custom annotations for the ingress record | `{}` |
| `ingress.tls` | Enable TLS configuration for the host defined at `ingress.hostname` parameter | `false` |
| `ingress.extraHosts` | An array with additional hostname(s) to be covered with the ingress record | `[]` |
| `ingress.extraPaths` | An array with additional arbitrary paths that may need to be added to the ingress under the main host | `[]` |
| `ingress.extraTls` | TLS configuration for additional hostname(s) to be covered with this ingress record | `[]` |
| `ingress.secrets` | Custom TLS certificates as secrets | `[]` |
#### Nginx sub-chart
| Parameter | Description | Default |
| ------------------------------------ | ------------------------------------- | ------------------------------------------------------ |
| `nginx.enabled` | Deploy Nginx sub-chart | `false` |
| `nginx.service.type` | Kubernetes Service type | `ClusterIP` |
| `nginx.ingress.enabled` | Enable ingress controller resource | `true` |
| `nginx.ingress.hostname` | Default host for the ingress resource | `invoiceninja.local` |
| `nginx.existingServerBlockConfigmap` | Custom NGINX server block config map | `{{ include "invoiceninja.nginx.serverBlockName" . }}` |
| `nginx.staticSitePVC` | Name of Invoice Ninja public PVC | `{{ include "invoiceninja.public.storageName" . }}` |
> See [Dependencies](#dependencies) for more. > See [Dependencies](#dependencies) for more.
### Persistence parameters ### Persistence parameters
| Parameter | Description | Default | | Parameter | Description | Default |
| ----------------------------------- | ---------------------------------------- | ----------------- | | ----------------------------------- | --------------------------------------------------- | ----------------- |
| `persistence.public.enabled` | Enable persistence using PVC | `true` | | `persistence.public.enabled` | Enable persistence using PVC | `true` |
| `persistence.public.existingClaim` | Enable persistence using an existing PVC | `nil` | | `persistence.public.existingClaim` | Enable persistence using an existing PVC | `nil` |
| `persistence.public.storageClass` | PVC Storage Class | `nil` | | `persistence.public.storageClass` | PVC Storage Class | `nil` |
| `persistence.public.accessModes` | PVC Access Modes | `[ReadWriteMany]` | | `persistence.public.accessModes` | PVC Access Modes | `[ReadWriteOnce]` |
| `persistence.public.size` | PVC Storage Request | `1Gi` | | `persistence.public.size` | PVC Storage Request | `1Gi` |
| `persistence.public.dataSource` | PVC data source | `{}` | | `persistence.public.dataSource` | PVC data source | `{}` |
| `persistence.storage.enabled` | Enable persistence using PVC | `true` | | `persistence.storage.enabled` | Enable persistence using PVC (only for FILE driver) | `false` |
| `persistence.storage.existingClaim` | Enable persistence using an existing PVC | `nil` | | `persistence.storage.existingClaim` | Enable persistence using an existing PVC | `nil` |
| `persistence.storage.storageClass` | PVC Storage Class | `nil` | | `persistence.storage.storageClass` | PVC Storage Class | `nil` |
| `persistence.storage.accessModes` | PVC Access Modes | `[ReadWriteMany]` | | `persistence.storage.accessModes` | PVC Access Modes | `[ReadWriteMany]` |
| `persistence.storage.size` | PVC Storage Request | `5Gi` | | `persistence.storage.size` | PVC Storage Request | `5Gi` |
| `persistence.storage.dataSource` | PVC data source | `{}` | | `persistence.storage.dataSource` | PVC data source | `{}` |
> See `values.yaml` for more details.
### Redis parameters ### Redis parameters
| Parameter | Description | Default | | Parameter | Description | Default |
| --------------------------------- | -------------------------------------------- | ----------------------------------------- | | --------------------------------- | -------------------------------------------- | ----------------------------------------- |
| `redis.enabled` | If external redis is used, set it to `false` | `true` | | `redis.enabled` | If external redis is used, set it to `false` | `true` |
| `redis.password` | Redis password | _random 10 character alphanumeric string_ | | `redis.auth.password` | Redis password | _random 10 character alphanumeric string_ |
| `redis.auth.sentinel` | Use password for sentinel containers | `false` |
| `redis.sentinel.enabled` | Enable sentinel containers | `true` | | `redis.sentinel.enabled` | Enable sentinel containers | `true` |
| `redis.sentinel.usePassword` | Use password for sentinel containers | `false` | | `redis.sentinel.quorum` | Sentinel Quorum | `1` |
| `redis.replica.replicaCount` | Number of Redis replicas to deploy | `1` |
| `externalRedis.host` | Host of the external redis | `nil` | | `externalRedis.host` | Host of the external redis | `nil` |
| `externalRedis.port` | Port of the external redis | `6379` | | `externalRedis.port` | Port of the external redis | `6379` |
| `externalRedis.password` | Password for the external redis | `nil` | | `externalRedis.password` | Password for the external redis | `nil` |
@@ -228,28 +292,29 @@ Specify each parameter using the `--set key=value[,key=value]` argument to `helm
helm install invoiceninja \ helm install invoiceninja \
--set appKey=changeit \ --set appKey=changeit \
--set replicaCount=3 \ --set replicaCount=3 \
--set nginx.replicaCount=3 \ --set persistence.public.accessModes[0]=ReadWriteMany
--set redis.cluster.slaveCount=3 \ --set redis.auth.password=changeit \
--set redis.password=changeit \ --set redis.sentinel.quorum=2 \
--set redis.replica.replicaCount=3 \
--set mariadb.auth.rootPassword=changeit \ --set mariadb.auth.rootPassword=changeit \
--set mariadb.auth.password=changeit \ --set mariadb.auth.password=changeit \
invoiceninja/invoiceninja invoiceninja/invoiceninja
``` ```
The above command sets the number of replicas to 3 for a highly available (HA) setup. Note that you would need to use an external DB such as MariaDB Galera for a full HA production setup. The above command sets the number of replicas to 3 for a highly available (HA) setup and uses a `ReadWriteMany` volume. Note that you would need to use an external DB such as MariaDB Galera for a full HA production setup. For a production environment, it is recommended that you spin up the required databases in a separate Helm Chart to decouple the upgrading process.
Alternatively, a YAML file that specifies the values for the parameters can be provided while [installing](https://helm.sh/docs/helm/helm_install/) the chart. For example, Alternatively, a YAML file that specifies the values for the parameters can be provided while [installing](https://helm.sh/docs/helm/helm_install/) the chart. For example,
```yaml ```yaml
# values.yaml # values.yaml
appKey: changeit appKey: changeit
replicaCount: 3 persistence:
nginx: public:
replicaCount: 3 accessModes:
- ReadWriteMany
redis: redis:
cluster: auth:
slaveCount: 3 password: changeit
password: changeit
mariadb: mariadb:
auth: auth:
rootPassword: changeit rootPassword: changeit
@@ -283,6 +348,31 @@ kubectl create configmap examplemap --from-literal=MAIL_HOST='smtp.mailtrap.io'
extraEnvVarsCM: examplemap extraEnvVarsCM: examplemap
``` ```
## Inline webserver vs Nginx sub-chart
Since there are many people without access to a `ReadWriteMany` volume, the inline Nginx web server will allow you to use a `ReadWriteOnce` public volume limited to 1 IN replica.
If you have the ability to use `ReadWriteMany` persistent volume, you can choose between the two by setting the `nginx.enabled` parameter. Setting `nginx.enabled` to true will enable the Nginx sub-chart and will provide you with some additional features, such as:
- independent scaling of Nginx and IN pods
- separate resource limits/requests
- other features available from the sub-chart
## Upgrading ## Upgrading
Nothing yet. ### To 0.8.0
To improve the accessibility of this chart to regular users. Some of the defaults have been changed. This include:
- `persistence.public.accessModes` now defaults to `ReadWriteOnce`.
- `nginx.enabled` now defaults to false.
- `redis.replica.replicaCount` and `redis.sentinel.quorum` now defaults to `1`.
Other changes:
- `snappdf` parameter has been replaced by `pdfGenerator`.
### To 0.7.0
- Redis chart dependency has been upgraded and may not be backwards compatible with previous versions. See [here](https://github.com/bitnami/charts/tree/master/bitnami/redis) for more info.
- Storage persitence defaults to `false`. Set to `true` if not using Redis or using FILE driver

View File

@@ -5,11 +5,18 @@ Return the proper image name
{{- include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) -}} {{- include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) -}}
{{- end -}} {{- end -}}
{{/*
Return the proper image name
*/}}
{{- define "invoiceninja.nginx.image" -}}
{{- include "common.images.image" (dict "imageRoot" .Values.http.image "global" .Values.global) -}}
{{- end -}}
{{/* {{/*
Return the proper Docker Image Registry Secret Names Return the proper Docker Image Registry Secret Names
*/}} */}}
{{- define "invoiceninja.imagePullSecrets" -}} {{- define "invoiceninja.imagePullSecrets" -}}
{{- include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.volumePermissions.image) "global" .Values.global) -}} {{- include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.http.image .Values.volumePermissions.image) "global" .Values.global) -}}
{{- end -}} {{- end -}}
{{/* {{/*
@@ -43,7 +50,6 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}} {{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}}
{{- end -}} {{- end -}}
{{/* {{/*
Create the name of the service account to use Create the name of the service account to use
*/}} */}}
@@ -55,6 +61,13 @@ Create the name of the service account to use
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{/*
Return the Invoice Ninja Secret Name
*/}}
{{- define "invoiceninja.secretName" -}}
{{- default (include "common.names.fullname" .) .Values.existingSecret }}
{{- end -}}
{{/* {{/*
Return the proper Storage Class Return the proper Storage Class
*/}} */}}
@@ -83,6 +96,29 @@ Return the proper Storage Name
{{- printf "%s-%s" .Release.Name "storage" | trunc 63 | trimSuffix "-" -}} {{- printf "%s-%s" .Release.Name "storage" | trunc 63 | trimSuffix "-" -}}
{{- end -}} {{- end -}}
{{/*
Return the proper app URL
*/}}
{{- define "invoiceninja.url" -}}
{{- if .Values.appURL }}
{{- printf "%s" .Values.appURL -}}
{{- else if .Values.nginx.ingress.enabled }}
{{- if .Values.nginx.ingress.tls }}
{{- printf "https://%s" .Values.nginx.ingress.hostname -}}
{{- else }}
{{- printf "http://%s" .Values.nginx.ingress.hostname -}}
{{- end }}
{{- else if .Values.ingress.enabled }}
{{- if .Values.ingress.tls }}
{{- printf "https://%s" .Values.ingress.hostname -}}
{{- else }}
{{- printf "http://%s" .Values.ingress.hostname -}}
{{- end }}
{{- else }}
{{- printf "http://%s" (include "common.names.fullname" .) -}}
{{- end }}
{{- end -}}
{{/* {{/*
Return the MariaDB Hostname Return the MariaDB Hostname
*/}} */}}
@@ -138,7 +174,11 @@ Return the MariaDB Secret Name
{{- if .Values.externalDatabase.existingSecret -}} {{- if .Values.externalDatabase.existingSecret -}}
{{- printf "%s" .Values.externalDatabase.existingSecret -}} {{- printf "%s" .Values.externalDatabase.existingSecret -}}
{{- else -}} {{- else -}}
{{- printf "%s" (include "invoiceninja.mariadb.fullname" .) -}} {{- if .Values.mariadb.auth.existingSecret -}}
{{- printf "%s" .Values.mariadb.auth.existingSecret -}}
{{- else -}}
{{- printf "%s" (include "invoiceninja.mariadb.fullname" .) -}}
{{- end -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
@@ -201,7 +241,11 @@ Return the Redis Secret Name
{{- if .Values.externalRedis.existingSecret -}} {{- if .Values.externalRedis.existingSecret -}}
{{- printf "%s" .Values.externalRedis.existingSecret -}} {{- printf "%s" .Values.externalRedis.existingSecret -}}
{{- else -}} {{- else -}}
{{- printf "%s" (include "invoiceninja.redis.fullname" .) -}} {{- if .Values.redis.auth.existingSecret -}}
{{- printf "%s" .Values.redis.auth.existingSecret -}}
{{- else -}}
{{- printf "%s" (include "invoiceninja.redis.fullname" .) -}}
{{- end -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
@@ -248,3 +292,18 @@ Return the Session Connection Name
{{- printf "default" -}} {{- printf "default" -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{/*
Server block configmap name for nignx.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "invoiceninja.nginx.serverBlockName" -}}
{{- printf "%s-%s" .Release.Name "server-block" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Name of web service for inline web server.
*/}}
{{- define "invoiceninja.http.serviceName" -}}
{{- printf "%s-%s" .Release.Name "web" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

View File

@@ -12,15 +12,7 @@ metadata:
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }} {{- end }}
data: data:
{{- if .Values.nginx.ingress.enabled }} APP_URL: {{ include "invoiceninja.url" . | quote }}
{{- if .Values.nginx.ingress.tls }}
APP_URL: "https://{{ .Values.nginx.ingress.hostname }}"
{{- else }}
APP_URL: "http://{{ .Values.nginx.ingress.hostname }}"
{{- end }}
{{- else }}
APP_URL: "http://{{ include "common.names.fullname" . }}"
{{- end }}
APP_DEBUG: {{ .Values.debug | quote }} APP_DEBUG: {{ .Values.debug | quote }}
DB_HOST: {{ include "invoiceninja.databaseHost" . | quote }} DB_HOST: {{ include "invoiceninja.databaseHost" . | quote }}
DB_PORT: {{ include "invoiceninja.databasePort" . | quote }} DB_PORT: {{ include "invoiceninja.databasePort" . | quote }}
@@ -52,7 +44,9 @@ data:
{{- else if or .Values.redis.enabled .Values.externalRedis.host }} {{- else if or .Values.redis.enabled .Values.externalRedis.host }}
QUEUE_CONNECTION: redis QUEUE_CONNECTION: redis
{{- end }} {{- end }}
PHANTOMJS_PDF_GENERATION: {{ not .Values.snappdf | quote}} # PHANTOMJS_PDF_GENERATION is deprecated
PHANTOMJS_PDF_GENERATION: "false"
PDF_GENERATOR: {{ .Values.pdfGenerator | quote}}
REDIS_HOST: {{ include "invoiceninja.redisHost" . | quote }} REDIS_HOST: {{ include "invoiceninja.redisHost" . | quote }}
REDIS_PORT: {{ include "invoiceninja.redisPort" . | quote }} REDIS_PORT: {{ include "invoiceninja.redisPort" . | quote }}
REDIS_DB: {{ include "invoiceninja.redisDatabase" . | quote }} REDIS_DB: {{ include "invoiceninja.redisDatabase" . | quote }}
@@ -62,3 +56,4 @@ data:
REDIS_QUEUE_CONNECTION: {{ include "invoiceninja.redisQueueConnection" . | quote }} REDIS_QUEUE_CONNECTION: {{ include "invoiceninja.redisQueueConnection" . | quote }}
SESSION_CONNECTION: {{ include "invoiceninja.redisSessionConnection" . | quote }} SESSION_CONNECTION: {{ include "invoiceninja.redisSessionConnection" . | quote }}
REQUIRE_HTTPS: {{ .Values.requireHttps | quote }} REQUIRE_HTTPS: {{ .Values.requireHttps | quote }}
TRUSTED_PROXIES: {{ .Values.trustedProxies | quote }}

View File

@@ -66,7 +66,7 @@ spec:
[[ -z "${DB_HOST1}" ]] || DB_HOST="${DB_HOST1}"; [[ -z "${DB_HOST1}" ]] || DB_HOST="${DB_HOST1}";
[[ -z "${DB_PORT1}" ]] || DB_PORT="${DB_PORT1}"; [[ -z "${DB_PORT1}" ]] || DB_PORT="${DB_PORT1}";
while [ $COUNTER -lt 120 ]; do while [ $COUNTER -lt 120 ]; do
if mysqladmin ping -h "$DB_HOST" -P $DB_PORT --silent; then if mysqladmin ping -h "$DB_HOST" -P $DB_PORT --connect-timeout=15 --silent; then
exit 0; exit 0;
fi; fi;
let COUNTER=COUNTER+1; let COUNTER=COUNTER+1;
@@ -135,8 +135,10 @@ spec:
timeoutSeconds: {{ $.Values.livenessProbe.timeoutSeconds }} timeoutSeconds: {{ $.Values.livenessProbe.timeoutSeconds }}
successThreshold: {{ $.Values.livenessProbe.successThreshold }} successThreshold: {{ $.Values.livenessProbe.successThreshold }}
failureThreshold: {{ $.Values.livenessProbe.failureThreshold }} failureThreshold: {{ $.Values.livenessProbe.failureThreshold }}
tcpSocket: exec:
port: {{ .Values.livenessProbe.port }} command:
- pgrep
- php-fpm
{{- end }} {{- end }}
{{- if .Values.readinessProbe.enabled }} {{- if .Values.readinessProbe.enabled }}
readinessProbe: readinessProbe:
@@ -152,7 +154,7 @@ spec:
- configMapRef: - configMapRef:
name: {{ include "common.names.fullname" . }} name: {{ include "common.names.fullname" . }}
- secretRef: - secretRef:
name: {{ include "common.names.fullname" . }} name: {{ include "invoiceninja.secretName" . }}
{{- if .Values.extraEnvVarsCM }} {{- if .Values.extraEnvVarsCM }}
- configMapRef: - configMapRef:
name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }} name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }}
@@ -167,7 +169,7 @@ spec:
secretKeyRef: secretKeyRef:
name: {{ include "invoiceninja.databaseSecretName" . }} name: {{ include "invoiceninja.databaseSecretName" . }}
key: mariadb-password key: mariadb-password
{{- if or (and .Values.redis.enabled .Values.redis.usePassword) (or .Values.externalRedis.password .Values.externalRedis.existingSecret) }} {{- if or (and .Values.redis.enabled .Values.redis.auth.enabled) (or .Values.externalRedis.password .Values.externalRedis.existingSecret) }}
- name: REDIS_PASSWORD - name: REDIS_PASSWORD
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
@@ -191,6 +193,61 @@ spec:
{{- if .Values.extraVolumeMounts }} {{- if .Values.extraVolumeMounts }}
{{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }} {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }}
{{- end }} {{- end }}
{{- if not .Values.nginx.enabled }}
- name: nginx
securityContext:
{{- toYaml .Values.containerSecurityContext | nindent 12 }}
image: {{ include "invoiceninja.nginx.image" . }}
imagePullPolicy: {{ .Values.http.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.http.containerPorts.http }}
- name: https
containerPort: {{ .Values.http.containerPorts.https }}
{{- if .Values.http.livenessProbe.enabled }}
livenessProbe:
initialDelaySeconds: {{ .Values.http.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.http.livenessProbe.periodSeconds }}
timeoutSeconds: {{ $.Values.http.livenessProbe.timeoutSeconds }}
successThreshold: {{ $.Values.http.livenessProbe.successThreshold }}
failureThreshold: {{ $.Values.http.livenessProbe.failureThreshold }}
tcpSocket:
port: http
{{- end }}
{{- if .Values.http.readinessProbe.enabled }}
readinessProbe:
initialDelaySeconds: {{ .Values.http.readinessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.http.readinessProbe.periodSeconds }}
timeoutSeconds: {{ $.Values.http.readinessProbe.timeoutSeconds }}
successThreshold: {{ $.Values.http.readinessProbe.successThreshold }}
failureThreshold: {{ $.Values.http.readinessProbe.failureThreshold }}
tcpSocket:
port: http
{{- end }}
envFrom:
{{- if .Values.http.extraEnvVarsCM }}
- configMapRef:
name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }}
{{- end }}
{{- if .Values.http.extraEnvVarsSecret }}
- secretRef:
name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }}
{{- end }}
env:
{{- if .Values.http.extraEnvVars }}
{{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }}
{{- end }}
resources:
{{- toYaml .Values.http.resources | nindent 12 }}
volumeMounts:
- mountPath: /opt/bitnami/nginx/conf/server_blocks
name: nginx-server-block
- mountPath: /app
name: public
{{- if .Values.http.extraVolumeMounts }}
{{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }}
{{- end }}
{{- end }}
volumes: volumes:
- name: public - name: public
{{- if .Values.persistence.public.enabled }} {{- if .Values.persistence.public.enabled }}
@@ -206,6 +263,12 @@ spec:
{{- else }} {{- else }}
emptyDir: {} emptyDir: {}
{{ end }} {{ end }}
{{- if not .Values.nginx.enabled }}
- name: nginx-server-block
configMap:
defaultMode: 420
name: {{ include "invoiceninja.nginx.serverBlockName" . }}
{{- end }}
{{- if .Values.extraVolumes }} {{- if .Values.extraVolumes }}
{{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }} {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }}
{{- end }} {{- end }}

View File

@@ -0,0 +1,63 @@
{{- if and ( not .Values.nginx.enabled ) .Values.ingress.enabled }}
apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }}
kind: Ingress
metadata:
name: {{ include "common.names.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
annotations:
{{- if .Values.ingress.certManager }}
kubernetes.io/tls-acme: "true"
{{- end }}
{{- if .Values.ingress.annotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.ingress.annotations "context" $ ) | nindent 4 }}
{{- end }}
{{- if .Values.commonAnnotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
ingressClassName: {{ .Values.ingress.ingressClassName | quote }}
{{- end }}
rules:
{{- if .Values.ingress.hostname }}
- host: {{ .Values.ingress.hostname | quote }}
http:
paths:
{{- if .Values.ingress.extraPaths }}
{{- toYaml .Values.ingress.extraPaths | nindent 10 }}
{{- end }}
- path: {{ .Values.ingress.path }}
{{- if eq "true" (include "common.ingress.supportsPathType" .) }}
pathType: {{ .Values.ingress.pathType }}
{{- end }}
backend: {{- include "common.ingress.backend" ( dict "serviceName" (include "invoiceninja.http.serviceName" .) "servicePort" "http" "context" $ ) | nindent 14 }}
{{- end }}
{{- range .Values.ingress.extraHosts }}
- host: {{ .name | quote }}
http:
paths:
- path: {{ default "/" .path }}
{{- if eq "true" (include "common.ingress.supportsPathType" $) }}
pathType: {{ default "ImplementationSpecific" .pathType }}
{{- end }}
backend: {{- include "common.ingress.backend" ( dict "serviceName" (include "invoiceninja.http.serviceName" $) "servicePort" "http" "context" $ ) | nindent 14 }}
{{- end }}
{{- if or .Values.ingress.tls .Values.ingress.extraTls }}
tls:
{{- if .Values.ingress.tls }}
- hosts:
- {{ .Values.ingress.hostname | quote }}
{{- range .Values.ingress.extraHosts }}
- {{ .name | quote }}
{{- end }}
secretName: {{ printf "%s-tls" .Values.ingress.hostname }}
{{- end }}
{{- if .Values.ingress.extraTls }}
{{- include "common.tplvalues.render" ( dict "value" .Values.ingress.extraTls "context" $ ) | nindent 4 }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -14,7 +14,13 @@ metadata:
{{- end }} {{- end }}
spec: spec:
accessModes: accessModes:
{{- if not (empty .Values.persistence.public.accessModes) }}
{{- range .Values.persistence.public.accessModes }}
- {{ . | quote }}
{{- end }}
{{- else }}
- {{ .Values.persistence.public.accessMode | quote }} - {{ .Values.persistence.public.accessMode | quote }}
{{- end }}
resources: resources:
requests: requests:
storage: {{ .Values.persistence.public.size | quote }} storage: {{ .Values.persistence.public.size | quote }}
@@ -41,7 +47,13 @@ metadata:
{{- end }} {{- end }}
spec: spec:
accessModes: accessModes:
{{- if not (empty .Values.persistence.storage.accessModes) }}
{{- range .Values.persistence.storage.accessModes }}
- {{ . | quote }}
{{- end }}
{{- else }}
- {{ .Values.persistence.storage.accessMode | quote }} - {{ .Values.persistence.storage.accessMode | quote }}
{{- end }}
resources: resources:
requests: requests:
storage: {{ .Values.persistence.storage.size | quote }} storage: {{ .Values.persistence.storage.size | quote }}

View File

@@ -38,6 +38,7 @@ data:
{{- end }} {{- end }}
--- ---
{{- if not .Values.existingSecret }}
apiVersion: v1 apiVersion: v1
kind: Secret kind: Secret
metadata: metadata:
@@ -61,3 +62,4 @@ data:
{{- if .Values.userPassword }} {{- if .Values.userPassword }}
IN_PASSWORD: {{ .Values.userPassword | b64enc | quote }} IN_PASSWORD: {{ .Values.userPassword | b64enc | quote }}
{{- end }} {{- end }}
{{- end }}

View File

@@ -0,0 +1,39 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "invoiceninja.nginx.serverBlockName" . }}
labels:
{{- include "common.labels.standard" $ | nindent 4 }}
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
{{- if .Values.commonAnnotations }}
annotations:
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
data:
server-block.conf: |-
server {
listen 8080 default_server;
server_name _;
root /app;
index index.php;
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; }
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass {{ include "common.names.fullname" . }}:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/app/public$fastcgi_script_name;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}

View File

@@ -0,0 +1,60 @@
{{- if not .Values.nginx.enabled }}
apiVersion: v1
kind: Service
metadata:
name: {{ include "invoiceninja.http.serviceName" . }}
labels:
{{- include "common.labels.standard" $ | nindent 4 }}
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
{{- if or .Values.service.http.annotations .Values.commonAnnotations }}
annotations:
{{- if .Values.service.http.annotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.service.http.annotations "context" $ ) | nindent 4 }}
{{- end }}
{{- if .Values.commonAnnotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
{{- end }}
spec:
type: {{ .Values.service.http.type }}
{{- if and .Values.service.http.clusterIP (eq .Values.service.http.type "ClusterIP") }}
clusterIP: {{ .Values.service.http.clusterIP }}
{{- end }}
{{- if (or (eq .Values.service.http.type "LoadBalancer") (eq .Values.service.http.type "NodePort")) }}
externalTrafficPolicy: {{ .Values.service.http.externalTrafficPolicy | quote }}
{{- end }}
{{- if (and (eq .Values.service.http.type "LoadBalancer") .Values.service.http.loadBalancerSourceRanges) }}
loadBalancerSourceRanges: {{- toYaml . | nindent 4 }}
{{- end }}
{{- if (and (eq .Values.service.http.type "LoadBalancer") (not (empty .Values.service.http.loadBalancerIP))) }}
loadBalancerIP: {{ .Values.service.http.loadBalancerIP }}
{{- end }}
ports:
{{- if not (empty .Values.service.http.ports.http) }}
- name: http
port: {{ .Values.service.http.ports.http }}
protocol: TCP
targetPort: http
{{- if (and (or (eq .Values.service.http.type "NodePort") (eq .Values.service.http.type "LoadBalancer")) (not (empty .Values.service.http.nodePorts.http))) }}
nodePort: {{ .Values.service.http.nodePorts.http }}
{{- else if eq .Values.service.http.type "ClusterIP" }}
nodePort: null
{{- end }}
{{- end }}
{{- if not (empty .Values.service.http.ports.https) }}
- name: https
port: {{ .Values.service.http.ports.https }}
protocol: TCP
targetPort: https
{{- if (and (or (eq .Values.service.http.type "NodePort") (eq .Values.service.http.type "LoadBalancer")) (not (empty .Values.service.http.nodePorts.https))) }}
nodePort: {{ .Values.service.http.nodePorts.https }}
{{- else if eq .Values.service.http.type "ClusterIP" }}
nodePort: null
{{- end }}
{{- end }}
selector:
{{- include "common.labels.matchLabels" . | nindent 4 }}
app.kubernetes.io/component: server
{{- end }}

View File

@@ -18,7 +18,7 @@
image: image:
registry: docker.io registry: docker.io
repository: invoiceninja/invoiceninja repository: invoiceninja/invoiceninja
tag: 5.1.64 tag: 5.3.80
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
## ##
@@ -38,6 +38,10 @@ debug: false
## ##
appKey: "" appKey: ""
## Override app URL
##
appURL: ""
## Email of user to create first run ## Email of user to create first run
## If not specified, default user email will be "admin@example.com" ## If not specified, default user email will be "admin@example.com"
## ##
@@ -68,9 +72,14 @@ sessionDriver: ""
## ##
queueConnection: "" queueConnection: ""
## Use local or Phantom JS PDF generation ## List of trusted proxies for Invoice Ninja to communicate with the nginx proxy
## ##
snappdf: true trustedProxies: "*"
## Use local or Phantom JS PDF generation
## Options are `snappdf` or `phantom`
##
pdfGenerator: snappdf
## Name of queue connection to use (use "log" for debug) ## Name of queue connection to use (use "log" for debug)
## Please check the ref below for any other env you may need to define ## Please check the ref below for any other env you may need to define
@@ -82,6 +91,12 @@ mailer: log
## ##
requireHttps: false requireHttps: false
## Name of existing secret containing IN credentials
## NOTE: Must contain key `APP_KEY` and `IN_PASSWORD`
## NOTE: When it's set, the `appKey` and `userPassword` parameter is ignored
##
existingSecret:
## String to partially override fullname template (will maintain the release name) ## String to partially override fullname template (will maintain the release name)
## ##
# nameOverride: # nameOverride:
@@ -240,14 +255,123 @@ extraEnvVarsCM:
## ##
extraEnvVarsSecret: extraEnvVarsSecret:
## Extra volumes to add to the deployment
##
extraVolumes: []
## Extra volume mounts to add to the container ## Extra volume mounts to add to the container
## ##
extraVolumeMounts: [] extraVolumeMounts: []
## Configure extra options for liveness and readiness probes
## This applies to all the Invoice Ninja in the cluster
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
##
livenessProbe:
enabled: true
initialDelaySeconds: 120
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
port: fastcgi
resources:
{}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
## Inline http server (this is enabled only if nginx sub chart is disabled).
##
http:
image:
registry: docker.io
repository: bitnami/nginx
tag: 1.21.1-debian-10-r0
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
##
pullPolicy: IfNotPresent
## Optionally specify an array of imagePullSecrets.
## Secrets must be manually created in the namespace.
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
##
# pullSecrets:
# - myRegistryKeySecretName
## Container ports
##
containerPorts:
http: 8080
https: 8443
## An array to add extra env vars
## Example:
## extraEnvVars:
## - name: FOO
## value: "bar"
##
extraEnvVars: []
## ConfigMap with extra environment variables
##
extraEnvVarsCM:
## Secret with extra environment variables
##
extraEnvVarsSecret:
## Extra volume mounts to add to the container
##
extraVolumeMounts: []
## Configure extra options for liveness and readiness probes
## This applies to all the web server in the cluster
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
##
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
resources:
{}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
## Extra volumes to add to the deployment
##
extraVolumes: []
## Kubernetes service type ## Kubernetes service type
## ref: https://kubernetes.io/docs/concepts/services-networking/service/ ## ref: https://kubernetes.io/docs/concepts/services-networking/service/
## Set this to NodePort, LoadBalancer or ClusterIP ## Set this to NodePort, LoadBalancer or ClusterIP
@@ -283,40 +407,129 @@ service:
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
## ##
annotations: {} annotations: {}
## Service for http server
##
http:
## Service type
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
##
type: ClusterIP
## Service ports
##
ports:
http: 8080
https: 8443
## Specify the nodePort value for the LoadBalancer and NodePort service types.
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
##
nodePorts:
http: ""
https: ""
## Service clusterIP.
##
# clusterIP: None
## Specify the loadBalancerIP value for LoadBalancer service types.
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
##
# loadBalancerIP:
## Specify the loadBalancerSourceRanges value for LoadBalancer service types.
## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
##
loadBalancerSourceRanges: []
## Enable client source IP preservation
## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
##
externalTrafficPolicy: Cluster
## Additional service annotations (evaluate as a template)
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
##
annotations: {}
## Configure extra options for liveness and readiness probes ## Configure the ingress resource to access IN (this is enabled only if nginx sub chart is disabled).
## This applies to all the Invoice Ninja in the sharded cluster ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
## ##
livenessProbe: ingress:
## Enable ingress
##
enabled: true enabled: true
initialDelaySeconds: 30 ## Add the corresponding annotations for cert-manager integration
periodSeconds: 10 ##
timeoutSeconds: 5 certManager: false
failureThreshold: 6 ## Ingress path type
successThreshold: 1 ##
port: fastcgi pathType: ImplementationSpecific
readinessProbe: ## Force Ingress API version (automatically detected if not set)
enabled: true ##
initialDelaySeconds: 15 apiVersion:
periodSeconds: 10 ## IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)
timeoutSeconds: 5 ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .
failureThreshold: 6 ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/
successThreshold: 1 ##
port: fastcgi ingressClassName:
## Default host for the ingress record
resources: ##
{} hostname: invoiceninja.local
# We usually recommend not to specify default resources and to leave this as a conscious ## Default path for the ingress record
# choice for the user. This also increases chances charts run on environments with little ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers
# resources, such as Minikube. If you do want to specify resources, uncomment the following ##
# lines, adjust them as necessary, and remove the curly braces after 'resources:'. path: /
# limits: ## Additional custom annotations for the ingress record
# cpu: 100m ## NOTE: If `ingress.certManager=true`, annotation `kubernetes.io/tls-acme: "true"` will automatically be added
# memory: 128Mi ##
# requests: annotations: {}
# cpu: 100m ## Enable TLS configuration for the host defined at `ingress.hostname` parameter
# memory: 128Mi ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname }}`
## You can:
## - Use the `ingress.secrets` parameter to create this TLS secret
## - Relay on cert-manager to create it by setting `ingress.certManager=true`
## - Relay on Helm to create self-signed certificates by setting `ingress.tls=true` and `ingress.certManager=false`
##
tls: false
## An array with additional hostname(s) to be covered with the ingress record
## e.g:
## extraHosts:
## - name: invoiceninja.local
## path: /
##
extraHosts: []
## An array with additional arbitrary paths that may need to be added to the ingress under the main host
## e.g:
## extraPaths:
## - path: /*
## backend:
## serviceName: ssl-redirect
## servicePort: use-annotation
##
extraPaths: []
## TLS configuration for additional hostname(s) to be covered with this ingress record
## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
## e.g:
## extraTls:
## - hosts:
## - invoiceninja.local
## secretName: invoiceninja.local-tls
##
extraTls: []
## Custom TLS certificates as secrets
## NOTE: 'key' and 'certificate' are expected in PEM format
## NOTE: 'name' should line up with a 'secretName' set further up
## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates
## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days
## It is also possible to create and manage the certificates outside of this helm chart
## Please see README.md for more information
## e.g:
## secrets:
## - name: invoiceninja.local-tls
## key: |-
## -----BEGIN RSA PRIVATE KEY-----
## ...
## -----END RSA PRIVATE KEY-----
## certificate: |-
## -----BEGIN CERTIFICATE-----
## ...
## -----END CERTIFICATE-----
##
secrets: []
## Enable persistence using Persistent Volume Claims ## Enable persistence using Persistent Volume Claims
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
@@ -336,13 +549,14 @@ persistence:
## If you want to reuse an existing claim, you can pass the name of the PVC using ## If you want to reuse an existing claim, you can pass the name of the PVC using
## the existingClaim variable ## the existingClaim variable
# existingClaim: your-claim # existingClaim: your-claim
accessMode: ReadWriteMany accessMode: ReadWriteOnce
size: 1Gi size: 1Gi
## Custom dataSource ## Custom dataSource
## ##
dataSource: {} dataSource: {}
storage: storage:
enabled: true ## Only required when using FILE cache or session driver
enabled: false
## Invoice Ninja data Persistent Volume Storage Class ## Invoice Ninja data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass> ## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning ## If set to "-", storageClassName: "", which disables dynamic provisioning
@@ -373,9 +587,13 @@ autoscaling:
## ##
redis: redis:
enabled: true enabled: true
auth:
sentinel: false
sentinel: sentinel:
enabled: true enabled: true
usePassword: false quorum: 1
replica:
replicaCount: 1
## External Redis Configuration ## External Redis Configuration
## ##
@@ -454,6 +672,7 @@ externalDatabase:
## ref: https://github.com/bitnami/charts/blob/master/bitnami/nginx/values.yaml ## ref: https://github.com/bitnami/charts/blob/master/bitnami/nginx/values.yaml
## ##
nginx: nginx:
enabled: false
service: service:
## Service type ## Service type
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
@@ -465,43 +684,9 @@ nginx:
ingress: ingress:
enabled: true enabled: true
hostname: invoiceninja.local hostname: invoiceninja.local
## Configure the serverblock for Invoice Ninja ## Use the serverblock config map from Invoice Ninja
## Note: you may need to replace the fastcgi_pass value if the release name is different
## ##
serverBlock: | existingServerBlockConfigmap: '{{ include "invoiceninja.nginx.serverBlockName" . }}'
server { ## Use the public PVC created by Invoice Ninja
listen 8080 default_server;
server_name _;
root /var/www/app/public/;
index index.php;
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; }
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass invoiceninja:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}
## Configure the extraVolumes and extraVolumeMounts for Invoice Ninja
## Note: you may need to replace the claimName if the release name is different
## ##
extraVolumes: staticSitePVC: '{{ include "invoiceninja.public.storageName" . }}'
- name: public
persistentVolumeClaim:
claimName: invoiceninja-public
extraVolumeMounts:
- mountPath: /var/www/app/public
name: public
readOnly: true

5
env
View File

@@ -4,6 +4,11 @@ APP_KEY=<insert your generated key in here>
APP_DEBUG=true APP_DEBUG=true
REQUIRE_HTTPS=false REQUIRE_HTTPS=false
PHANTOMJS_PDF_GENERATION=false PHANTOMJS_PDF_GENERATION=false
PDF_GENERATOR=snappdf
TRUSTED_PROXIES='*'
QUEUE_CONNECTION=database
# DB connection # DB connection
DB_HOST=db DB_HOST=db