diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..d838da9
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+examples/
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..9aa8294
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [tiredofit]
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..10c8043
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,42 @@
+---
+name: Bug report
+about: If something isn't working right..
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+### Summary
+
+
+
+
+### Steps to reproduce
+
+
+
+
+### What is the expected *correct* behavior?
+
+
+
+
+### Relevant logs and/or screenshots
+
+
+
+### Environment
+
+
+- Image version / tag:
+- Host OS:
+
+
+Any logs | docker-compose.yml
+
+
+
+
+### Possible fixes
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..3ae786b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,23 @@
+---
+name: Feature request
+about: Suggest an idea or feature
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+---
+name: Feature Request
+about: Suggest an idea for this project
+
+---
+
+**Description of the feature**
+
+
+**Benftits of feature**
+
+
+**Additional context**
+
diff --git a/.github/config.yml b/.github/config.yml
new file mode 100644
index 0000000..3ba13e0
--- /dev/null
+++ b/.github/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..2c7d170
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,7 @@
+version: 2
+updates:
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..ab922b2
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,335 @@
+### Application Level Image CI
+### Dave Conroy
+
+name: 'build'
+
+on:
+ push:
+ paths:
+ - '**'
+ - '!README.md'
+jobs:
+ build_docker_8_1:
+ env:
+ RELEASE: "8.1"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE},${DOCKER_IMAGE}:latest"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
+ build_docker_8_0:
+ env:
+ RELEASE: "8.0"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE}"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
+ build_docker_7_4:
+ env:
+ RELEASE: "7.4"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE}"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
new file mode 100644
index 0000000..eccff85
--- /dev/null
+++ b/.github/workflows/manual.yml
@@ -0,0 +1,335 @@
+# Manual Workflow (Application)
+
+name: manual
+
+on:
+ workflow_dispatch:
+ inputs:
+ Manual Build:
+ description: 'Manual Build'
+ required: false
+jobs:
+ build_docker_8_1:
+ env:
+ RELEASE: "8.1"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE},${DOCKER_IMAGE}:latest"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
+ build_docker_8_0:
+ env:
+ RELEASE: "8.0"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE}"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
+ build_docker_7_4:
+ env:
+ RELEASE: "7.4"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Prepare
+ id: prep
+ run: |
+ DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
+ set -x
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
+ BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
+ else
+ BRANCH=${GITHUB_REF#refs/heads/}
+ fi
+
+ case ${BRANCH} in
+ "main" | "master" )
+ BRANCHTAG="${DOCKER_IMAGE}:latest_php${RELEASE}"
+ ;;
+ "develop" )
+ BRANCHTAG="${DOCKER_IMAGE}:develop"
+ ;;
+ * )
+ if [ -n "${{ secrets.LATEST }}" ] ; then
+ if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ else
+ BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
+ fi
+ ;;
+ esac
+ fi
+
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
+ fi
+
+ if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
+ TAGS=${BRANCHTAG},${GITTAG}_php${RELEASE}
+ else
+ TAGS="${BRANCHTAG}${GITTAG},${BRANCHTAG}${GITTAG}_php${RELEASE}"
+ fi
+
+ echo ::set-output name=tags::${TAGS}
+ echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ with:
+ platforms: all
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Label
+ id: Label
+ run: |
+ if [ -f "Dockerfile" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
+ sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
+ if [ -f "CHANGELOG.md" ] ; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
+ mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
+ fi
+
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
+ fi
+
+ if [[ $GITHUB_REF == refs/heads/* ]]; then
+ sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
+ fi
+ fi
+
+ - name: Switch
+ id: Switch
+ run: |
+ sed -i "s|FROM docker.io/tiredofit/nginx-php-fpm:.*|FROM docker.io/tiredofit/nginx-php-fpm:${RELEASE}|g" Dockerfile
+
+ - name: Build
+ uses: docker/build-push-action@v3
+ with:
+ builder: ${{ steps.buildx.outputs.name }}
+ context: .
+ file: ./Dockerfile
+ platforms: linux/amd64,linux/arm/v7,linux/arm64
+ push: true
+ tags: ${{ steps.prep.outputs.tags }}
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..ee01b56
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+## 0.0.1 2022-10-06
+
+ ### Added
+ - Initial commit - Able to automatically install - Other options to come
+
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..b174c88
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,47 @@
+FROM docker.io/tiredofit/nginx-php-fpm:8.1
+LABEL maintainer="Dave Conroy (github.com/tiredofit)"
+
+ENV INVOICENINJA_VERSION=v5.5.27 \
+ INVOICENINJA_REPO_URL=https://github.com/invoiceninja/invoiceninja \
+ NGINX_WEBROOT=/www/html \
+ NGINX_SITE_ENABLED=invoiceninja \
+ PHP_CREATE_SAMPLE_PHP=FALSE \
+ PHP_ENABLE_CURL=TRUE \
+ PHP_ENABLE_FILEINFO=TRUE \
+ PHP_ENABLE_GMP=TRUE \
+ PHP_ENABLE_ICONV=TRUE \
+ PHP_ENABLE_IGBINARY=TRUE \
+ PHP_ENABLE_IMAP=TRUE \
+ PHP_ENABLE_MBSTRING=TRUE \
+ PHP_ENABLE_OPENSSL=TRUE \
+ PHP_ENABLE_SODIUM=TRUE \
+ PHP_ENABLE_TOKENIZER=TRUE \
+ PHP_ENABLE_ZIP=TRUE \
+ IMAGE_NAME="tiredofit/invoiceninja" \
+ IMAGE_REPO_URL="https://github.com/tiredofit/docker-invoiceninja/"
+
+RUN source /assets/functions/00-container && \
+ set -x && \
+ apk update && \
+ apk upgrade && \
+ apk add -t .invoiceninja-run-deps \
+ git \
+ gnu-libiconv \
+ sed \
+ && \
+ \
+ php-ext enable core && \
+ clone_git_repo ${INVOICENINJA_REPO_URL} ${INVOICENINJA_VERSION} /assets/install && \
+ composer install && \
+ chown -R ${NGINX_USER}:${NGINX_GROUP} /assets/install && \
+ rm -rf \
+ /assets/install/.env.example \
+ /assets/install/.env.travis \
+ && \
+ rm -rf /root/.composer && \
+ rm -rf /var/tmp/* /var/cache/apk/*
+
+ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
+
+### Assets
+ADD install /
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5dd7a07
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2022 Dave Conroy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1677a8e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,174 @@
+# github.com/tiredofit/docker-invoiceninja
+
+[![GitHub release](https://img.shields.io/github/v/tag/tiredofit/docker-invoiceninja?style=flat-square)](https://github.com/tiredofit/docker-invoiceninja/releases/latest)
+[![Build Status](https://img.shields.io/github/workflow/status/tiredofit/docker-invoiceninja/build?style=flat-square)](https://github.com/tiredofit/docker-invoiceninja/actions?query=workflow%3Abuild)
+[![Docker Stars](https://img.shields.io/docker/stars/tiredofit/invoiceninja.svg?style=flat-square&logo=docker)](https://hub.docker.com/r/tiredofit/invoiceninja/)
+[![Docker Pulls](https://img.shields.io/docker/pulls/tiredofit/invoiceninja.svg?style=flat-square&logo=docker)](https://hub.docker.com/r/tiredofit/invoiceninja/)
+[![Become a sponsor](https://img.shields.io/badge/sponsor-tiredofit-181717.svg?logo=github&style=flat-square)](https://github.com/sponsors/tiredofit)
+[![Paypal Donate](https://img.shields.io/badge/donate-paypal-00457c.svg?logo=paypal&style=flat-square)](https://www.paypal.me/tiredofit)
+
+* * *
+## About
+
+This will build a Docker Image for [invoiceninja](https://invoiceninja.net/) - An open source Helpscout / Zendesk alternative.
+
+* Automatically installs and sets up installation upon first start
+
+## Maintainer
+
+- [Dave Conroy](https://github.com/tiredofit)
+
+## Table of Contents
+
+
+- [About](#about)
+- [Maintainer](#maintainer)
+- [Table of Contents](#table-of-contents)
+- [Prerequisites and Assumptions](#prerequisites-and-assumptions)
+- [Installation](#installation)
+ - [Build from Source](#build-from-source)
+ - [Prebuilt Images](#prebuilt-images)
+- [Configuration](#configuration)
+ - [Quick Start](#quick-start)
+ - [Persistent Storage](#persistent-storage)
+ - [Environment Variables](#environment-variables)
+ - [Base Images used](#base-images-used)
+ - [Networking](#networking)
+- [Maintenance](#maintenance)
+ - [Shell Access](#shell-access)
+- [Support](#support)
+ - [Usage](#usage)
+ - [Bugfixes](#bugfixes)
+ - [Feature Requests](#feature-requests)
+ - [Updates](#updates)
+- [License](#license)
+- [References](#references)
+
+## Prerequisites and Assumptions
+* Assumes you are using some sort of SSL terminating reverse proxy such as:
+ * [Traefik](https://github.com/tiredofit/docker-traefik)
+ * [Nginx](https://github.com/jc21/nginx-proxy-manager)
+ * [Caddy](https://github.com/caddyserver/caddy)
+* Requires access to a MySQL/MariaDB Server
+
+## Installation
+
+### Build from Source
+Clone this repository and build the image with `docker build -t (imagename) .`
+
+### Prebuilt Images
+Builds of the image are available on [Docker Hub](https://hub.docker.com/r/tiredofit/invoiceninja) and is the recommended method of installation.
+
+```bash
+docker pull tiredofit/invoiceninja:(imagetag)
+```
+
+The following image tags are available along with their tagged release based on what's written in the [Changelog](CHANGELOG.md):
+
+| Container OS | Tag |
+| ------------ | --------- |
+| Alpine | `:latest` |
+
+## Configuration
+
+### Quick Start
+
+- The quickest way to get started is using [docker-compose](https://docs.docker.com/compose/). See the examples folder for a working [docker-compose.yml](examples/docker-compose.yml) that can be modified for development or production use.
+
+- Set various [environment variables](#environment-variables) to understand the capabilities of this image.
+- Map [persistent storage](#data-volumes) for access to configuration and data files for backup.
+- Make [networking ports](#networking) available for public access if necessary
+
+**The first boot can take from 2 minutes - 5 minutes depending on your CPU to setup the proper schemas.**
+
+- Login to the web server and enter in your admin email address, admin password and start configuring the system!
+
+### Persistent Storage
+The following directories are used for configuration and can be mapped for persistent storage.
+
+| Directory | Description |
+| ------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
+| `/www/logs` | Nginx and PHP Log files |
+| `/assets/custom` | (Optional) Copy source code over existing source code in /www/html upon container start. Use exact file/folder structure |
+| `/assets/custom-scripts` | (Optional) If you want to execute custom scripting, place scripts here with extension `.sh` |
+| `/assets/modules` | (Optional) If you want to add additional modules outside of the source tree, add them here |
+| `/www/html` | (Optional) If you want to expose the invoiceninja sourcecode and enable Self Updating, expose this volume |
+| *OR* | |
+| `/data` | Hold onto your persistent sessions and cache between container restarts |
+
+### Environment Variables
+
+#### Base Images used
+
+This image relies on an [Alpine Linux](https://hub.docker.com/r/tiredofit/alpine) base image that relies on an [init system](https://github.com/just-containers/s6-overlay) for added capabilities. Outgoing SMTP capabilities are handlded via `msmtp`. Individual container performance monitoring is performed by [zabbix-agent](https://zabbix.org). Additional tools include: `bash`,`curl`,`less`,`logrotate`,`nano`,`vim`.
+
+Be sure to view the following repositories to understand all the customizable options:
+
+| Image | Description |
+| ------------------------------------------------------------- | -------------------------------------- |
+| [OS Base](https://github.com/tiredofit/docker-alpine/) | Customized Image based on Alpine Linux |
+| [Nginx](https://github.com/tiredofit/docker-nginx/) | Nginx webserver |
+| [PHP-FPM](https://github.com/tiredofit/docker-nginx-php-fpm/) | PHP Interpreter |
+
+
+| Parameter | Description | default |
+| -------------------- | ----------------------------------------------------------------------------------------------- | ----------- |
+| `ADMIN_EMAIL` | Administrator Email Address - Needed for logging in | |
+| `ADMIN_FIRST_NAME` | Admin user First Name | `Admin` |
+| `ADMIN_LAST_NAME` | Admin user First Name | `User` |
+| `ADMIN_PASS` | Administrator Password - Needed for Logging in | |
+| `APPLICATION_NAME` | Change default application name - Default `invoiceninja` | `invoiceninja` |
+| `APP_PROXY` | Allow Application to use a proxy for fetching modules | |
+| `DB_HOST` | Host or container name of MariaDB Server e.g. `invoiceninja-db` | |
+| `DB_PORT` | MariaDB Port | `3306` |
+| `DB_NAME` | MariaDB Database name e.g. `invoiceninja` | |
+| `DB_USER` | MariaDB Username for above Database e.g. `invoiceninja` | |
+| `DB_PASS` | MariaDB Password for above Database e.g. `password` | |
+| `DISPLAY_ERRORS` | Display Errors on Website | `FALSE` |
+| `ENABLE_AUTO_UPDATE` | If coming from an earlier version of image, automatically update it to latest invoiceninja release | `TRUE` |
+| `ENABLE_SSL_PROXY` | If using SSL reverse proxy force application to return https URLs `TRUE` or `FALSE` | |
+| `SETUP_TYPE` | Automatically edit configuration after first bootup `AUTO` or `MANUAL` | `AUTO` |
+| `SITE_URL` | The url your site listens on example `https://invoiceninja.example.com` | |
+
+
+### Networking
+
+The following ports are exposed.
+
+| Port | Description |
+| ---- | ----------- |
+| `80` | HTTP |
+
+* * *
+## Maintenance
+
+### Shell Access
+
+For debugging and maintenance purposes you may want access the containers shell.
+
+``bash
+docker exec -it (whatever your container name is) bash
+``
+## Support
+
+These images were built to serve a specific need in a production environment and gradually have had more functionality added based on requests from the community.
+### Usage
+- The [Discussions board](../../discussions) is a great place for working with the community on tips and tricks of using this image.
+- Consider [sponsoring me](https://github.com/sponsors/tiredofit) personalized support.
+### Bugfixes
+- Please, submit a [Bug Report](issues/new) if something isn't working as expected. I'll do my best to issue a fix in short order.
+
+### Feature Requests
+- Feel free to submit a feature request, however there is no guarantee that it will be added, or at what timeline.
+- Consider [sponsoring me](https://github.com/sponsors/tiredofit) regarding development of features.
+
+### Updates
+- Best effort to track upstream changes, More priority if I am actively using the image in a production environment.
+- Consider [sponsoring me](https://github.com/sponsors/tiredofit) for up to date releases.
+
+## License
+MIT. See [LICENSE](LICENSE) for more details.
+
+## References
+
+*
diff --git a/examples/docker-compose.yml b/examples/docker-compose.yml
new file mode 100644
index 0000000..bafed13
--- /dev/null
+++ b/examples/docker-compose.yml
@@ -0,0 +1,81 @@
+version: '2'
+
+services:
+
+ invoiceninja-app:
+ image: tiredofit/invoiceninja
+ container_name: invoiceninja-app
+ links:
+ - invoiceninja-db
+ volumes:
+ ### If you want to perform customizations to the source and have access to it, then uncomment this line - This includes modules
+ #- ./data:/www/html
+ ### Or, if you just want to use Stock invoiceninja and hold onto persistent files like cache and session use this, one or the other.
+ - ./data:/data
+ ### If you want to just keep the original source and add additional modules uncomment this line
+ - ./logs/:/www/logs
+ environment:
+ - CONTAINER_NAME=invoiceninja-app
+ - TIMEZONE=America/Vancouver
+
+ - DB_HOST=invoiceninja-db
+ - DB_NAME=invoiceninja
+ - DB_USER=invoiceninja
+ - DB_PASS=invoiceninja
+
+ - SITE_URL=https://invoiceninja.example.com
+
+ - ADMIN_EMAIL=admin@admin.com
+ - ADMIN_PASS=invoiceninja
+
+ - ENABLE_SSL_PROXY=TRUE
+ - DISPLAY_ERRORS=FALSE
+ networks:
+ - proxy
+ - services
+ restart: always
+
+ invoiceninja-db:
+ image: tiredofit/mariadb:10.8-latest
+ container_name: invoiceninja-db
+ volumes:
+ - ./db:/var/lib/mysql
+ environment:
+ - CONTAINER_NAME=invoiceninja-db
+ - TIMEZONE=America/Vancouver
+
+ - ROOT_PASS=password
+ - DB_NAME=invoiceninja
+ - DB_USER=invoiceninja
+ - DB_PASS=invoiceninja
+
+ networks:
+ - services
+ restart: always
+
+ invoiceninja-db-backup:
+ container_name: invoiceninja-db-backup
+ image: tiredofit/db-backup:latst
+ links:
+ - invoiceninja-db
+ volumes:
+ - ./dbbackup:/backup
+ environment:
+ - CONTAINER_NAME=invoiceninja-db-backup
+ - DB_HOST=invoiceninja-db
+ - DB_TYPE=mariadb
+ - DB_NAME=invoiceninja
+ - DB_USER=invoiceninja
+ - DB_PASS=invoiceninja
+ - DB_DUMP_FREQ=1440
+ - DB_DUMP_BEGIN=0000
+ - DB_CLEANUP_TIME=8640
+ networks:
+ - services
+ restart: always
+
+networks:
+ proxy:
+ external: true
+ services:
+ external: true
diff --git a/install/assets/defaults/30-invoiceninja b/install/assets/defaults/30-invoiceninja
new file mode 100755
index 0000000..51dae07
--- /dev/null
+++ b/install/assets/defaults/30-invoiceninja
@@ -0,0 +1,15 @@
+#!/command/with-contenv bash
+
+DB_PORT=${DB_PORT:-3306}
+APPLICATION_NAME=${APPLICATION_NAME:-"Invoice Ninja"}
+ADMIN_FIRST_NAME=${ADMIN_FIRST_NAME:-"Admin"}
+ADMIN_LAST_NAME=${ADMIN_LAST_NAME:-"User"}
+ENABLE_AUTO_UPDATE=${ENABLE_AUTO_UPDATE:-"TRUE"}
+SETUP_TYPE=${SETUP_TYPE:-"AUTO"}
+REDIS_PORT=${REDIS_PORT:-"6379"}
+SESSION_DRIVER=${SESSION_DRIVER:-"file"}
+QUEUE_CONNECTION=${QUEUE_CONNECTION:-"database"}
+LOG_CHANNEL=${LOG_CHANNEL="stack"}
+FILESYSTEM_DRIVER=${FILESYSTEM_DRIVER:-"local"}
+REQUIRE_HTTPS=${REQUIRE_HTTPS:-"TRUE"}
+LANGUAGE=${LANGUAGE:-"en"}
\ No newline at end of file
diff --git a/install/etc/cont-init.d/30-invoiceninja b/install/etc/cont-init.d/30-invoiceninja
new file mode 100755
index 0000000..7a92c65
--- /dev/null
+++ b/install/etc/cont-init.d/30-invoiceninja
@@ -0,0 +1,260 @@
+#!/command/with-contenv bash
+
+source /assets/functions/00-container
+prepare_service
+PROCESS_NAME="invoiceninja"
+
+check_service_initialized init 20-php-fpm
+
+### Check if New Install
+if [ ! -f "${NGINX_WEBROOT}"/server.php ]; then
+ print_warn "Potential New Installation / Standalone Installation Detected - Copying Invoice Ninja Sourcecode"
+ cp -R /assets/install/* "${NGINX_WEBROOT}"
+
+ ### If running with /www/html or NGINX_WEBROOT mapped, then create persistent storage
+ ### Storage redirection
+ if [ -d "/data" ]; then
+ print_warn "Detected /data directory. Persistently saving settings/sessions/cache/uploads/modules"
+ if [ ! -d "/data/storage" ]; then
+ cp -R "${NGINX_WEBROOT}"/storage /data
+ fi
+ if [ ! -d "/data/Modules" ]; then
+ cp -R "${NGINX_WEBROOT}"/Modules /data
+ fi
+ rm -rf "${NGINX_WEBROOT}"/storage
+ ln -s /data/storage "${NGINX_WEBROOT}"/storage
+ rm -rf "${NGINX_WEBROOT}"/Modules
+ ln -s /data/Modules "${NGINX_WEBROOT}"/Modules
+ ln -sf /data/config "${NGINX_WEBROOT}"/.env
+ touch /data/config
+ chown "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"/.env
+ ln -sf /data/.invoiceninja-version "${NGINX_WEBROOT}"/.invoiceninja-version
+ chown -R "${NGINX_USER}":"${NGINX_GROUP}" /data
+ fi
+
+ ### Auto Upgrade functionality
+ if [ ! -f "${NGINX_WEBROOT}/.invoiceninja-version" ]; then
+ echo "${INVOICENINJFA_VERSION} first installed on $(date)" >> "${NGINX_WEBROOT}"/.invoiceninja-version
+ fi
+ chown -R "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"
+else
+ if [ "${ENABLE_AUTO_UPDATE,,}" = "true" ]; then
+ if [ "${INVOICENINJA_VERSION}" != $(head -n 1 "${NGINX_WEBROOT}"/.invoiceninja-version | awk '{print $1'}) ]; then
+ print_warn "Detected in place Invoice Ninja version $(head -n 1 "${NGINX_WEBROOT}"/.invoiceninja-version | awk "{print $1"}) - Upgrading to ${INVOICENINJA_VERSION}"
+ cp -R /assets/install/* "${NGINX_WEBROOT}"
+ chown -R "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"
+ cd "${NGINX_WEBROOT}"|| exit
+# silent sudo -u "${NGINX_USER}" php artisan freescout:after-app-update
+ sed -i --follow-symlinks "1 i\
+ ${INVOICENINJA_VERSION} upgraded on $(date)" /www/html/.invoiceninja-version
+ fi
+ fi
+fi
+
+### Logfile redirection
+mkdir -p /www/logs/invoiceninja
+chown -R "${NGINX_USER}":"${NGINX_GROUP}" /www/logs/invoiceninja
+rm -rf "${NGINX_WEBROOT}"/storage/logs
+ln -sf /www/logs/invoiceninja "${NGINX_WEBROOT}"/storage/logs
+
+#### Copy over any custom modules overtop of existing
+#if [ -d "/assets/modules" ]; then
+# print_warn "Detected Custom Modules - Adding to application"
+# cp -R /assets/modules/* "${NGINX_WEBROOT}"/Modules/
+# chown -R "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"/Modules/
+#fi
+#
+custom_files "${CONTAINER_CUSTOM_PATH}" "${NGINX_WEBROOT}" "${NGINX_USER}" "${NGINX_GROUP}"
+custom_scripts
+
+#### Dynamically Create Configuration
+if grep -q "APP_URL" "${NGINX_WEBROOT}"/.env > /dev/null 2>&1; then
+ if [ "${SETUP_TYPE,,}" = "auto" ]; then
+ sanity_db
+ sanity_var SITE_URL "Site URL"
+ db_ready mariadb
+
+ print_info "Auto Configuring based on Environment Variables"
+ # Proxy and Host Settings
+ if [ -z "${SITE_URL}" ]; then
+ if [ -n "${APP_URL}" ]; then
+ sed -i --follow-symlinks "s#APP_URL=.*#APP_URL=${APP_URL}#g" "${NGINX_WEBROOT}"/.env
+ fi
+ else
+ sed -i --follow-symlinks "s#APP_URL=.*#APP_URL=${SITE_URL}#g" "${NGINX_WEBROOT}"/.env
+ fi
+
+ if var_true "${ENABLE_SSL_PROXY}" || var_true "${APP_FORCE_HTTPS}" || var_true "${REQUIRE_HTTPS}" ; then
+ sed -i --follow-symlinks "s#REQUIRE_HTTPS=.*#REQUIRE_HTTPS=true#g" "${NGINX_WEBROOT}"/.env
+# sed -i --follow-symlinks "s#SESSION_SECURE_COOKIE=.*#SESSION_SECURE_COOKIE=true#g" "${NGINX_WEBROOT}"/.env
+ else
+ sed -i --follow-symlinks "s#REQUIRE_HTTPS=.*#REQUIRE_HTTPS=false#g" "${NGINX_WEBROOT}"/.env
+# sed -i --follow-symlinks "s#SESSION_SECURE_COOKIE=.*#SESSION_SECURE_COOKIE=false#g" "${NGINX_WEBROOT}"/.env
+ fi
+#
+# if var_true "${APP_DEBUG}" || var_true "${DISPLAY_ERRORS}" ; then
+# sed -i --follow-symlinks "s#APP_DEBUG=.*#APP_DEBUG=true#g" "${NGINX_WEBROOT}"/.env
+# else
+# sed -i --follow-symlinks "s#APP_DEBUG=.*#APP_DEBUG=false#g" "${NGINX_WEBROOT}"/.env
+# fi
+#
+ sed -i --follow-symlinks "s#DB_HOST=.*#DB_HOST=${DB_HOST}#g" "${NGINX_WEBROOT}"/.env
+ sed -i --follow-symlinks "s#DB_PORT=.*#DB_PORT=${DB_PORT}#g" "${NGINX_WEBROOT}"/.env
+ sed -i --follow-symlinks "s#DB_DATABASE=.*#DB_DATABASE=${DB_NAME}#g" "${NGINX_WEBROOT}"/.env
+ sed -i --follow-symlinks "s#DB_USERNAME=.*#DB_USERNAME=${DB_USER}#g" "${NGINX_WEBROOT}"/.env
+ sed -i --follow-symlinks "s#DB_PASSWORD=.*#DB_PASSWORD=${DB_PASS}#g" "${NGINX_WEBROOT}"/.env
+#
+ else
+ print_info "Skipping Auto configuration and using in place .env"
+ fi
+ if [ -f /data/config ]; then
+ chown "${NGINX_USER}":"${NGINX_GROUP}" /data/config
+ chmod 0755 /data/config
+ fi
+else
+ ### Sanity Test
+ sanity_db
+ sanity_var SITE_URL "Site URL"
+ db_ready mariadb
+
+ print_info "Generating Configuration"
+ touch "${NGINX_WEBROOT}"/.env
+ chown "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"/.env
+ echo "#### Automatically Generated File - Upon container restart any settings will reset!" | silent sudo -u "${NGINX_USER}" tee "${NGINX_WEBROOT}"/.env
+ # Proxy and HostSettings
+ if [ -z "${SITE_URL}" ]; then
+ if [ -n "${APP_URL}" ]; then
+ echo "APP_URL=$APP_URL" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ fi
+ else
+ echo "APP_URL=$SITE_URL" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ fi
+
+ if var_true "${ENABLE_SSL_PROXY}" || var_true "${APP_FORCE_HTTPS}" || var_true "${REQUIRE_HTTPS}" ; then
+ echo "REQUIRE_HTTPS=true" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+# echo "SESSION_SECURE_COOKIE=true" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ else
+ echo "REQUIRE_HTTPS=false" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+# echo "SESSION_SECURE_COOKIE=false" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ fi
+#
+# if [ -n "${APP_PROXY}" ] ; then
+# echo "APP_PROXY=${APP_PROXY}" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+# fi
+#
+ if var_true "${APP_DEBUG}" || var_true "${DISPLAY_ERRORS}" ; then
+ echo "APP_DEBUG=true" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ else
+ echo "APP_DEBUG=false" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ fi
+
+ echo "APP_KEY=" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+#
+ # Set DB Settings
+ echo "DB_CONNECTION=mysql" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "DB_HOST=$DB_HOST" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "DB_PORT=$DB_PORT" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "DB_DATABASE=$DB_NAME" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "DB_USERNAME=$DB_USER" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "DB_PASSWORD=$DB_PASS" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+
+ echo "TRUSTED_PROXIES=*" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "NINJA_ENVIRONMENT=selfhost" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+
+ echo "LOG=single" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "APP_LOCALE=${LANGUAGE}" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+ echo "MAIL_MAILER=log" | silent sudo -u "${NGINX_USER}" tee -a "${NGINX_WEBROOT}"/.env
+
+ # Generate Key
+ cd "${NGINX_WEBROOT}"/
+ chown -R "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"/config
+ if [ -f /data/config ]; then
+ chown "${NGINX_USER}":"${NGINX_GROUP}" /data/config
+ chmod 0755 /data/config
+ fi
+ silent sudo -u "${NGINX_USER}" php artisan key:generate
+fi
+
+### Cleanup
+cd "${NGINX_WEBROOT}"/
+#silent sudo -u "${NGINX_USER}" php artisan freescout:clear-cache
+silent sudo -u "${NGINX_USER}" php artisan optimize
+silent sudo -u "${NGINX_USER}" php artisan storage:link
+
+### Check to see if DB is populated
+mysql -u $DB_USER -p$DB_PASS -h$DB_HOST -P$DB_PORT -e "use "$DB_NAME"; SELECT * FROM users;" > /dev/null 2>&1
+if [ $? -gt 0 ]; then
+ ### Perform Database Installtion Routines
+ print_warn "Detected empty Database - Setting up - Please wait.."
+ sleep 5
+ silent sudo -u "${NGINX_USER}" php artisan migrate:fresh --force
+# silent sudo -u "${NGINX_USER}" php artisan freescout:clear-cache
+#
+ sanity_var ADMIN_EMAIL "Admin Email Address"
+ sanity_var ADMIN_PASS "Admin Password"
+#
+# ### Create User
+# print_warn "Creating Administrative User"
+ cd "${NGINX_WEBROOT}"
+ silent sudo -u "${NGINX_USER}" php artisan -n ninja:create-account --email="${ADMIN_EMAIL}" --password="${ADMIN_PASS}"
+fi
+
+cd "${NGINX_WEBROOT}"
+#chown -R "${NGINX_USER}":"${NGINX_GROUP}" storage bootstrap/cache public/css/builds public/js/builds
+#chmod -R ug+rwx storage bootstrap/cache public/css/builds public/js/builds
+#chown -R "${NGINX_USER}":"${NGINX_GROUP}" "${NGINX_WEBROOT}"
+#chmod ug+rwx "${NGINX_WEBROOT}"
+#
+#### Install symlinks for modules that may have been previously installed
+#if [ "$(ls -A /www/html/Modules)" ]; then
+# print_warn "Installing Modules into container"
+# silent /usr/bin/expect<> /root/.bashrc < "${CONTAINER_SCHEDULING_LOCATION}"/invoiceninja-schedule
+# Hardcoded in image in /etc/cont-init.d/$(basename "$0")
+# Generated on $(TZ=${TIMEZONE} date +'%Y-%m-%d %H:%M:%S %Z')
+#
+#* * * * * sudo -u ${NGINX_USER} TZ=${TIMEZONE} LD_PRELOAD=/usr/lib/preloadable_libiconv.so php ${NGINX_WEBROOT}/artisan schedule:run >> /dev/null 2>&1
+#EOF
+
+print_info "Initialization Complete. Please visit ${SITE_URL} and login with your credentials.."
+
+liftoff
diff --git a/install/etc/nginx/sites.available/invoiceninja.conf b/install/etc/nginx/sites.available/invoiceninja.conf
new file mode 100644
index 0000000..52ce534
--- /dev/null
+++ b/install/etc/nginx/sites.available/invoiceninja.conf
@@ -0,0 +1,59 @@
+server {
+
+ listen {{NGINX_LISTEN_PORT}};
+ root {{NGINX_WEBROOT}}/public;
+ index index.php ;
+
+ location / {
+ try_files $uri $uri/ /index.php?$query_string;
+ }
+
+ location ~ \.php$ {
+ include /etc/nginx/snippets/php-fpm.conf;
+ try_files $uri =404;
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ fastcgi_index index.php;
+ include fastcgi_params;
+ }
+
+ location ~* \.pdf$ {
+ add_header Cache-Control no-store;
+ }
+
+ location ~* ^/storage/attachment/ {
+ expires 1M;
+ access_log off;
+ try_files $uri $uri/ /index.php?$query_string;
+ }
+
+ if (!-e $request_filename) {
+ rewrite ^(.+)$ /index.php?q= last;
+ }
+
+ location ~* ^/(?:css|js)/.*\.(?:css|js)$ {
+ expires 2d;
+ access_log off;
+ add_header Cache-Control "public, must-revalidate";
+ }
+
+ location ~* \.pdf$ {
+ add_header Cache-Control no-store;
+ }
+
+ location ~* ^/(?:css|fonts|img|installer|js|modules|[^\\\]+\..*)$ {
+ expires 1M;
+ access_log off;
+ add_header Cache-Control "public";
+ }
+
+ location ~ /\. {
+ deny all;
+ }
+
+ ### Don't edit past here
+ include /etc/nginx/snippets/site_optimization.conf;
+ include /etc/nginx/snippets/exploit_protection.conf;
+}
+
+