mirror of
https://github.com/invoiceninja/dockerfiles.git
synced 2026-01-02 04:27:27 +01:00
Compare commits
350 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
91c7b1ea2a | ||
|
|
a508ccc41e | ||
|
|
d42f66617c | ||
|
|
8746015041 | ||
|
|
53c38b65f9 | ||
|
|
473e38259f | ||
|
|
d538666600 | ||
|
|
0ace427585 | ||
|
|
8c1357fc4c | ||
|
|
806a340a00 | ||
|
|
d437dab72c | ||
|
|
d64ed83abf | ||
|
|
337f38e0dc | ||
|
|
5d5c036175 | ||
|
|
d5ed1935f7 | ||
|
|
5e40e34943 | ||
|
|
c4e1d0e3a5 | ||
|
|
84dcb8caab | ||
|
|
733e72d5dd | ||
|
|
7eaf6968d2 | ||
|
|
66408fccb2 | ||
|
|
79647d4f8c | ||
|
|
067b5eb194 | ||
|
|
eed358c32b | ||
|
|
71909c73e0 | ||
|
|
fab57c9db3 | ||
|
|
e7bc565745 | ||
|
|
87092bb8bd | ||
|
|
5abd297c7f | ||
|
|
8be252781f | ||
|
|
f281b33ea1 | ||
|
|
22d170a4e5 | ||
|
|
f722c91d21 | ||
|
|
641b527702 | ||
|
|
d139a48303 | ||
|
|
a75b6f0a00 | ||
|
|
113c700754 | ||
|
|
b6be06c977 | ||
|
|
8c53895c97 | ||
|
|
8204465048 | ||
|
|
baad65c737 | ||
|
|
9fd35b874d | ||
|
|
fe4993f8a3 | ||
|
|
b83fb831b9 | ||
|
|
687e74c983 | ||
|
|
7644151370 | ||
|
|
c84f80f9a9 | ||
|
|
6cfdca078f | ||
|
|
74ed1b2432 | ||
|
|
b3b7f7b9f0 | ||
|
|
a6d8f663ae | ||
|
|
3024f11a31 | ||
|
|
6274c432d9 | ||
|
|
f5afd3f527 | ||
|
|
3ce5983131 | ||
|
|
bfc61fb64e | ||
|
|
535d6d4c06 | ||
|
|
24d49a4374 | ||
|
|
30ad63f306 | ||
|
|
60fd0aa79e | ||
|
|
d1786100ca | ||
|
|
f58ca724c9 | ||
|
|
53cadbf750 | ||
|
|
3fca330958 | ||
|
|
7d79b39bc2 | ||
|
|
aa271a1488 | ||
|
|
451c1b872f | ||
|
|
5c74753da2 | ||
|
|
83f17aa669 | ||
|
|
394c4c8b5e | ||
|
|
9ed63a6762 | ||
|
|
cb6d6d46c2 | ||
|
|
3b0e475de6 | ||
|
|
d5bb90fa04 | ||
|
|
1b62d86659 | ||
|
|
4431abcb88 | ||
|
|
d05e55a24e | ||
|
|
34e5043317 | ||
|
|
6f92d1c155 | ||
|
|
11330003a2 | ||
|
|
47b015af7c | ||
|
|
c6648a8511 | ||
|
|
de2036adff | ||
|
|
ea8c5fed8e | ||
|
|
c2f8cedc4a | ||
|
|
7ddfe8a793 | ||
|
|
196e66e06d | ||
|
|
7498a94bd1 | ||
|
|
8289c6c65e | ||
|
|
b75ac4fd87 | ||
|
|
94d3f6212e | ||
|
|
a940bf2ed2 | ||
|
|
76ca42bddb | ||
|
|
84194970b3 | ||
|
|
919e15fb40 | ||
|
|
2b8bb21d04 | ||
|
|
8ff82909c8 | ||
|
|
7ce743bd91 | ||
|
|
ffc777d5f1 | ||
|
|
1446bfabfc | ||
|
|
5ae3240677 | ||
|
|
1fc60549c2 | ||
|
|
a5ad84f22b | ||
|
|
e5847a6ff1 | ||
|
|
1c1bc350dc | ||
|
|
e83372d437 | ||
|
|
22b2f5416a | ||
|
|
dbb671eeab | ||
|
|
baf7b2bff7 | ||
|
|
db7c7de624 | ||
|
|
e8b62de217 | ||
|
|
065a7f94e6 | ||
|
|
47c2ee05b9 | ||
|
|
adeba71a55 | ||
|
|
65d5904f35 | ||
|
|
00a346853c | ||
|
|
ee74e6170c | ||
|
|
857eaf86bb | ||
|
|
b8dbe76900 | ||
|
|
bf07c49d31 | ||
|
|
397d19c06d | ||
|
|
4d16fb2efc | ||
|
|
01b30fdb1a | ||
|
|
814b8bd283 | ||
|
|
201a229ec7 | ||
|
|
1a144db29a | ||
|
|
655e7b61ea | ||
|
|
113ed64aee | ||
|
|
6430ddcb92 | ||
|
|
7a9d5f7187 | ||
|
|
eeaaf95d47 | ||
|
|
b338ef90cb | ||
|
|
1f778c0945 | ||
|
|
b65257db66 | ||
|
|
9941847af7 | ||
|
|
edf21b5d4f | ||
|
|
7acd479cfd | ||
|
|
bed751ce18 | ||
|
|
303bc81d3d | ||
|
|
47e5c41a19 | ||
|
|
89a994b12f | ||
|
|
5984339118 | ||
|
|
47dba02b27 | ||
|
|
1aca36878c | ||
|
|
cf324703a8 | ||
|
|
df2ea66cda | ||
|
|
02eed022ac | ||
|
|
738546d7b1 | ||
|
|
e31a2b77bc | ||
|
|
50debff2da | ||
|
|
492d895d06 | ||
|
|
51294f6b76 | ||
|
|
81617a3dec | ||
|
|
a874ceb7c2 | ||
|
|
4a3d8783d4 | ||
|
|
84a6637f80 | ||
|
|
821f3f5ec7 | ||
|
|
dafd4051d3 | ||
|
|
c6b44487f3 | ||
|
|
b2e03ce544 | ||
|
|
78fd70118a | ||
|
|
59616eada8 | ||
|
|
0fab60378a | ||
|
|
47db01612d | ||
|
|
1a1cea632b | ||
|
|
5609b988f3 | ||
|
|
0f9d39998f | ||
|
|
fd01abb0a0 | ||
|
|
6887e2b30a | ||
|
|
6faf1dc135 | ||
|
|
d7cd59c80f | ||
|
|
8206377870 | ||
|
|
93214291c9 | ||
|
|
f3477e6e80 | ||
|
|
d766e8284c | ||
|
|
08e24b4b01 | ||
|
|
43cc7417ba | ||
|
|
150abf1d6e | ||
|
|
31b3d309b3 | ||
|
|
cb74a1f93b | ||
|
|
f566ec5715 | ||
|
|
91cc86af6d | ||
|
|
7bac478538 | ||
|
|
f93fa6b874 | ||
|
|
d9a40ebb43 | ||
|
|
db5d0ebf50 | ||
|
|
926b3d618b | ||
|
|
85d256a435 | ||
|
|
acf9c22ff7 | ||
|
|
b0ebac9719 | ||
|
|
65c5ceb69b | ||
|
|
6aa39b4b57 | ||
|
|
c4ac430d1b | ||
|
|
87066953d3 | ||
|
|
3969a37852 | ||
|
|
bec60de1e7 | ||
|
|
c0150debbf | ||
|
|
f45261617f | ||
|
|
21b6cf1f26 | ||
|
|
d3a4948641 | ||
|
|
a9a6b72c7a | ||
|
|
4fd6ca33c8 | ||
|
|
bca8404f5f | ||
|
|
3cf7c28875 | ||
|
|
96dee55e7f | ||
|
|
ae592a8407 | ||
|
|
b72757ead0 | ||
|
|
a20fc14683 | ||
|
|
0e2934d1e3 | ||
|
|
fefc51ccf1 | ||
|
|
acdd6851ff | ||
|
|
6ff8e04aa7 | ||
|
|
86f1dd43cf | ||
|
|
cc1f569324 | ||
|
|
c78f7a7bdf | ||
|
|
7198222787 | ||
|
|
4ef4531a4e | ||
|
|
c51d113abe | ||
|
|
dddd558873 | ||
|
|
5727550983 | ||
|
|
03536efb6a | ||
|
|
6a05bdbbd5 | ||
|
|
e5debf03d4 | ||
|
|
33a55e362b | ||
|
|
70e1de9a95 | ||
|
|
e1b113bba1 | ||
|
|
c967aaccf4 | ||
|
|
15aefa698b | ||
|
|
c9beedc84b | ||
|
|
d409d9696a | ||
|
|
7d977a41e3 | ||
|
|
8db5c792a8 | ||
|
|
b3768cbed3 | ||
|
|
25d2d1d271 | ||
|
|
abfb5d1338 | ||
|
|
300c2d236d | ||
|
|
56e451ea8b | ||
|
|
ad3ffc227d | ||
|
|
e64db79c75 | ||
|
|
5fcad81fc2 | ||
|
|
2e383ef879 | ||
|
|
bb6b3dc1e8 | ||
|
|
4a7b28f1d0 | ||
|
|
1699ddde65 | ||
|
|
63431878b8 | ||
|
|
03cc1ff548 | ||
|
|
4aa7a7032c | ||
|
|
4fa02c2785 | ||
|
|
d25210c8b9 | ||
|
|
f97fdda827 | ||
|
|
5188c45b41 | ||
|
|
e3873bcac2 | ||
|
|
24ef742ce1 | ||
|
|
886dfe7832 | ||
|
|
0054620e55 | ||
|
|
4b82f750fc | ||
|
|
97d339df4e | ||
|
|
906cfb0c87 | ||
|
|
62a7f6d7cf | ||
|
|
1d97234b51 | ||
|
|
aab280dcc1 | ||
|
|
faffcadc45 | ||
|
|
25b3654a53 | ||
|
|
46cd35bf32 | ||
|
|
53b4e6dafd | ||
|
|
27b6c82fe4 | ||
|
|
64fdd58ba9 | ||
|
|
85519a0038 | ||
|
|
5d5f34b7e7 | ||
|
|
774b8cb6eb | ||
|
|
76a0886278 | ||
|
|
2bac5707ae | ||
|
|
c17e37c4b8 | ||
|
|
08f9493f0d | ||
|
|
40f483a32d | ||
|
|
eb58c26ebf | ||
|
|
d50bfde676 | ||
|
|
c12e985f81 | ||
|
|
8ef0df3d41 | ||
|
|
f55e9a2b49 | ||
|
|
e3f47d2932 | ||
|
|
1636faf40d | ||
|
|
ea285c41ec | ||
|
|
1537b87a3d | ||
|
|
225c0eb275 | ||
|
|
34878d0f93 | ||
|
|
8b9e69d51b | ||
|
|
7238e521e6 | ||
|
|
5a1bf5c430 | ||
|
|
7a935a0eef | ||
|
|
ff897d568f | ||
|
|
b0bb0ffd25 | ||
|
|
3902b40bc1 | ||
|
|
29e2d93e59 | ||
|
|
b7aea66e62 | ||
|
|
e2db08f207 | ||
|
|
59291d8687 | ||
|
|
6f747207ec | ||
|
|
c2aabd14ac | ||
|
|
07f1e601ab | ||
|
|
13423d38c0 | ||
|
|
e34ac95617 | ||
|
|
6c68882449 | ||
|
|
8e9e7c47da | ||
|
|
7da83b40f4 | ||
|
|
1b48ab6983 | ||
|
|
14357b93a1 | ||
|
|
8a68fda3f3 | ||
|
|
4ee20766ef | ||
|
|
5ba28528c3 | ||
|
|
9388f66a29 | ||
|
|
b445cf0402 | ||
|
|
11c8901fe4 | ||
|
|
3814e957e0 | ||
|
|
62b1d8cb94 | ||
|
|
4cd773700e | ||
|
|
9f6e086633 | ||
|
|
8df49feaf8 | ||
|
|
de856d0a88 | ||
|
|
1f7458c9f7 | ||
|
|
40e3add863 | ||
|
|
f4f8c79ce7 | ||
|
|
524e79c486 | ||
|
|
4ec70c8da6 | ||
|
|
176e2c96d6 | ||
|
|
36db897022 | ||
|
|
022cf8c1e8 | ||
|
|
517ef61313 | ||
|
|
8e75344717 | ||
|
|
e19641f754 | ||
|
|
789e49fe1b | ||
|
|
d462cd64ed | ||
|
|
51629ef283 | ||
|
|
8d37d6a4c5 | ||
|
|
a604f4e8b6 | ||
|
|
18fb27ad9f | ||
|
|
ff1dfee088 | ||
|
|
f16815e960 | ||
|
|
c0350de418 | ||
|
|
f175fa4fb0 | ||
|
|
0d93596cde | ||
|
|
10aaf3fb6e | ||
|
|
8117d0c5bd | ||
|
|
fef92891cb | ||
|
|
7f415803fb | ||
|
|
1caa8c7e70 | ||
|
|
e35653fe59 | ||
|
|
4d7cc8e464 | ||
|
|
f42fc93aa5 | ||
|
|
f9f79ceb21 |
48
.github/ISSUE_TEMPLATE/bug_report.md
vendored
48
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,20 +7,52 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Before creating an issue
|
||||
<!--
|
||||
*** Before creating an issue ***
|
||||
*** Be sure the issue isn't yet reported here or dicussed on stackoverflow ***
|
||||
-->
|
||||
|
||||
Be sure the issue isn't yet reported here or dicussed on stackoverflow
|
||||
**Setup information**
|
||||
<!-- Remove accordingly -->
|
||||
docker run / docker-compose / Helm
|
||||
|
||||
# Logs
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
Did you check the logs ?
|
||||
If any Error is present there please copy/paste it below
|
||||
**To reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots/logs**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
<!-- Did you check the logs? If any Error is present there please copy/paste it below -->
|
||||
```
|
||||
Any Error that sucks
|
||||
```
|
||||
|
||||
# Setup information
|
||||
**Docker/Kubernetes/Helm**:
|
||||
- Output of `docker version`:
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
<!-- Additional info if using helm on k8s, add the info below -->
|
||||
<!-- Delete this block if not applicable -->
|
||||
- Output of `helm version`:
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
- Output of `kubectl version`:
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
<!-- End Additional info if using helm on k8s -->
|
||||
|
||||
What version do you run?
|
||||
Do you run docker-compose or a single Dockerfile ?
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
6
.github/ct-install.yaml
vendored
Normal file
6
.github/ct-install.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
chart-dirs:
|
||||
- charts
|
||||
chart-repos:
|
||||
- bitnami=https://charts.bitnami.com/bitnami
|
||||
check-version-increment: true
|
||||
debug: false
|
||||
9
.github/ct-lint.yaml
vendored
Normal file
9
.github/ct-lint.yaml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
chart-dirs:
|
||||
- charts
|
||||
chart-repos:
|
||||
- bitnami=https://charts.bitnami.com/bitnami
|
||||
check-version-increment: true
|
||||
debug: false
|
||||
validate-chart-schema: true
|
||||
validate-maintainers: true
|
||||
validate-yaml: true
|
||||
38
.github/workflows/build-image-debian.yaml
vendored
Normal file
38
.github/workflows/build-image-debian.yaml
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
name: Build Debian Container Image
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "debian/**"
|
||||
push:
|
||||
paths:
|
||||
- "debian/**"
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build
|
||||
id: docker_build
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: debian
|
||||
file: debian/Dockerfile
|
||||
load: true
|
||||
tags: invoiceninja/invoiceninja-debian:test
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
35
.github/workflows/build_push.yml
vendored
35
.github/workflows/build_push.yml
vendored
@@ -1,35 +0,0 @@
|
||||
name: Docker images
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Build images
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Login to DockerHub
|
||||
run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
|
||||
|
||||
- name: Get the latest tag
|
||||
id: vars
|
||||
run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
|
||||
|
||||
- name: Build image from alpine - v5
|
||||
run: make build-alpine-v5 TAG="${{steps.vars.outputs.tag}}"
|
||||
|
||||
- name: Push alpine-based image - v5
|
||||
run: make push-alpine-v5 TAG="${{steps.vars.outputs.tag}}"
|
||||
|
||||
- name: Build image from alpine - v4
|
||||
run: make build-alpine TAG="${{steps.vars.outputs.tag}}"
|
||||
|
||||
- name: Push alpine-based image - v4
|
||||
run: make push-alpine TAG="${{steps.vars.outputs.tag}}"
|
||||
|
||||
- name: Logout from DockerHub
|
||||
run: docker logout
|
||||
75
.github/workflows/publish-image.yaml
vendored
Normal file
75
.github/workflows/publish-image.yaml
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
name: Publish Debian Container Images
|
||||
|
||||
on:
|
||||
push:
|
||||
tags-ignore:
|
||||
- "invoiceninja-*"
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- image: invoiceninja/invoiceninja-debian
|
||||
context: ./debian
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4 # Updated from v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Prepare
|
||||
id: prep
|
||||
run: |
|
||||
DOCKER_IMAGE=${{ matrix.image }}
|
||||
VERSION=edge
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/}
|
||||
fi
|
||||
TAGS="${DOCKER_IMAGE}:${VERSION}"
|
||||
MAJOR="$(echo "${VERSION}" | cut -d. -f1)"
|
||||
MINOR="$(echo "${VERSION}" | cut -d. -f2)"
|
||||
TAGS="$TAGS,${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:${MAJOR}.${MINOR}"
|
||||
|
||||
# Debug output
|
||||
echo "Current version: ${VERSION}"
|
||||
echo "Version pattern check: $([[ $VERSION =~ ^5\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && echo "matches" || echo "doesn't match")"
|
||||
|
||||
TAGS="$TAGS,${DOCKER_IMAGE}:latest"
|
||||
|
||||
echo "tags=${TAGS}" >> $GITHUB_OUTPUT # Updated output syntax
|
||||
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
||||
echo "major=${MAJOR}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3 # Updated from v1
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3 # Updated from v1
|
||||
|
||||
- name: Login to DockerHub
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3 # Updated from v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Build and push
|
||||
id: docker_build
|
||||
uses: docker/build-push-action@v5 # Updated from v2
|
||||
with:
|
||||
context: ${{ matrix.context }}
|
||||
build-args: INVOICENINJA_VERSION=${{ steps.prep.outputs.version }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
cache-from: type=gha # Updated cache type
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Image digest
|
||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||
34
.github/workflows/release-chart.yaml
vendored
Normal file
34
.github/workflows/release-chart.yaml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Release Charts
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- "charts/**"
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config user.name "$GITHUB_ACTOR"
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Set up Helm
|
||||
uses: azure/setup-helm@v3
|
||||
|
||||
- name: Add Helm repos
|
||||
run: |
|
||||
helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.4.1
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
111
.github/workflows/test-charts.yaml
vendored
Normal file
111
.github/workflows/test-charts.yaml
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
name: Lint and Test Charts
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "charts/**"
|
||||
|
||||
jobs:
|
||||
lint-chart:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Helm
|
||||
uses: azure/setup-helm@v3
|
||||
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.9"
|
||||
check-latest: true
|
||||
|
||||
- name: Set up chart-testing
|
||||
uses: helm/chart-testing-action@v2.3.1
|
||||
|
||||
- name: Run chart-testing (list-changed)
|
||||
id: list-changed
|
||||
run: |
|
||||
echo "::set-output name=changed::[\"$(ct list-changed --config .github/ct-lint.yaml)\"]"
|
||||
|
||||
- name: Parse list-changed
|
||||
id: set-matrix
|
||||
env:
|
||||
CHANGED: ${{ steps.list-changed.outputs.changed }}
|
||||
run: |
|
||||
echo "::set-output name=matrix::$(echo "${CHANGED//\\n/\",\"}")"
|
||||
|
||||
- name: Run chart-testing (lint)
|
||||
run: ct lint --config .github/ct-lint.yaml
|
||||
|
||||
kubeconform-chart:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- lint-chart
|
||||
strategy:
|
||||
matrix:
|
||||
chart: ${{ fromJson(needs.lint-chart.outputs.matrix) }}
|
||||
k8s:
|
||||
- "1.25.5"
|
||||
- "1.24.9"
|
||||
- "1.23.15"
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Update Helm depdendencies
|
||||
env:
|
||||
CHART_DIR: ${{ matrix.chart }}
|
||||
run: |
|
||||
helm dependency update "${CHART_DIR}"
|
||||
mkdir tmp
|
||||
helm template "${CHART_DIR}" > tmp/combined.yaml
|
||||
|
||||
- uses: yokawasa/action-setup-kube-tools@v0.9.2
|
||||
with:
|
||||
setup-tools: |
|
||||
kubeconform
|
||||
|
||||
- name: Run kubeconform
|
||||
if: ${{ matrix.k8s }}
|
||||
run: kubeconform -kubernetes-version ${{ matrix.k8s }} tmp/combined.yaml
|
||||
|
||||
install-chart:
|
||||
name: install-chart
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- lint-chart
|
||||
- kubeconform-chart
|
||||
strategy:
|
||||
matrix:
|
||||
k8s:
|
||||
- v1.25.3
|
||||
- v1.24.7
|
||||
- v1.23.13
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Create kind ${{ matrix.k8s }} cluster
|
||||
uses: helm/kind-action@v1.4.0
|
||||
with:
|
||||
node_image: kindest/node:${{ matrix.k8s }}
|
||||
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.9"
|
||||
check-latest: true
|
||||
|
||||
- name: Set up chart-testing
|
||||
uses: helm/chart-testing-action@v2.3.1
|
||||
|
||||
- name: Run chart-testing (install)
|
||||
run: ct install --config .github/ct-install.yaml
|
||||
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# OS files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# Helm
|
||||
charts/**/charts/
|
||||
|
||||
# Compose filesystem
|
||||
/docker
|
||||
58
Makefile
58
Makefile
@@ -1,58 +0,0 @@
|
||||
ifndef TAG
|
||||
$(error The TAG variable is missing.)
|
||||
endif
|
||||
|
||||
# Docker Hub namespace
|
||||
HUB_NAMESPACE="invoiceninja"
|
||||
|
||||
# Image name
|
||||
IMAGE="invoiceninja"
|
||||
|
||||
# Check if v5 tag is passed, so that a v5 version should be built
|
||||
IS_V5=$(shell echo ${TAG} | egrep ^5)
|
||||
|
||||
# Version of Invoice Ninja. As the tag can be something like 5.0.4-p1, the version is 5.0.4.
|
||||
# This supports changes to the Dockerfiles with always the same Invoice Ninja version
|
||||
VERSION=$(shell echo ${TAG} | sed "s/-.*//")
|
||||
|
||||
# Building docker images based on alpine.
|
||||
# Assigned tags:
|
||||
# - :alpine
|
||||
# - :alpine-<RELEASE VERSION>
|
||||
.PHONY: build-alpine
|
||||
build-alpine:
|
||||
ifeq ($(IS_V5),)
|
||||
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
||||
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile .
|
||||
# Tag as alpine-4
|
||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} ${HUB_NAMESPACE}/${IMAGE}:alpine-4
|
||||
$(info Make: Done.)
|
||||
endif
|
||||
|
||||
.PHONY: push-alpine
|
||||
push-alpine:
|
||||
ifeq ($(IS_V5),)
|
||||
$(info Make: Pushing tagged images from alpine.)
|
||||
@docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION}
|
||||
@docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-4
|
||||
$(info Make: Done.)
|
||||
endif
|
||||
|
||||
.PHONY: build-alpine-v5
|
||||
build-alpine-v5:
|
||||
ifneq ($(IS_V5),)
|
||||
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
||||
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile_v5 .
|
||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:5
|
||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:latest
|
||||
$(info Make: Done.)
|
||||
endif
|
||||
|
||||
.PHONY: push-alpine-v5
|
||||
push-alpine-v5:
|
||||
ifneq ($(IS_V5),)
|
||||
$(info Make: Pushing tagged images from alpine.)
|
||||
@docker push ${HUB_NAMESPACE}/${IMAGE}:${VERSION}
|
||||
@docker push ${HUB_NAMESPACE}/${IMAGE}:5
|
||||
@docker push ${HUB_NAMESPACE}/${IMAGE}:latest
|
||||
endif
|
||||
112
README.md
112
README.md
@@ -1,75 +1,95 @@
|
||||

|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja)
|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja)
|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja-debian)
|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja-debian)
|
||||
[](https://github.com/invoiceninja/dockerfiles/actions/workflows/publish-image.yaml)
|
||||
[](https://github.com/invoiceninja/dockerfiles/actions/workflows/build-image-v5.yaml)
|
||||
|
||||
# Docker for [Invoice Ninja](https://www.invoiceninja.com/)
|
||||
# Debian Docker for [Invoice Ninja](https://www.invoiceninja.com/)
|
||||
|
||||
:crown: **Features**
|
||||
|
||||
:lock: Automatic HTTPS (:heart: [Caddy](https://caddyserver.com/))
|
||||
:fire: NGINX webserver support [NGINX](https://nginx.org/)
|
||||
:hammer: Fully production-ready through docker-compose
|
||||
:pencil: Adjustable to your needs via environment variable
|
||||
NGINX webserver support [NGINX](https://nginx.org/)
|
||||
Built-in Chrome for PDF generation and other features
|
||||
Saxon XLST 2 engine
|
||||
OPcache
|
||||
Multi language support
|
||||
|
||||
## Quickstart V5 Launch
|
||||
## Get started with Docker Compose
|
||||
|
||||
The dockerfile has been revamped to make is easier to get started, by default the base image selected in 5 which will pull in the latest v5 stable image.
|
||||
This Debian-based image includes Chrome for enhanced PDF generation and other features. To get started:
|
||||
|
||||
```
|
||||
git clone https://github.com/invoiceninja/dockerfiles.git
|
||||
cd dockerfiles
|
||||
```bash
|
||||
git clone https://github.com/invoiceninja/dockerfiles.git -b debian
|
||||
cd dockerfiles/debian
|
||||
```
|
||||
|
||||
Instead of defining our environment variables inside our docker-compose.yml file we now define this in the ```env``` file, open this file up and insert your APP_URL and your APP_KEY
|
||||
Instead of defining our environment variables inside our docker-compose.yml file we now define this in the `.env` file, open this file up and insert your `APP_URL`, `APP_KEY` and update the rest of the variables as required.
|
||||
|
||||
```
|
||||
APP_URL=http://in.localhost:8003/
|
||||
APP_KEY=<insert your generated key in here>
|
||||
APP_DEBUG=true
|
||||
MULTI_DB_ENABLED=false
|
||||
DB_HOST1=db
|
||||
DB_USERNAME1=ninja
|
||||
DB_PASSWORD1=ninja
|
||||
DB_DATABASE1=ninja
|
||||
PHANTOMJS_PDF_GENERATION=false
|
||||
REQUIRE_HTTPS=false
|
||||
IN_USER_EMAIL=
|
||||
IN_PASSWORD=
|
||||
```
|
||||
|
||||
The ```APP_KEY``` can be generated by running
|
||||
## Initial account setup
|
||||
|
||||
```
|
||||
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show
|
||||
### Primary account setup
|
||||
Prior to starting the container for the first time, open the .env file and update the IN_USER_EMAIL and IN_PASSWORD variables with your primary account.
|
||||
|
||||
This will take care of the initial account setup. You can later remove these .env variables.
|
||||
|
||||
> ⚠️ **Warning**
|
||||
> If `IN_USER_EMAIL` and `IN_PASSWORD` are not set the default user email and password is "admin@example.com" and "changeme!" respectively.
|
||||
|
||||
After the container has completed the first startup you can delete these two environment variables.
|
||||
|
||||
### Generate a APP_KEY
|
||||
|
||||
The `APP_KEY` can be generated by running:
|
||||
|
||||
```bash
|
||||
# If you haven't started the containers yet:
|
||||
docker run --rm -it invoiceninja/invoiceninja-debian php artisan key:generate --show
|
||||
|
||||
# Or if your containers are already running:
|
||||
docker-compose exec app php artisan key:generate --show
|
||||
```
|
||||
|
||||
Copy the entire string and insert in the env file at ```APP_KEY=base64....```
|
||||
Copy the entire string and insert in the .env file at `APP_KEY=base64....`
|
||||
|
||||
To ensure folder permissions are correct when the container comes up for the first time it is important that you set the correct folder permissions on the ```docker``` folder.
|
||||
**Note: For PDF generation using localhost, your domain name MUST end in .test for PDFs to generate correctly due to Chrome's DNS resolver.
|
||||
|
||||
From the terminal run
|
||||
Start the container with:
|
||||
|
||||
```sudo chown -R 1500:1500 docker/app```
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Note for people running the container locally on their PC ###
|
||||
**Note: When performing the setup, the Database host is ```mysql```
|
||||
|
||||
If you are running the container locally, then the container will need to resolve the host, to support this you will want to insert your LAN IP address and the host name in the hosts file located in ```config/hosts```
|
||||
### Updating the Image
|
||||
|
||||
For example, lets say your APP_URL is ```http://in5.test:8000``` and your LAN IP is 192.168.0.124 the hosts file will have an entry looking like this:
|
||||
To upgrade to a newer release image, update your docker-compose.yml first by running:
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
docker-compose pull
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
It is recommended to perform a backup before updating.
|
||||
|
||||
### Support
|
||||
|
||||
If you discover a bug, please create an issue. For general queries, visit our [Forum](https://forum.invoiceninja.com/)
|
||||
|
||||
|
||||
```192.168.0.124 in5.test```
|
||||
|
||||
**Please note that PDF generation using local host your domain name MUST end in .test for your PDFs to generate correctly, this is a DNS resolver issue with chromium.
|
||||
|
||||
All that is left to do now is bring up the container
|
||||
|
||||
|
||||
``` docker-compose up -d```
|
||||
|
||||
|
||||
**Note: When performing the setup, the Database host is ```db```
|
||||
|
||||
## Support
|
||||
|
||||
If you discover a bug, please create and issue, if you query is general in nature please visit us on our [Forum ](https://forum.invoiceninja.com/)
|
||||
|
||||
### Todo
|
||||
|
||||
This is a new image which should provide much better support for all users, however there are some items left to complete
|
||||
|
||||
- [ ] Backup script
|
||||
- [ ] Integrate soketi server
|
||||
- [ ] Add elastic search for site wide search
|
||||
@@ -1,73 +0,0 @@
|
||||
ARG PHP_VERSION=7.2
|
||||
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
||||
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
||||
|
||||
FROM php:${PHP_VERSION}-fpm-alpine
|
||||
|
||||
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
||||
|
||||
#####
|
||||
# SYSTEM REQUIREMENT
|
||||
#####
|
||||
ARG INVOICENINJA_VERSION
|
||||
ARG BAK_STORAGE_PATH
|
||||
ARG BAK_PUBLIC_PATH
|
||||
ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH
|
||||
ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH
|
||||
WORKDIR /var/www/app
|
||||
|
||||
COPY entrypoint.sh /usr/local/bin/docker-entrypoint
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint \
|
||||
&& mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
|
||||
|
||||
# Install PHP extensions
|
||||
# https://hub.docker.com/r/mlocati/php-extension-installer/tags
|
||||
COPY --from=mlocati/php-extension-installer:1.1.41 /usr/bin/install-php-extensions /usr/local/bin/
|
||||
|
||||
RUN install-php-extensions \
|
||||
gd \
|
||||
gmp \
|
||||
opcache \
|
||||
pdo_mysql \
|
||||
zip
|
||||
|
||||
COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini
|
||||
|
||||
# Separate user
|
||||
ENV INVOICENINJA_USER=invoiceninja
|
||||
|
||||
RUN addgroup --gid=1500 -S "$INVOICENINJA_USER" && \
|
||||
adduser --uid=1500 \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--home "$(pwd)" \
|
||||
--ingroup "$INVOICENINJA_USER" \
|
||||
--no-create-home \
|
||||
"$INVOICENINJA_USER"; \
|
||||
addgroup "$INVOICENINJA_USER" www-data; \
|
||||
chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" .
|
||||
|
||||
USER 1500
|
||||
|
||||
# Download and install IN
|
||||
ENV INVOICENINJA_VERSION="${INVOICENINJA_VERSION}"
|
||||
|
||||
RUN curl -o /tmp/ninja.zip -L https://download.invoiceninja.com/ninja-v${INVOICENINJA_VERSION}.zip \
|
||||
&& unzip -q /tmp/ninja.zip -d /tmp/ \
|
||||
&& mv /tmp/ninja/* /var/www/app \
|
||||
&& rm -rf /tmp/ninja* \
|
||||
&& mv /var/www/app/storage $BAK_STORAGE_PATH \
|
||||
&& mv /var/www/app/public $BAK_PUBLIC_PATH \
|
||||
&& mkdir -p /var/www/app/public/logo /var/www/app/storage \
|
||||
&& chmod -R 755 /var/www/app/storage \
|
||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||
|
||||
# Override the environment settings from projects .env file
|
||||
ENV LOG errorlog
|
||||
ENV SELF_UPDATER_SOURCE ''
|
||||
|
||||
# Use to be mounted into nginx
|
||||
VOLUME /var/www/app/public
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint"]
|
||||
CMD ["php-fpm"]
|
||||
@@ -1,105 +0,0 @@
|
||||
ARG PHP_VERSION=7.4
|
||||
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
||||
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
||||
|
||||
# Get Invoice Ninja and install nodejs packages
|
||||
FROM node:lts-alpine as frontend
|
||||
ARG INVOICENINJA_VERSION
|
||||
ARG BAK_STORAGE_PATH
|
||||
ARG BAK_PUBLIC_PATH
|
||||
|
||||
# Install dependencies
|
||||
RUN set -eux; \
|
||||
apk add --no-cache \
|
||||
curl
|
||||
|
||||
# Download Invoice Ninja
|
||||
RUN curl -o /tmp/ninja.tar.gz -L https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION \
|
||||
&& mkdir -p /var/www/app \
|
||||
&& tar --strip-components=1 -xf /tmp/ninja.tar.gz -C /var/www/app/ \
|
||||
&& mkdir -p /var/www/app/public/logo /var/www/app/storage \
|
||||
&& mv /var/www/app/.env.example /var/www/app/.env \
|
||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||
|
||||
WORKDIR /var/www/app/
|
||||
|
||||
# Install node packages
|
||||
RUN npm install --production \
|
||||
&& npm run production \
|
||||
&& rm -rf node_modules \
|
||||
&& mv /var/www/app/storage $BAK_STORAGE_PATH \
|
||||
&& mv /var/www/app/public $BAK_PUBLIC_PATH
|
||||
|
||||
# Prepare php image
|
||||
FROM php:${PHP_VERSION}-fpm-alpine
|
||||
ARG INVOICENINJA_VERSION
|
||||
ARG BAK_STORAGE_PATH
|
||||
ARG BAK_PUBLIC_PATH
|
||||
ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION
|
||||
ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH
|
||||
ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH
|
||||
|
||||
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
||||
|
||||
WORKDIR /var/www/app
|
||||
|
||||
COPY --from=frontend /var/www/app /var/www/app
|
||||
COPY entrypoint.sh /usr/local/bin/docker-entrypoint
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint \
|
||||
&& mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
|
||||
|
||||
# Install PHP extensions
|
||||
# https://hub.docker.com/r/mlocati/php-extension-installer/tags
|
||||
COPY --from=mlocati/php-extension-installer:1.1.41 /usr/bin/install-php-extensions /usr/local/bin/
|
||||
|
||||
RUN install-php-extensions \
|
||||
bcmath \
|
||||
exif \
|
||||
gd \
|
||||
gmp \
|
||||
mysqli \
|
||||
opcache \
|
||||
pdo_mysql \
|
||||
zip \
|
||||
@composer
|
||||
|
||||
# Install chromium
|
||||
RUN set -eux; \
|
||||
apk add --no-cache \
|
||||
supervisor \
|
||||
mysql-client \
|
||||
git \
|
||||
chromium \
|
||||
ttf-freefont
|
||||
|
||||
COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini
|
||||
COPY ./config/supervisor/supervisord.conf /
|
||||
|
||||
## Separate user
|
||||
ARG UID=1500
|
||||
ENV INVOICENINJA_USER=invoiceninja
|
||||
|
||||
RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \
|
||||
&& adduser --uid=$UID \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--home "$(pwd)" \
|
||||
--ingroup "$INVOICENINJA_USER" \
|
||||
--no-create-home \
|
||||
"$INVOICENINJA_USER" \
|
||||
&& addgroup "$INVOICENINJA_USER" www-data \
|
||||
&& mkdir /var/log/supervisord /var/run/supervisord \
|
||||
&& chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app \
|
||||
&& chown $INVOICENINJA_USER:www-data /var/log/supervisord /var/run/supervisord
|
||||
|
||||
USER $UID
|
||||
|
||||
RUN /usr/local/bin/composer install --no-dev --quiet
|
||||
|
||||
# Override the environment settings from projects .env file
|
||||
ENV APP_ENV production
|
||||
ENV LOG errorlog
|
||||
ENV SNAPPDF_EXECUTABLE_PATH /usr/bin/chromium-browser
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint"]
|
||||
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
||||
@@ -1,6 +0,0 @@
|
||||
{$APP_URL} {
|
||||
root * /var/www/app/public
|
||||
php_fastcgi app:9000
|
||||
encode zstd gzip
|
||||
file_server browse
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
cd /var/www/app; php artisan schedule:run >> /dev/null 2>&1
|
||||
@@ -1 +0,0 @@
|
||||
192.168.0.124 in5.test
|
||||
@@ -1,17 +0,0 @@
|
||||
; How often (in seconds) to check file timestamps for changes to the shared
|
||||
; memory storage allocation. ("1" means validate once per second, but only
|
||||
; once per request. "0" means always validate)
|
||||
;opcache.revalidate_freq=2
|
||||
opcache.revalidate_freq=60
|
||||
|
||||
# http://symfony.com/doc/current/performance.html
|
||||
; Duration of time, in seconds for which to cache realpath information for a given
|
||||
; file or directory. For systems with rarely changing files, consider increasing this
|
||||
; value.
|
||||
; http://php.net/realpath-cache-ttl
|
||||
;realpath_cache_ttl = 120
|
||||
realpath_cache_ttl = 600
|
||||
|
||||
; Maximum allowed size for uploaded files.
|
||||
; http://php.net/upload-max-filesize
|
||||
upload_max_filesize = 8M
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
printf "READY\n";
|
||||
|
||||
while read line; do
|
||||
echo "Processing Event: $line" >&2;
|
||||
kill -SIGQUIT $PPID
|
||||
done < /dev/stdin
|
||||
@@ -1,47 +0,0 @@
|
||||
[supervisord]
|
||||
nodaemon=true
|
||||
user=invoiceninja
|
||||
pidfile=/var/run/supervisord/supervisord.pid
|
||||
logfile=/dev/null ; nodaemon will cause logs to go to stdout
|
||||
logfile_maxbytes=0
|
||||
loglevel=error
|
||||
|
||||
[program:php-fpm]
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
command=php-fpm
|
||||
|
||||
[program:scheduler]
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
command=php artisan schedule:work
|
||||
|
||||
[program:queue-worker]
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
numprocs=2
|
||||
command=php artisan queue:work --sleep=3 --tries=3 --memory=256
|
||||
|
||||
[eventlistener:shutdown]
|
||||
command=/shutdown.sh
|
||||
events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
62
debian/.env
vendored
Normal file
62
debian/.env
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# IN application vars
|
||||
APP_URL=http://localhost:8012
|
||||
APP_KEY=base64:RR++yx2rJ9kdxbdh3+AmbHLDQu+Q76i++co9Y8ybbno=
|
||||
APP_ENV=production
|
||||
APP_DEBUG=true
|
||||
REQUIRE_HTTPS=false
|
||||
PHANTOMJS_PDF_GENERATION=false
|
||||
PDF_GENERATOR=snappdf
|
||||
TRUSTED_PROXIES='*'
|
||||
|
||||
|
||||
CACHE_DRIVER=redis
|
||||
QUEUE_CONNECTION=redis
|
||||
SESSION_DRIVER=redis
|
||||
|
||||
REDIS_HOST=redis
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
FILESYSTEM_DISK=debian_docker
|
||||
|
||||
# DB connection
|
||||
DB_HOST=mysql
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=ninja
|
||||
DB_USERNAME=ninja
|
||||
DB_PASSWORD=ninja
|
||||
DB_ROOT_PASSWORD=ninjaAdm1nPassword
|
||||
DB_CONNECTION=mysql
|
||||
|
||||
# Create initial user
|
||||
# Default to these values if empty
|
||||
IN_USER_EMAIL=admin@example.com
|
||||
IN_PASSWORD=changeme!
|
||||
# IN_USER_EMAIL=
|
||||
# IN_PASSWORD=
|
||||
|
||||
# Mail options
|
||||
MAIL_MAILER=log
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_FROM_ADDRESS='user@example.com'
|
||||
MAIL_FROM_NAME='Self Hosted User'
|
||||
|
||||
# MySQL
|
||||
MYSQL_ROOT_PASSWORD=ninjaAdm1nPassword
|
||||
MYSQL_USER=ninja
|
||||
MYSQL_PASSWORD=ninja
|
||||
MYSQL_DATABASE=ninja
|
||||
|
||||
# GoCardless/Nordigen API key for banking integration
|
||||
NORDIGEN_SECRET_ID=
|
||||
NORDIGEN_SECRET_KEY=
|
||||
|
||||
IS_DOCKER=true
|
||||
SCOUT_DRIVER=null
|
||||
SNAPPDF_CHROMIUM_PATH=/usr/bin/google-chrome-stable
|
||||
|
||||
|
||||
118
debian/Dockerfile
vendored
Normal file
118
debian/Dockerfile
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
FROM php:8.3-fpm AS base
|
||||
|
||||
ARG php_require="bcmath gd pdo_mysql zip"
|
||||
ARG php_suggest="exif imagick intl pcntl soap"
|
||||
ARG php_suggest_debian="saxon-12.5.0"
|
||||
ARG php_extra="opcache"
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
default-mysql-client \
|
||||
gpg \
|
||||
gosu \
|
||||
supervisor \
|
||||
# Unicode support for PDF
|
||||
fonts-noto-cjk-extra \
|
||||
fonts-wqy-microhei \
|
||||
fonts-wqy-zenhei \
|
||||
xfonts-wqy \
|
||||
&& if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
|
||||
mkdir -p /etc/apt/keyrings \
|
||||
&& curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | \
|
||||
gpg --dearmor -o /etc/apt/keyrings/google.gpg \
|
||||
&& echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google.gpg] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends google-chrome-stable \
|
||||
&& mkdir -p /var/www/.config/google-chrome \
|
||||
&& chown -R www-data:www-data /var/www/.config/google-chrome; \
|
||||
elif [ "$(dpkg --print-architecture)" = "arm64" ]; then \
|
||||
apt-get install -y --no-install-recommends \
|
||||
# Packages for chrome
|
||||
fonts-liberation \
|
||||
libasound2 \
|
||||
libatk-bridge2.0-0 \
|
||||
libatk1.0-0 \
|
||||
libatspi2.0-0 \
|
||||
libcups2 \
|
||||
libdbus-1-3 \
|
||||
libdrm2 \
|
||||
libgbm1 \
|
||||
libgtk-3-0 \
|
||||
libnspr4 \
|
||||
libnss3 \
|
||||
libwayland-client0 \
|
||||
libxcomposite1 \
|
||||
libxdamage1 \
|
||||
libxfixes3 \
|
||||
libxkbcommon0 \
|
||||
libxrandr2 \
|
||||
xdg-utils \
|
||||
&& mkdir -p /var/www/.chrome/chrome-profile \
|
||||
&& chown -R www-data:www-data /var/www/.chrome/chrome-profile; \
|
||||
fi \
|
||||
&& apt-get purge -y gpg \
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Required PHP extensions.
|
||||
RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
|
||||
( curl -sSLf https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - || echo 'return 1' ) | sh -s \
|
||||
${php_require} \
|
||||
${php_suggest} \
|
||||
${php_suggest_debian} \
|
||||
${php_extra} \
|
||||
@composer; \
|
||||
elif [ "$(dpkg --print-architecture)" = "arm64" ]; then \
|
||||
( curl -sSLf https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - || echo 'return 1' ) | sh -s \
|
||||
${php_require} \
|
||||
${php_suggest} \
|
||||
${php_extra} \
|
||||
@composer; \
|
||||
fi
|
||||
|
||||
# Configure PHP
|
||||
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
|
||||
|
||||
# Copy scripts
|
||||
COPY rootfs /
|
||||
|
||||
USER www-data
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Setup InvoiceNinja
|
||||
RUN curl -s "https://api.github.com/repos/invoiceninja/invoiceninja/releases/latest" | \
|
||||
grep -o '"browser_download_url": "[^"]*invoiceninja.tar"' | \
|
||||
cut -d '"' -f 4 | \
|
||||
xargs curl -sL | \
|
||||
tar -oxz -C /var/www/html \
|
||||
&& cp /var/www/html/resources/views/react/index.blade.php /var/www/html/public/index.html \
|
||||
# File permissions
|
||||
&& find /var/www/html/ -type f -exec chmod 644 {} \; \
|
||||
# Directory permissions
|
||||
&& find /var/www/html/ -type d -exec chmod 755 {} \; \
|
||||
# Install dependencies
|
||||
&& composer install --no-dev --no-scripts --no-autoloader \
|
||||
&& composer dump-autoload --optimize \
|
||||
&& php artisan optimize \
|
||||
&& php artisan storage:link \
|
||||
# Workaround for application updates
|
||||
&& mv /var/www/html/public /tmp/public
|
||||
|
||||
USER root
|
||||
|
||||
# Setup supervisor
|
||||
COPY supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
|
||||
# Add initialization script
|
||||
COPY --chmod=0755 scripts/init.sh /usr/local/bin/init.sh
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
||||
CMD php -v || exit 1
|
||||
|
||||
EXPOSE 9000
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/init.sh"]
|
||||
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||
96
debian/docker-compose.yml
vendored
Normal file
96
debian/docker-compose.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
x-logging: &default-logging
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
driver: json-file
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
image: invoiceninja/invoiceninja-debian:${TAG:-latest}
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- ./.env
|
||||
volumes:
|
||||
- ./.env:/var/www/html/.env
|
||||
- ./php/php.ini:/usr/local/etc/php/conf.d/zzz-php.ini:ro
|
||||
- ./php/php-fpm.conf:/usr/local/etc/php-fpm.d/zzz-php-fpm.conf:ro
|
||||
- ./supervisor/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf:ro
|
||||
- app_cache:/var/www/html/bootstrap/cache
|
||||
- app_public:/var/www/html/public
|
||||
- app_storage:/var/www/html/storage
|
||||
networks:
|
||||
- app-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
logging: *default-logging
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- ./nginx:/etc/nginx/conf.d:ro
|
||||
- app_public:/var/www/html/public:ro
|
||||
- app_storage:/var/www/html/storage:ro
|
||||
networks:
|
||||
- app-network
|
||||
depends_on:
|
||||
- app
|
||||
logging: *default-logging
|
||||
|
||||
mysql:
|
||||
image: mysql:8
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- ./.env
|
||||
environment:
|
||||
MYSQL_DATABASE: ${DB_DATABASE}
|
||||
MYSQL_USER: ${DB_USERNAME}
|
||||
MYSQL_PASSWORD: ${DB_PASSWORD}
|
||||
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
networks:
|
||||
- app-network
|
||||
healthcheck:
|
||||
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}" ]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
logging: *default-logging
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
networks:
|
||||
- app-network
|
||||
healthcheck:
|
||||
test: [ "CMD", "redis-cli", "ping" ]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
logging: *default-logging
|
||||
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
app_cache:
|
||||
driver: local
|
||||
app_public:
|
||||
driver: local
|
||||
app_storage:
|
||||
driver: local
|
||||
mysql_data:
|
||||
driver: local
|
||||
redis_data:
|
||||
driver: local
|
||||
14
debian/nginx/invoiceninja.conf
vendored
Normal file
14
debian/nginx/invoiceninja.conf
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# https://nginx.org/en/docs/http/ngx_http_core_module.html
|
||||
client_max_body_size 10M;
|
||||
client_body_buffer_size 10M;
|
||||
server_tokens off;
|
||||
|
||||
# https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
|
||||
fastcgi_buffers 32 16K;
|
||||
|
||||
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
|
||||
gzip on;
|
||||
gzip_comp_level 2;
|
||||
gzip_min_length 1M;
|
||||
gzip_proxied any;
|
||||
gzip_types *;
|
||||
@@ -1,25 +1,32 @@
|
||||
# https://laravel.com/docs/master/deployment#nginx
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
server_name _;
|
||||
root /var/www/html/public;
|
||||
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
|
||||
root /var/www/app/public/;
|
||||
index index.php;
|
||||
|
||||
|
||||
charset utf-8;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
location = /robots.txt { access_log off; log_not_found off; }
|
||||
|
||||
error_page 404 /index.php;
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass app:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_intercept_errors off;
|
||||
fastcgi_buffer_size 16k;
|
||||
fastcgi_buffers 4 16k;
|
||||
}
|
||||
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
1
debian/php/php-fpm.conf
vendored
Normal file
1
debian/php/php-fpm.conf
vendored
Normal file
@@ -0,0 +1 @@
|
||||
pm.max_children = 10
|
||||
15
debian/php/php.ini
vendored
Normal file
15
debian/php/php.ini
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
[core]
|
||||
# https://www.php.net/manual/en/ini.core.php
|
||||
post_max_size = 10M
|
||||
upload_max_filesize = 10M
|
||||
|
||||
[opcache]
|
||||
# https://www.php.net/manual/en/opcache.installation.php#opcache.installation.recommended
|
||||
opcache.enable_cli=1
|
||||
opcache.max_accelerated_files=4000
|
||||
opcache.revalidate_freq=60
|
||||
|
||||
[jit]
|
||||
# https://wiki.php.net/rfc/jit_config_defaults
|
||||
opcache.jit=tracing
|
||||
opcache.jit_buffer_size=64M
|
||||
14
debian/rootfs/docker-entrypoint-init.d/10-init-in.sh
vendored
Normal file
14
debian/rootfs/docker-entrypoint-init.d/10-init-in.sh
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
php artisan db:seed --force
|
||||
|
||||
# Build up array of arguments...
|
||||
if [ ! -z "${IN_USER_EMAIL}" ]; then
|
||||
email="--email ${IN_USER_EMAIL}"
|
||||
fi
|
||||
|
||||
if [ ! -z "${IN_PASSWORD}" ]; then
|
||||
password="--password ${IN_PASSWORD}"
|
||||
fi
|
||||
|
||||
php artisan ninja:create-account $email $password
|
||||
81
debian/scripts/init.sh
vendored
Executable file
81
debian/scripts/init.sh
vendored
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
in_log() {
|
||||
local type="$1"
|
||||
shift
|
||||
printf '%s [%s] [Entrypoint]: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$type" "$*"
|
||||
}
|
||||
|
||||
docker_process_init_files() {
|
||||
echo
|
||||
local f
|
||||
for f; do
|
||||
case "$f" in
|
||||
*.sh)
|
||||
# https://github.com/docker-library/postgres/issues/450#issuecomment-393167936
|
||||
# https://github.com/docker-library/postgres/pull/452
|
||||
if [ -x "$f" ]; then
|
||||
in_log INFO "$0: running $f"
|
||||
"$f"
|
||||
else
|
||||
in_log INFO "$0: sourcing $f"
|
||||
. "$f"
|
||||
fi
|
||||
;;
|
||||
*) in_log INFO "$0: ignoring $f" ;;
|
||||
esac
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
if [ "$*" = 'supervisord -c /etc/supervisor/conf.d/supervisord.conf' ]; then
|
||||
# Workaround for application updates
|
||||
if [ "$(ls -A /tmp/public)" ]; then
|
||||
echo "Updating public folder..."
|
||||
rm -rf /var/www/html/public/.htaccess \
|
||||
/var/www/html/public/.well-known \
|
||||
/var/www/html/public/*
|
||||
mv /tmp/public/* \
|
||||
/tmp/public/.htaccess \
|
||||
/tmp/public/.well-known \
|
||||
/var/www/html/public/
|
||||
fi
|
||||
echo "Public Folder is up to date"
|
||||
|
||||
# Ensure owner, file and directory permissions are correct
|
||||
chown -R www-data:www-data \
|
||||
/var/www/html/public \
|
||||
/var/www/html/storage
|
||||
find /var/www/html/public \
|
||||
/var/www/html/storage \
|
||||
-type f -exec chmod 644 {} \;
|
||||
find /var/www/html/public \
|
||||
/var/www/html/storage \
|
||||
-type d -exec chmod 755 {} \;
|
||||
|
||||
# Clear and cache config in production
|
||||
if [ "$APP_ENV" = "production" ]; then
|
||||
gosu www-data php artisan optimize
|
||||
gosu www-data php artisan package:discover
|
||||
gosu www-data php artisan migrate --force
|
||||
|
||||
# If first IN run, it needs to be initialized
|
||||
echo "Checking initialization status..."
|
||||
IN_INIT=$(php artisan tinker --execute='echo Schema::hasTable("accounts") && !App\Models\Account::all()->first();')
|
||||
echo "IN_INIT value: $IN_INIT"
|
||||
|
||||
if [ "$IN_INIT" = "1" ]; then
|
||||
echo "Running initialization scripts..."
|
||||
docker_process_init_files /docker-entrypoint-init.d/*
|
||||
fi
|
||||
|
||||
echo "Production setup completed"
|
||||
echo "IN_INIT value: $IN_INIT"
|
||||
|
||||
fi
|
||||
|
||||
echo "Starting supervisord..."
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
49
debian/supervisor/supervisord.conf
vendored
Normal file
49
debian/supervisor/supervisord.conf
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
[unix_http_server]
|
||||
file=/var/run/supervisor.sock
|
||||
chmod=0700
|
||||
|
||||
[supervisord]
|
||||
nodaemon=true
|
||||
user=root
|
||||
logfile=/var/log/supervisor/supervisord.log
|
||||
pidfile=/var/run/supervisord.pid
|
||||
|
||||
[rpcinterface:supervisor]
|
||||
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
|
||||
|
||||
[supervisorctl]
|
||||
serverurl=unix:///var/run/supervisor.sock
|
||||
|
||||
[program:php-fpm]
|
||||
command=/usr/local/sbin/php-fpm -F
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=5
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
|
||||
[program:queue-worker]
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600
|
||||
autostart=true
|
||||
autorestart=true
|
||||
stopasgroup=true
|
||||
killasgroup=true
|
||||
user=www-data
|
||||
numprocs=2
|
||||
environment=HOME="/var/www"
|
||||
stdout_logfile=/var/log/php-worker.log
|
||||
stderr_logfile=/var/log/php-worker.err.log
|
||||
stopwaitsecs=3600
|
||||
|
||||
[program:scheduler]
|
||||
command=/bin/sh -c "while [ true ]; do (php /var/www/html/artisan schedule:run --verbose --no-interaction &); sleep 60; done"
|
||||
autostart=true
|
||||
autorestart=true
|
||||
user=www-data
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
@@ -1,81 +0,0 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
server:
|
||||
image: nginx
|
||||
restart: always
|
||||
env_file: env
|
||||
volumes:
|
||||
# Vhost configuration
|
||||
#- ./config/caddy/Caddyfile:/etc/caddy/Caddyfiledocker-com
|
||||
- ./config/nginx/in-vhost.conf:/etc/nginx/conf.d/in-vhost.conf:ro
|
||||
- ./docker/app/public:/var/www/app/public:rw,delegated
|
||||
- ./docker/app/storage:/var/www/app/storage:rw,delegated
|
||||
depends_on:
|
||||
- app
|
||||
# Run webserver nginx on port 80
|
||||
# Feel free to modify depending what port is already occupied
|
||||
ports:
|
||||
- "80:80"
|
||||
#- "443:443"
|
||||
networks:
|
||||
- invoiceninja
|
||||
extra_hosts:
|
||||
- "in5.localhost:192.168.0.124 " #host and ip
|
||||
|
||||
app:
|
||||
image: invoiceninja/invoiceninja:5
|
||||
env_file: env
|
||||
restart: always
|
||||
volumes:
|
||||
- ./config/hosts:/etc/hosts:ro
|
||||
- ./config/shutdown.sh:/usr/local/bin/shutdown.sh
|
||||
- ./docker/app/public:/var/www/app/public:rw,delegated
|
||||
- ./docker/app/storage:/var/www/app/storage:rw,delegated
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- invoiceninja
|
||||
extra_hosts:
|
||||
- "in5.localhost:192.168.0.124 " #host and ip
|
||||
|
||||
db:
|
||||
image: mysql:5
|
||||
ports:
|
||||
- "3305:3306"
|
||||
restart: always
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=ninjaAdm1nPassword
|
||||
- MYSQL_USER=ninja
|
||||
- MYSQL_PASSWORD=ninja
|
||||
- MYSQL_DATABASE=ninja
|
||||
volumes:
|
||||
- ./docker/mysql/data:/var/lib/mysql:rw,delegated
|
||||
networks:
|
||||
- invoiceninja
|
||||
extra_hosts:
|
||||
- "in5.localhost:192.168.0.124 " #host and ip
|
||||
|
||||
# THIS IS ONLY A VALID CONFIGURATION FOR IN 4. DO NOT USE FOR IN 5.
|
||||
# cron:
|
||||
# image: invoiceninja/invoiceninja:alpine-4
|
||||
# volumes:
|
||||
# - ./docker/app/public:/var/www/app/public:rw,delegated
|
||||
# - ./docker/app/storage:/var/www/app/storage:rw,delegated
|
||||
# - ./docker/app/public/logo:/var/www/app/public/logo:rw,delegated
|
||||
# entrypoint: |
|
||||
# /bin/sh -c 'sh -s <<EOF
|
||||
# trap "break;exit" SIGHUP SIGINT SIGTERM
|
||||
# sleep 300s
|
||||
# while /bin/true; do
|
||||
# ./artisan ninja:send-invoices
|
||||
# ./artisan ninja:send-reminders
|
||||
# sleep 1d
|
||||
# done
|
||||
# EOF'
|
||||
# networks:
|
||||
# - invoiceninja
|
||||
#
|
||||
|
||||
networks:
|
||||
invoiceninja:
|
||||
109
entrypoint.sh
109
entrypoint.sh
@@ -1,109 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
# logging functions
|
||||
in_log() {
|
||||
local type="$1"; shift
|
||||
printf '%s [%s] [Entrypoint]: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$type" "$*"
|
||||
}
|
||||
|
||||
in_error() {
|
||||
in_log ERROR "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Indirect expansion (ie) is not supported in bourne shell. That's why we are using this "magic" here.
|
||||
ie_gv() {
|
||||
eval "echo \$$1"
|
||||
}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
|
||||
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
|
||||
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local def="${2:-}"
|
||||
|
||||
if [ "$(ie_gv ${var})" != "" ] && [ "$(ie_gv ${fileVar})" != "" ]; then
|
||||
in_error "Both $var and $fileVar are set (but are exclusive)"
|
||||
fi
|
||||
|
||||
local val="$def"
|
||||
if [ "$(ie_gv ${var})" != "" ]; then
|
||||
val=$(ie_gv ${var})
|
||||
elif [ "$(ie_gv ${fileVar})" != "" ]; then
|
||||
val=`cat $(ie_gv ${fileVar})`
|
||||
fi
|
||||
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
|
||||
# first arg is `-f` or `--some-option`
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- php-fpm "$@"
|
||||
fi
|
||||
|
||||
# create storage volume
|
||||
if [ ! -d /var/www/app/storage ] && [ -d "$BAK_STORAGE_PATH" ]; then
|
||||
mv "$BAK_STORAGE_PATH" /var/www/app/storage
|
||||
elif [ -d "$BAK_STORAGE_PATH" ]; then
|
||||
# copy missing folders in storage
|
||||
IN_STORAGE_BACKUP="$(ls "$BAK_STORAGE_PATH")"
|
||||
for path in $IN_STORAGE_BACKUP; do
|
||||
if [ ! -e "/var/www/app/storage/$path" ]; then
|
||||
cp -Rp "$BAK_STORAGE_PATH/$path" "/var/www/app/storage/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
rm -rf "$BAK_STORAGE_PATH"
|
||||
|
||||
# create public volume
|
||||
if [ ! -d /var/www/app/public ] && [ -d "$BAK_PUBLIC_PATH" ]; then
|
||||
mv "$BAK_PUBLIC_PATH" /var/www/app/public
|
||||
elif [ ! -e /var/www/app/public/version ] || [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then
|
||||
# version mismatch, update all
|
||||
cp -au "$BAK_PUBLIC_PATH/"* /var/www/app/public
|
||||
echo "$INVOICENINJA_VERSION" > /var/www/app/public/version
|
||||
elif [ ! -d /var/www/app/public/logo ] && [ -d "$BAK_PUBLIC_PATH/logo" ]; then
|
||||
# missing logo folder only, copy folder
|
||||
cp -a "$BAK_PUBLIC_PATH/logo" /var/www/app/public/logo
|
||||
elif [ -d "$BAK_PUBLIC_PATH/logo" ]; then
|
||||
# copy missing folders in logo
|
||||
IN_LOGO_BACKUP="$(ls "$BAK_PUBLIC_PATH/logo")"
|
||||
for path in $IN_LOGO_BACKUP; do
|
||||
if [ ! -e "/var/www/app/public/logo/$path" ]; then
|
||||
cp -a "$BAK_PUBLIC_PATH/logo/$path" "/var/www/app/public/logo/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
rm -rf "$BAK_PUBLIC_PATH"
|
||||
|
||||
# Set permission for web server to create/update files
|
||||
chown -R "$INVOICENINJA_USER":www-data /var/www/app/storage /var/www/app/public /var/www/app/bootstrap
|
||||
|
||||
# Initialize values that might be stored in a file
|
||||
file_env 'APP_KEY'
|
||||
file_env 'API_SECRET'
|
||||
file_env 'CLOUDFLARE_API_KEY'
|
||||
file_env 'DB_USERNAME'
|
||||
file_env 'DB_USERNAME1'
|
||||
file_env 'DB_USERNAME2'
|
||||
file_env 'DB_PASSWORD'
|
||||
file_env 'DB_PASSWORD1'
|
||||
file_env 'DB_PASSWORD2'
|
||||
file_env 'MAIL_USERNAME'
|
||||
file_env 'MAIL_PASSWORD'
|
||||
file_env 'MAILGUN_SECRET'
|
||||
file_env 'S3_KEY'
|
||||
file_env 'S3_SECRET'
|
||||
|
||||
# Run Laravel stuff
|
||||
php artisan config:cache
|
||||
php artisan optimize
|
||||
php artisan migrate --force
|
||||
|
||||
exec docker-php-entrypoint "$@"
|
||||
19
env
19
env
@@ -1,19 +0,0 @@
|
||||
APP_URL=http://in.localhost:8003/
|
||||
APP_KEY=<insert your generated key in here>
|
||||
APP_DEBUG=true
|
||||
MULTI_DB_ENABLED=false
|
||||
DB_HOST1=db
|
||||
DB_USERNAME1=ninja
|
||||
DB_PASSWORD1=ninja
|
||||
DB_DATABASE1=ninja
|
||||
|
||||
#this is a system variable please do not remove
|
||||
IS_DOCKER=true
|
||||
|
||||
#V4 env vars
|
||||
DB_STRICT=false
|
||||
DB_HOST=db
|
||||
DB_DATABASE=ninja
|
||||
DB_USERNAME=ninja
|
||||
DB_PASSWORD=ninja
|
||||
APP_CIPHER=AES-256-CBC
|
||||
@@ -1,13 +0,0 @@
|
||||
FROM invoiceninja/invoiceninja:5
|
||||
|
||||
USER root
|
||||
|
||||
RUN apk add --no-cache supervisor \
|
||||
&& mkdir /var/log/supervisord /var/run/supervisord \
|
||||
&& chown $INVOICENINJA_USER:www-data /var/log/supervisord /var/run/supervisord
|
||||
|
||||
COPY supervisord.conf /
|
||||
|
||||
USER $INVOICENINJA_USER
|
||||
|
||||
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
||||
@@ -1,29 +0,0 @@
|
||||
[supervisord]
|
||||
nodaemon=true
|
||||
user=invoiceninja
|
||||
pidfile=/var/run/supervisord/supervisord.pid
|
||||
logfile=/dev/null ; nodaemon will cause logs to go to stdout
|
||||
logfile_maxbytes=0
|
||||
loglevel=error
|
||||
|
||||
[program:php-fpm]
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
command=php-fpm
|
||||
|
||||
[program:scheduler]
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
command=php artisan schedule:work
|
||||
|
||||
[program:queue-worker]
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
numprocs=2
|
||||
command=php artisan queue:work --sleep=3 --tries=1 --memory=1024 --timeout=3600 --daemon
|
||||
Reference in New Issue
Block a user