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; +} + +