mirror of
https://github.com/invoiceninja/dockerfiles.git
synced 2026-01-01 12:07:26 +01:00
Compare commits
107 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1af469cf04 | ||
|
|
2d934fd703 | ||
|
|
a7668325e8 | ||
|
|
7aef08794b | ||
|
|
001c922e45 | ||
|
|
85161446e9 | ||
|
|
14c0fd89eb | ||
|
|
7b08926961 | ||
|
|
a5e41d3072 | ||
|
|
72e07679eb | ||
|
|
6d65f5e114 | ||
|
|
61cef26f80 | ||
|
|
e2d6cbd853 | ||
|
|
21cc3ddf2c | ||
|
|
8245a57117 | ||
|
|
6b25f47ba1 | ||
|
|
1168dec11b | ||
|
|
f81e0c8f11 | ||
|
|
3e2d5a4f8c | ||
|
|
42e2c2234e | ||
|
|
4e05229fed | ||
|
|
c5fb1ab64b | ||
|
|
b190c8e633 | ||
|
|
4350619c64 | ||
|
|
a38b398d5d | ||
|
|
3f8fb906b5 | ||
|
|
8962e0d0b9 | ||
|
|
fc6923ad40 | ||
|
|
3b907d6093 | ||
|
|
431f11ccd4 | ||
|
|
2de45a45ab | ||
|
|
6037ebf2c2 | ||
|
|
685801983a | ||
|
|
f1a5f6fc7b | ||
|
|
6cbdec0686 | ||
|
|
4c855161f6 | ||
|
|
1447268f94 | ||
|
|
c0c13705ae | ||
|
|
11869a23a1 | ||
|
|
39bc2f0d89 | ||
|
|
0ff6e56ed8 | ||
|
|
ac5f1bfad5 | ||
|
|
fb064cb05e | ||
|
|
a84ec51b3f | ||
|
|
e2cafb8b72 | ||
|
|
672fc41611 | ||
|
|
eeffc2191c | ||
|
|
8a6622bbbb | ||
|
|
4f3f7ca8fe | ||
|
|
9e8db1b5bd | ||
|
|
6bcfd57208 | ||
|
|
db9e0f4309 | ||
|
|
cb91ba9973 | ||
|
|
9060027999 | ||
|
|
26c91935fc | ||
|
|
7c5275e766 | ||
|
|
482b30b677 | ||
|
|
7a45036c72 | ||
|
|
a963db2b63 | ||
|
|
26a71f7f1f | ||
|
|
af98f696b9 | ||
|
|
696d3b356a | ||
|
|
0ef00831f6 | ||
|
|
6ba1f11221 | ||
|
|
933748e15b | ||
|
|
03180fc65e | ||
|
|
e0fcb50ecb | ||
|
|
5c418c474e | ||
|
|
5e59ec10e3 | ||
|
|
6b0182e712 | ||
|
|
961282a90e | ||
|
|
3a17d81cab | ||
|
|
a3bb9b9681 | ||
|
|
766b604971 | ||
|
|
005e1b9dfe | ||
|
|
8d0a39ac71 | ||
|
|
6e12296f25 | ||
|
|
dbac9305c9 | ||
|
|
3c96683d46 | ||
|
|
279a282d44 | ||
|
|
e0332086d4 | ||
|
|
63ffa18860 | ||
|
|
960c3172e9 | ||
|
|
43ff450c2d | ||
|
|
aaa6118286 | ||
|
|
1ab7bc02d6 | ||
|
|
9625d9d9d0 | ||
|
|
3bd5324136 | ||
|
|
e28c8dc07b | ||
|
|
4ab4039887 | ||
|
|
650851811a | ||
|
|
72762dc964 | ||
|
|
dc66ca0544 | ||
|
|
52992d622b | ||
|
|
9dcf825f85 | ||
|
|
350a9fad35 | ||
|
|
d8ca192f8e | ||
|
|
b6d213682d | ||
|
|
0d88a6268f | ||
|
|
c641680309 | ||
|
|
47116c7d78 | ||
|
|
41544ec1e0 | ||
|
|
f3b5a62d36 | ||
|
|
69d2f54b03 | ||
|
|
5a1c1c16d7 | ||
|
|
3ade74efc9 | ||
|
|
dc00f6a604 |
24
.editorconfig
Normal file
24
.editorconfig
Normal file
@@ -0,0 +1,24 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
# Matches multiple files with brace expansion notation
|
||||
# Set default charset
|
||||
[*.*]
|
||||
charset = utf-8
|
||||
|
||||
# Tab indentation (no size specified)
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
# Matches the files *.yml
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
26
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
26
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Before creating an issue
|
||||
|
||||
Be sure the issue isn't yet reported here or dicussed on stackoverflow
|
||||
|
||||
# Logs
|
||||
|
||||
Did you check the logs ?
|
||||
If any Error is present there please copy/paste it below
|
||||
|
||||
```
|
||||
Any Error that sucks
|
||||
```
|
||||
|
||||
# Setup information
|
||||
|
||||
What version do you run?
|
||||
Do you run docker-compose or a single Dockerfile ?
|
||||
35
.github/workflows/build_push.yml
vendored
Normal file
35
.github/workflows/build_push.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
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
|
||||
78
Dockerfile
78
Dockerfile
@@ -1,78 +0,0 @@
|
||||
FROM php:7.0-fpm
|
||||
|
||||
MAINTAINER Samuel Laulhau <sam@lalop.co>
|
||||
|
||||
#####
|
||||
# SYSTEM REQUIREMENT
|
||||
#####
|
||||
ENV PHANTOMJS phantomjs-2.1.1-linux-x86_64
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libmcrypt-dev zlib1g-dev git libgmp-dev \
|
||||
libfreetype6-dev libjpeg62-turbo-dev libpng12-dev \
|
||||
build-essential chrpath libssl-dev libxft-dev \
|
||||
libfreetype6 libfontconfig1 libfontconfig1-dev \
|
||||
&& ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/local/include/ \
|
||||
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
|
||||
&& docker-php-ext-configure gmp \
|
||||
&& docker-php-ext-install iconv mcrypt mbstring pdo pdo_mysql zip gd gmp opcache \
|
||||
&& curl -o ${PHANTOMJS}.tar.bz2 -SL https://bitbucket.org/ariya/phantomjs/downloads/${PHANTOMJS}.tar.bz2 \
|
||||
&& tar xvjf ${PHANTOMJS}.tar.bz2 \
|
||||
&& rm ${PHANTOMJS}.tar.bz2 \
|
||||
&& mv ${PHANTOMJS} /usr/local/share \
|
||||
&& ln -sf /usr/local/share/${PHANTOMJS}/bin/phantomjs /usr/local/bin \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# set recommended PHP.ini settings
|
||||
# see https://secure.php.net/manual/en/opcache.installation.php
|
||||
RUN { \
|
||||
echo 'opcache.memory_consumption=128'; \
|
||||
echo 'opcache.interned_strings_buffer=8'; \
|
||||
echo 'opcache.max_accelerated_files=4000'; \
|
||||
echo 'opcache.revalidate_freq=60'; \
|
||||
echo 'opcache.fast_shutdown=1'; \
|
||||
echo 'opcache.enable_cli=1'; \
|
||||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
|
||||
|
||||
#####
|
||||
# INSTALL COMPOSER
|
||||
#####
|
||||
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
||||
|
||||
|
||||
#####
|
||||
# DOWNLOAD AND INSTALL INVOICE NINJA
|
||||
#####
|
||||
|
||||
ENV INVOICENINJA_VERSION 4.2.2
|
||||
|
||||
RUN curl -o invoiceninja.tar.gz -SL https://github.com/hillelcoren/invoice-ninja/archive/v${INVOICENINJA_VERSION}.tar.gz \
|
||||
&& tar -xzf invoiceninja.tar.gz -C /var/www/ \
|
||||
&& rm invoiceninja.tar.gz \
|
||||
&& mv /var/www/invoiceninja-${INVOICENINJA_VERSION} /var/www/app \
|
||||
&& chown -R www-data:www-data /var/www/app \
|
||||
&& composer install --working-dir /var/www/app -o --no-dev --no-interaction --no-progress \
|
||||
&& chown -R www-data:www-data /var/www/app/bootstrap/cache \
|
||||
&& mv /var/www/app/storage /var/www/app/docker-backup-storage \
|
||||
&& mv /var/www/app/public /var/www/app/docker-backup-public \
|
||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||
|
||||
|
||||
######
|
||||
# DEFAULT ENV
|
||||
######
|
||||
ENV LOG errorlog
|
||||
ENV SELF_UPDATER_SOURCE ''
|
||||
ENV PHANTOMJS_BIN_PATH /usr/local/bin/phantomjs
|
||||
|
||||
|
||||
#use to be mounted into nginx for exemple
|
||||
VOLUME /var/www/app/public
|
||||
|
||||
WORKDIR /var/www/app
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["php-fpm"]
|
||||
58
Makefile
Normal file
58
Makefile
Normal file
@@ -0,0 +1,58 @@
|
||||
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
|
||||
197
README.md
197
README.md
@@ -1,40 +1,185 @@
|
||||
DockerFile for invoice ninja (https://www.invoiceninja.com/)
|
||||

|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja)
|
||||
[](https://hub.docker.com/r/invoiceninja/invoiceninja)
|
||||
|
||||
This image is based on `php:7.0-fpm` official version.
|
||||
# Docker for [Invoice Ninja](https://www.invoiceninja.com/)
|
||||
|
||||
To make your data persistent, you have to mount `/var/www/app/public/logo` and `/var/www/app/storage`.
|
||||
:bulb: Please consider posting your question on [StackOverflow](https://stackoverflow.com/) as this widens the audience that can help you. Just use the tag `invoice-ninja` and we are there to help. This is mostly related to the usage of Invoice Ninja and the docker setup.
|
||||
If you feel your question is directly related to a code change or you want to sent in a change + PR Github is the right place, of course.
|
||||
|
||||
:crown: **Features**
|
||||
|
||||
:lock: Automatic HTTPS (:heart: [Caddy](https://caddyserver.com/))
|
||||
:hammer: Fully production-ready through docker-compose
|
||||
:pencil: Adjustable to your needs via environment variable
|
||||
|
||||
|
||||
### Usage
|
||||
## Prerequisites
|
||||
|
||||
### Generate an application key
|
||||
|
||||
Before starting Invoice Ninja via Docker make sure you generate a valid application key. If you are not sure what an application key is, please visit [this blog post](https://tighten.co/blog/app-key-and-you/).
|
||||
|
||||
To generate an application key just run
|
||||
|
||||
```shell
|
||||
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show
|
||||
```
|
||||
|
||||
This will generate an application key for you which you need later.
|
||||
|
||||
### Create folders for data persistence
|
||||
|
||||
To make your data persistent, you have to mount `public` and `storage` from your host to your containers.
|
||||
|
||||
1. Create two folder on your host, e. g. `/var/invoiceninja/public` and `/var/invoiceninja/storage`
|
||||
2. Mount these folders into your container - see [usage](#usage)
|
||||
|
||||
You can create these folders wherever you want on your host system.
|
||||
|
||||
:warning: When using host mounted folder for persistence, make sure they are owned by the proper user and group. As we run Invoice Ninja without `root` , we use a separate user, the folders on the host system need to be owned by uid `1000` and a gid `101`.
|
||||
|
||||
Run this on your host system
|
||||
|
||||
```shell
|
||||
chown -R 1000:101 /var/invoiceninja/public /var/invoiceninja/storage
|
||||
```
|
||||
|
||||
to apply the proper permission to the folders. This also applies to the `docker-compose` setup when using [bind-mounted host directories](https://github.com/invoiceninja/dockerfiles/blob/master/docker-compose.yml#L17).
|
||||
|
||||
|
||||
### PhantomJS key
|
||||
|
||||
The PhantomJS key is set to `a-demo-key-with-low-quota-per-ip-address`. This demo key is limited to 100 requests per day.
|
||||
|
||||
To set a different key feel free to add `-e PHANTOMJS_CLOUD_KEY='<INSERT YOUR PHANTOMJS KEY HERE>'` to thee docker command below.
|
||||
|
||||
For further configuration and toubleshotting regarding PhantomJS and Invoice Ninja [see documentation here](https://docs.invoiceninja.com/configure.html?#phantomjs).
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
:warning: The `latest` tag contains the new version 5 of Invoice Ninja which is still in alpha state. To stick to the version 4 please use `alpine-4` tag.
|
||||
|
||||
To run it:
|
||||
|
||||
```shell
|
||||
docker run -d \
|
||||
-v /var/invoiceninja/public:/var/app/public \
|
||||
-v /var/invoiceninja/storage:/var/app/storage \
|
||||
-e APP_URL='http://ninja.dev' \
|
||||
-e APP_KEY='<INSERT THE GENERATED APPLICATION KEY HERE>' \
|
||||
-e DB_HOST='localhost' \
|
||||
-e DB_DATABASE='ninja' \
|
||||
-e DB_USERNAME='ninja' \
|
||||
-e DB_PASSWORD='ninja' \
|
||||
-p '9000:9000' \
|
||||
--name invoiceninja \
|
||||
invoiceninja/invoiceninja:alpine-4
|
||||
```
|
||||
docker run -d
|
||||
-e APP_ENV='production'
|
||||
-e APP_DEBUG=0
|
||||
-e APP_URL='http://ninja.dev'
|
||||
-e APP_KEY='SomeRandomStringSomeRandomString'
|
||||
-e APP_CIPHER='AES-256-CBC'
|
||||
-e DB_TYPE='mysql'
|
||||
-e DB_STRICT='false'
|
||||
-e DB_HOST='localhost'
|
||||
-e DB_DATABASE='ninja'
|
||||
-e DB_USERNAME='ninja'
|
||||
-e DB_PASSWORD='ninja'
|
||||
-p '80:80'
|
||||
invoiceninja/invoiceninja
|
||||
```
|
||||
A list of environment variables can be found [here](https://github.com/invoiceninja/invoiceninja/blob/master/.env.example)
|
||||
A list of environment variables can be found [here](https://github.com/invoiceninja/invoiceninja/blob/master/.env.example).
|
||||
|
||||
|
||||
### With docker-compose
|
||||
|
||||
A pretty ready to use docker-compose configuration can be found into [`./docker-compose`](https://github.com/invoiceninja/dockerfiles/tree/master/docker-compose).
|
||||
Rename `.env.example` into `.env` and change the environment's variable as needed.
|
||||
The file assume that all your persistent data is mounted from `/srv/invoiceninja/`.
|
||||
Once started the application should be accessible at http://localhost:8000/
|
||||
Running Invoice Ninja with docker-compose gives you everything to quickly start. Before starting please make sure you configured your setup correctly. You can do so by opening the `docker-compose.yml` and may change the follwing items.
|
||||
|
||||
### Know issue
|
||||
:warning: The `docker-compose.yml` runs the new version 5 of Invoice Ninja which is still in alpha state. To stick to the version 4 please use `alpine-4` tag.
|
||||
|
||||
Phantomjs doesn't work on linux alpine https://github.com/ariya/phantomjs/issues/14186
|
||||
**Port**
|
||||
|
||||
_default: 80_
|
||||
|
||||
This is the port where your Invoice Ninja is reachable, when you type in `http://<your-domain.com>`. If it should be different than `80` make sure to call your installation `http://<your-domain.com>:<YOUR-PORT>`, e. g. `http://<your-domain.com>:8080`.
|
||||
|
||||
```yml
|
||||
ports:
|
||||
- "8080:80" # To run it on port 8080
|
||||
```
|
||||
|
||||
:warning: Make sure the port set is available and not occupied by another service on your host system.
|
||||
|
||||
**URL and application key**
|
||||
|
||||
_default: https://localhost_
|
||||
|
||||
For generating a proper application key see [generate an application key](#generate-an-application-key). Change the value where your Invoice Ninja installation should be reachable.
|
||||
|
||||
```yml
|
||||
environment:
|
||||
- APP_URL=http://localhost
|
||||
````
|
||||
|
||||
**MYSQL root password**
|
||||
|
||||
_default: ninjaAdm1nPassword_
|
||||
|
||||
The mysql database server comes with two users: one for accessing the Invoice Ninja database and the `root` user. Please change the default password for `root` to something more special :wink:
|
||||
|
||||
**Volumes and directories**
|
||||
|
||||
_default: volumes_
|
||||
|
||||
This is the place where your uploaded files are stored. Normally this is a so called _volume_ which can be reused by different docker containers. One might prefer to store the files directly on the host system - for this the config section is prepared with what is called _bind-mounted host directory_. Just adjust the paths and Invoice Ninja stores the user files on the host system.
|
||||
|
||||
```yml
|
||||
volumes:
|
||||
...
|
||||
# Configure your mounted directories, make sure the folder 'public' and 'storage'
|
||||
# exist, before mounting them
|
||||
#- public:/var/www/app/public
|
||||
#- storage:/var/www/app/storage
|
||||
# you may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
|
||||
- ./docker/app/public:/var/www/app/public:rw,delegated
|
||||
- ./docker/app/storage:/var/www/app/storage:rw,delegated
|
||||
```
|
||||
|
||||
The sample above stores the files on the post at `./docker/app/public` and `./docker/app/storage`.
|
||||
|
||||
:warning: If using bind-mounted host directories make sure they exists and have proper rights. See [here](#create-folders-for-data-persistence) for details.
|
||||
|
||||
## Docker secrets
|
||||
|
||||
:information_source: This feature is borrowed from [mariadb docker image](https://hub.docker.com/_/mariadb).
|
||||
|
||||
As an alternative to passing sensitive information via environment variables, `_FILE` may be appended to the below listed environment variables, causing the initialization script to load the values for those variables from files present in the container. In particular, this can be used to load passwords from Docker secrets stored in _/run/secrets/<secret_name>_ files.
|
||||
|
||||
Supported are these variables:
|
||||
`APP_KEY`, `API_SECRET`, `CLOUDFLARE_API_KEY`, `DB_USERNAME`, `DB_PASSWORD`, `MAIL_USERNAME`, `MAIL_PASSWORD`, `MAILGUN_SECRET`, `S3_KEY`, `S3_SECRET`
|
||||
|
||||
|
||||
## Debugging your Docker setup
|
||||
|
||||
Even when running your Invoice Ninja setup with Docker - errors can occur. Depending on where the error happens - the webserver, Invoice Ninja or the database - different log files can be responsible.
|
||||
|
||||
### Show logs without `docker-compose`
|
||||
|
||||
If you are not running `docker-compose` you first need to find the container id for your php container with `docker ps`. Then you can run
|
||||
|
||||
```shell
|
||||
docker logs -f <CONTAINER NAME>
|
||||
```
|
||||
|
||||
This gives you a constant output of the log files for the php container.
|
||||
|
||||
### Show logs with `docker-compose`
|
||||
|
||||
If you are running the `docker-compose` setup you can output all logs, from all containers, with the following command
|
||||
|
||||
```shell
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
If you better want a physical log file in in your `storage/logs` folder, just add `-e LOG=single` to the [usage](#usage) command.
|
||||
Or add an environment variable
|
||||
|
||||
```yml
|
||||
...
|
||||
environment:
|
||||
LOG: single
|
||||
...
|
||||
```
|
||||
|
||||
to your `docker-compose.yml`.
|
||||
|
||||
This generated log file will only hold Invoice Ninja information.
|
||||
|
||||
@@ -1,83 +1,78 @@
|
||||
FROM php:7.0-fpm-alpine
|
||||
ARG PHP_VERSION=7.2
|
||||
|
||||
MAINTAINER Samuel Laulhau <sam@lalop.co>
|
||||
FROM php:${PHP_VERSION}-fpm-alpine
|
||||
|
||||
LABEL maintainer="Samuel Laulhau <sam@lalop.co>, Holger Lösken <holger.loesken@codedge.de>"
|
||||
|
||||
#####
|
||||
# SYSTEM REQUIREMENT
|
||||
#####
|
||||
ENV PHANTOMJS phantomjs-2.1.1-linux-x86_64
|
||||
RUN apk update \
|
||||
&& apk add --no-cache libmcrypt-dev git gmp-dev freetype-dev libjpeg-turbo-dev \
|
||||
coreutils chrpath fontconfig libpng-dev
|
||||
|
||||
RUN ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/local/include/ \
|
||||
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
|
||||
&& docker-php-ext-configure gmp \
|
||||
&& docker-php-ext-install iconv mcrypt mbstring pdo pdo_mysql zip gd gmp opcache \
|
||||
&& echo "php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED">>/usr/local/etc/php-fpm.d/www.conf
|
||||
|
||||
RUN cd /usr/share \
|
||||
&& curl -L https://github.com/Overbryd/docker-phantomjs-alpine/releases/download/2.11/phantomjs-alpine-x86_64.tar.bz2 | tar xj \
|
||||
&& ln -s /usr/share/phantomjs/phantomjs /usr/local/bin/phantomjs
|
||||
|
||||
|
||||
# set recommended PHP.ini settings
|
||||
# see https://secure.php.net/manual/en/opcache.installation.php
|
||||
RUN { \
|
||||
echo 'opcache.memory_consumption=128'; \
|
||||
echo 'opcache.interned_strings_buffer=8'; \
|
||||
echo 'opcache.max_accelerated_files=4000'; \
|
||||
echo 'opcache.revalidate_freq=60'; \
|
||||
echo 'opcache.fast_shutdown=1'; \
|
||||
echo 'opcache.enable_cli=1'; \
|
||||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
|
||||
|
||||
#####
|
||||
# INSTALL COMPOSER
|
||||
#####
|
||||
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
||||
|
||||
|
||||
#####
|
||||
# DOWNLOAD AND INSTALL INVOICE NINJA
|
||||
#####
|
||||
|
||||
ENV INVOICENINJA_VERSION 4.2.2
|
||||
|
||||
RUN curl -o invoiceninja.tar.gz -SL https://github.com/hillelcoren/invoice-ninja/archive/v${INVOICENINJA_VERSION}.tar.gz \
|
||||
&& tar -xzf invoiceninja.tar.gz -C /var/www/ \
|
||||
&& rm invoiceninja.tar.gz \
|
||||
&& mv /var/www/invoiceninja-${INVOICENINJA_VERSION} /var/www/app \
|
||||
&& chown -R www-data:www-data /var/www/app \
|
||||
&& composer install --working-dir /var/www/app -o --no-dev --no-interaction --no-progress \
|
||||
&& chown -R www-data:www-data /var/www/app/bootstrap/cache \
|
||||
&& mv /var/www/app/storage /var/www/app/docker-backup-storage \
|
||||
&& mv /var/www/app/public /var/www/app/docker-backup-public \
|
||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||
|
||||
|
||||
######
|
||||
# DEFAULT ENV
|
||||
######
|
||||
ENV DB_HOST mysql
|
||||
ENV DB_DATABASE ninja
|
||||
ENV DB_USERNAME ninja
|
||||
ENV DB_PASSWORD ninja
|
||||
ENV APP_KEY SomeRandomString
|
||||
ENV LOG errorlog
|
||||
ENV APP_DEBUG 0
|
||||
ENV APP_CIPHER rijndael-128
|
||||
ENV SELF_UPDATER_SOURCE ''
|
||||
ENV PHANTOMJS_BIN_PATH /usr/local/bin/phantomjs
|
||||
|
||||
|
||||
#use to be mounted into nginx for exemple
|
||||
VOLUME /var/www/app/public
|
||||
|
||||
ARG INVOICENINJA_VERSION
|
||||
WORKDIR /var/www/app
|
||||
|
||||
COPY entrypoint.sh /usr/local/bin/invoice-entrypoint
|
||||
# RUN chmod +x /usr/local/bin/invoice-entrypoint
|
||||
COPY entrypoint.sh /usr/local/bin/docker-entrypoint
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint
|
||||
|
||||
ENTRYPOINT ["invoice-entrypoint"]
|
||||
CMD ["php-fpm"]
|
||||
RUN set -eux; \
|
||||
apk add --no-cache \
|
||||
gmp-dev \
|
||||
freetype-dev \
|
||||
libarchive-tools \
|
||||
libjpeg-turbo-dev \
|
||||
libpng-dev \
|
||||
libwebp-dev\
|
||||
libzip-dev
|
||||
|
||||
RUN docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include --with-webp-dir=/usr/include --with-freetype-dir=/usr/include/; \
|
||||
docker-php-ext-configure zip --with-libzip; \
|
||||
docker-php-ext-install -j$(nproc) \
|
||||
iconv \
|
||||
gd \
|
||||
gmp \
|
||||
mbstring \
|
||||
opcache \
|
||||
pdo \
|
||||
pdo_mysql \
|
||||
zip
|
||||
|
||||
COPY ./config/php/php.ini /usr/local/etc/php/php.ini
|
||||
COPY ./config/php/php-cli.ini /usr/local/etc/php/php-cli.ini
|
||||
|
||||
# Separate user
|
||||
ENV IN_USER=invoiceninja
|
||||
|
||||
RUN addgroup -S "$IN_USER" && \
|
||||
adduser \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--home "$(pwd)" \
|
||||
--ingroup "$IN_USER" \
|
||||
--no-create-home \
|
||||
"$IN_USER"; \
|
||||
addgroup "$IN_USER" www-data; \
|
||||
chown -R "$IN_USER":"$IN_USER" .
|
||||
|
||||
USER $IN_USER
|
||||
|
||||
# Download and install IN
|
||||
ENV INVOICENINJA_VERSION="${INVOICENINJA_VERSION}"
|
||||
|
||||
RUN curl -s -o /tmp/ninja.zip -SL https://download.invoiceninja.com/ninja-v${INVOICENINJA_VERSION}.zip \
|
||||
&& bsdtar --strip-components=1 -C /var/www/app -xf /tmp/ninja.zip \
|
||||
&& rm /tmp/ninja.zip \
|
||||
&& mv /var/www/app/storage /var/www/app/docker-backup-storage \
|
||||
&& mv /var/www/app/public /var/www/app/docker-backup-public \
|
||||
&& mkdir -p /var/www/app/public/logo /var/www/app/storage \
|
||||
&& cp /var/www/app/.env.example /var/www/app/.env \
|
||||
&& 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"]
|
||||
95
alpine/Dockerfile_v5
Normal file
95
alpine/Dockerfile_v5
Normal file
@@ -0,0 +1,95 @@
|
||||
ARG PHP_VERSION=7.3
|
||||
|
||||
# Get Invoice Ninja
|
||||
FROM alpine:latest as base
|
||||
ARG INVOICENINJA_VERSION
|
||||
|
||||
RUN set -eux; \
|
||||
apk add --no-cache \
|
||||
curl \
|
||||
libarchive-tools; \
|
||||
mkdir -p /var/www/app
|
||||
|
||||
RUN curl -o /tmp/ninja.tar.gz -LJ0 https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION \
|
||||
&& bsdtar --strip-components=1 -C /var/www/app -xf /tmp/ninja.tar.gz \
|
||||
&& rm /tmp/ninja.tar.gz \
|
||||
&& cp -R /var/www/app/storage /var/www/app/docker-backup-storage \
|
||||
&& cp -R /var/www/app/public /var/www/app/docker-backup-public \
|
||||
&& mkdir -p /var/www/app/public/logo /var/www/app/storage \
|
||||
&& cp /var/www/app/.env.example /var/www/app/.env \
|
||||
&& cp /var/www/app/.env.dusk.example /var/www/app/.env.dusk.local \
|
||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||
|
||||
# Install nodejs packages
|
||||
FROM node:12-alpine as frontend
|
||||
|
||||
COPY --from=base /var/www/app /var/www/app
|
||||
WORKDIR /var/www/app/
|
||||
|
||||
RUN npm install
|
||||
|
||||
# Prepare php image
|
||||
FROM php:${PHP_VERSION}-fpm-alpine
|
||||
ARG INVOICENINJA_VERSION
|
||||
ENV INVOICENINJA_VERSION=$INVOICENINJA_VERSION
|
||||
|
||||
LABEL maintainer="Samuel Laulhau <sam@lalop.co>, Holger Lösken <holger.loesken@codedge.de>"
|
||||
|
||||
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
|
||||
|
||||
RUN set -eux; \
|
||||
apk add --no-cache \
|
||||
freetype-dev \
|
||||
gmp-dev \
|
||||
libjpeg-turbo-dev \
|
||||
libpng-dev \
|
||||
libzip-dev; \
|
||||
docker-php-ext-configure zip --with-libzip; \
|
||||
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/; \
|
||||
docker-php-ext-install -j$(nproc) \
|
||||
bcmath \
|
||||
exif \
|
||||
gd \
|
||||
gmp \
|
||||
mbstring \
|
||||
mysqli \
|
||||
opcache \
|
||||
pdo \
|
||||
pdo_mysql \
|
||||
zip
|
||||
|
||||
COPY ./config/php/php.ini /usr/local/etc/php/php.ini
|
||||
COPY ./config/php/php-cli.ini /usr/local/etc/php/php-cli.ini
|
||||
|
||||
## Separate user
|
||||
ENV INVOICENINJA_USER=invoiceninja
|
||||
|
||||
RUN addgroup -S "$INVOICENINJA_USER" && \
|
||||
adduser \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--home "$(pwd)" \
|
||||
--ingroup "$INVOICENINJA_USER" \
|
||||
--no-create-home \
|
||||
"$INVOICENINJA_USER"; \
|
||||
addgroup "$INVOICENINJA_USER" www-data; \
|
||||
chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app
|
||||
|
||||
# Install Composer
|
||||
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer; \
|
||||
composer global require hirak/prestissimo;
|
||||
|
||||
USER $INVOICENINJA_USER
|
||||
|
||||
RUN composer install --no-dev --no-suggest --no-progress
|
||||
|
||||
# Override the environment settings from projects .env file
|
||||
ENV APP_ENV production
|
||||
ENV LOG errorlog
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint"]
|
||||
CMD ["php-fpm"]
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
if [ ! -d /var/www/app/storage ]; then
|
||||
cp -Rp /var/www/app/docker-backup-storage /var/www/app/storage
|
||||
else
|
||||
IN_STORAGE_BACKUP="$(ls /var/www/app/docker-backup-storage/)"
|
||||
for path in $IN_STORAGE_BACKUP; do
|
||||
if [ ! -e "/var/www/app/storage/$path" ]; then
|
||||
cp -Rp "/var/www/app/docker-backup-storage/$path" "/var/www/app/storage/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ! -d /var/www/app/public/logo ]; then
|
||||
cp -Rp /var/www/app/docker-backup-public/logo /var/www/app/public/logo
|
||||
else
|
||||
IN_LOGO_BACKUP="$(ls /var/www/app/docker-backup-public/logo/)"
|
||||
for path in $IN_LOGO_BACKUP; do
|
||||
if [ ! -e "/var/www/app/public/logo/$path" ]; then
|
||||
cp -Rp "/var/www/app/docker-backup-public/logo/$path" "/var/www/app/public/logo/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# compare public volume version with image version
|
||||
if [ ! -e /var/www/app/public/version ] || [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then
|
||||
echo 'clone public directory'
|
||||
cp -Rp /var/www/app/docker-backup-public/* /var/www/app/public/
|
||||
echo $INVOICENINJA_VERSION > /var/www/app/public/version
|
||||
fi
|
||||
|
||||
#php artisan optimize --force
|
||||
#php artisan migrate --force
|
||||
|
||||
#if [ ! -e "/var/www/app/is-seeded" ]; then
|
||||
#php artisan db:seed --force
|
||||
#touch "/var/www/app/is-seeded"
|
||||
#fi
|
||||
|
||||
echo 'start'
|
||||
exec "$@"
|
||||
6
config/caddy/Caddyfile
Normal file
6
config/caddy/Caddyfile
Normal file
@@ -0,0 +1,6 @@
|
||||
{$APP_URL} {
|
||||
root * /var/www/app/public
|
||||
php_fastcgi app:9000
|
||||
encode zstd gzip
|
||||
file_server browse
|
||||
}
|
||||
18
config/php/php-cli.ini
Normal file
18
config/php/php-cli.ini
Normal file
@@ -0,0 +1,18 @@
|
||||
session.auto_start = Off
|
||||
short_open_tag = Off
|
||||
|
||||
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
|
||||
|
||||
opcache.enable_cli=1
|
||||
opcache.fast_shutdown=1
|
||||
opcache.memory_consumption=128
|
||||
opcache.interned_strings_buffer=8
|
||||
opcache.max_accelerated_files=4000
|
||||
opcache.revalidate_freq=60
|
||||
# http://symfony.com/doc/current/performance.html
|
||||
realpath_cache_size = 4096K
|
||||
realpath_cache_ttl = 600
|
||||
|
||||
memory_limit = 2G
|
||||
post_max_size = 6M
|
||||
upload_max_filesize = 5M
|
||||
17
config/php/php.ini
Normal file
17
config/php/php.ini
Normal file
@@ -0,0 +1,17 @@
|
||||
session.auto_start = Off
|
||||
short_open_tag = Off
|
||||
|
||||
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
|
||||
|
||||
opcache.enable_cli=1
|
||||
opcache.fast_shutdown=1
|
||||
opcache.memory_consumption=128
|
||||
opcache.interned_strings_buffer=8
|
||||
opcache.max_accelerated_files=4000
|
||||
opcache.revalidate_freq=60
|
||||
# http://symfony.com/doc/current/performance.html
|
||||
realpath_cache_size = 4096K
|
||||
realpath_cache_ttl = 600
|
||||
|
||||
post_max_size = 6M
|
||||
upload_max_filesize = 5M
|
||||
92
docker-compose.yml
Normal file
92
docker-compose.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
server:
|
||||
image: caddy:alpine
|
||||
restart: always
|
||||
environment:
|
||||
- APP_URL=https://localhost
|
||||
volumes:
|
||||
# Vhost configuration
|
||||
- ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
|
||||
|
||||
# Configure your mounted directories, make sure the folder 'public' and 'storage'
|
||||
# exist, before mounting them
|
||||
- public:/var/www/app/public
|
||||
- storage:/var/www/app/storage
|
||||
# you may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
|
||||
# - ./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
|
||||
|
||||
app:
|
||||
image: invoiceninja/invoiceninja:5
|
||||
restart: always
|
||||
environment:
|
||||
- APP_URL=https://localhost
|
||||
- APP_KEY=<INSERT THE GENERATED APPLICATION KEY HERE>
|
||||
- MULTI_DB_ENABLED=false
|
||||
- DB_HOST1=db
|
||||
volumes:
|
||||
# Configure your mounted directories, make sure the folder 'public' and 'storage'
|
||||
# exist, before mounting them
|
||||
- public:/var/www/app/public
|
||||
- storage:/var/www/app/storage
|
||||
# you may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
|
||||
# - ./docker/app/public:/var/www/app/public:rw,delegated
|
||||
# - ./docker/app/storage:/var/www/app/storage:rw,delegated
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- invoiceninja
|
||||
|
||||
db:
|
||||
image: mysql:5
|
||||
restart: always
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=ninjaAdm1nPassword
|
||||
- MYSQL_USER=ninja
|
||||
- MYSQL_PASSWORD=ninja
|
||||
- MYSQL_DATABASE=db-ninja-01
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql:rw
|
||||
# you may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
|
||||
# - ./docker/mysql/data:/var/lib/mysql:rw,delegated
|
||||
networks:
|
||||
- invoiceninja
|
||||
|
||||
|
||||
# cron:
|
||||
# image: invoiceninja/invoiceninja
|
||||
# volumes:
|
||||
# - storage:/var/www/app/storage
|
||||
# - logo:/var/www/app/public/logo
|
||||
# - public:/var/www/app/public
|
||||
# entrypoint: |
|
||||
# bash -c 'bash -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
|
||||
|
||||
volumes:
|
||||
mysql-data:
|
||||
public:
|
||||
storage:
|
||||
|
||||
networks:
|
||||
invoiceninja:
|
||||
@@ -1,16 +0,0 @@
|
||||
MYSQL_DATABASE=ninja
|
||||
MYSQL_ROOT_PASSWORD=pwd
|
||||
|
||||
APP_DEBUG=0
|
||||
APP_URL=http://localhost:8000
|
||||
APP_KEY=SomeRandomStringSomeRandomString
|
||||
APP_CIPHER=AES-256-CBC
|
||||
DB_USERNAME=root
|
||||
DB_PASSWORD=pwd
|
||||
DB_HOST=mysql
|
||||
MAIL_HOST=mail.service.host
|
||||
MAIL_USERNAME=username
|
||||
MAIL_PASSWORD=password
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_FROM_NAME="My name"
|
||||
MAIL_FROM_ADDRESS=user@mail.com
|
||||
@@ -1,52 +0,0 @@
|
||||
version: "2"
|
||||
|
||||
services:
|
||||
db:
|
||||
image: mysql
|
||||
env_file: .env
|
||||
restart: always
|
||||
volumes:
|
||||
- data-volume:/var/lib/mysql
|
||||
|
||||
app:
|
||||
image: invoiceninja/invoiceninja
|
||||
links:
|
||||
- db:mysql
|
||||
env_file: .env
|
||||
restart: always
|
||||
volumes:
|
||||
- ./srv/invoiceninja/storage:/var/www/app/storage:rw
|
||||
- ./srv/invoiceninja/logo:/var/www/app/public/logo:rw
|
||||
|
||||
web:
|
||||
image: nginx
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
links:
|
||||
- app
|
||||
volumes_from:
|
||||
- app
|
||||
ports:
|
||||
- 8000:80
|
||||
|
||||
cron:
|
||||
image: invoiceninja/invoiceninja
|
||||
links:
|
||||
- db:mysql
|
||||
env_file: .env
|
||||
volumes_from:
|
||||
- app
|
||||
entrypoint: |
|
||||
bash -c 'bash -s <<EOF
|
||||
trap "break;exit" SIGHUP SIGINT SIGTERM
|
||||
sleep 300s
|
||||
while /bin/true; do
|
||||
./artisan ninja:send-invoices
|
||||
./artisan ninja:send-reminders
|
||||
sleep 1h
|
||||
done
|
||||
EOF'
|
||||
|
||||
volumes:
|
||||
data-volume:
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
user www-data;
|
||||
|
||||
events {
|
||||
worker_connections 768;
|
||||
}
|
||||
|
||||
http {
|
||||
upstream backend {
|
||||
server app:9000;
|
||||
}
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
|
||||
server {
|
||||
listen 80 default;
|
||||
server_name your_ininja_site;
|
||||
|
||||
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; }
|
||||
|
||||
sendfile off;
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass backend;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_intercept_errors off;
|
||||
fastcgi_buffer_size 16k;
|
||||
fastcgi_buffers 4 16k;
|
||||
}
|
||||
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
}
|
||||
119
entrypoint.sh
Normal file → Executable file
119
entrypoint.sh
Normal file → Executable file
@@ -1,42 +1,103 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
if [ ! -d /var/www/app/storage ]; then
|
||||
cp -Rp /var/www/app/docker-backup-storage /var/www/app/storage
|
||||
else
|
||||
IN_STORAGE_BACKUP="$(ls /var/www/app/docker-backup-storage/)"
|
||||
for path in $IN_STORAGE_BACKUP; do
|
||||
if [ ! -e "/var/www/app/storage/$path" ]; then
|
||||
cp -Rp "/var/www/app/docker-backup-storage/$path" "/var/www/app/storage/"
|
||||
fi
|
||||
done
|
||||
# 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
|
||||
|
||||
if [ ! -d /var/www/app/public/logo ]; then
|
||||
cp -Rp /var/www/app/docker-backup-public/logo /var/www/app/public/logo
|
||||
BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
||||
BAK_LOGO_PATH=/var/www/app/docker-backup-public/logo/
|
||||
|
||||
if [ ! -d /var/www/app/storage ]; then
|
||||
cp -Rp $BAK_STORAGE_PATH /var/www/app/storage
|
||||
else
|
||||
IN_LOGO_BACKUP="$(ls /var/www/app/docker-backup-public/logo/)"
|
||||
for path in $IN_LOGO_BACKUP; do
|
||||
if [ ! -e "/var/www/app/public/logo/$path" ]; then
|
||||
cp -Rp "/var/www/app/docker-backup-public/logo/$path" "/var/www/app/public/logo/"
|
||||
fi
|
||||
done
|
||||
if [ -d $BAK_STORAGE_PATH ]; then
|
||||
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
|
||||
fi
|
||||
|
||||
if [ ! -d /var/www/app/public/logo ] && [ -d $BAK_LOGO_PATH ]; then
|
||||
cp -Rp $BAK_LOGO_PATH /var/www/app/public/logo
|
||||
else
|
||||
if [ -d $BAK_LOGO_PATH ]; then
|
||||
IN_LOGO_BACKUP="$(ls $BAK_LOGO_PATH)"
|
||||
for path in $IN_LOGO_BACKUP; do
|
||||
if [ ! -e "/var/www/app/public/logo/$path" ]; then
|
||||
cp -Rp "$BAK_LOGO_PATH/$path" "/var/www/app/public/logo/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# compare public volume version with image version
|
||||
if [ ! -e /var/www/app/public/version ] || [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then
|
||||
echo 'clone public directory'
|
||||
cp -Rp /var/www/app/docker-backup-public/* /var/www/app/public/
|
||||
echo $INVOICENINJA_VERSION > /var/www/app/public/version
|
||||
cp -au /var/www/app/docker-backup-public/* /var/www/app/public/
|
||||
echo $INVOICENINJA_VERSION > /var/www/app/public/version
|
||||
fi
|
||||
|
||||
#php artisan optimize --force
|
||||
#php artisan migrate --force
|
||||
# Set permission for web server to create/update files
|
||||
chown -R invoiceninja:www-data /var/www/app/storage /var/www/app/public /var/www/app/bootstrap
|
||||
|
||||
#if [ ! -e "/var/www/app/is-seeded" ]; then
|
||||
#php artisan db:seed --force
|
||||
#touch "/var/www/app/is-seeded"
|
||||
#fi
|
||||
# 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_PASSWORD'
|
||||
file_env 'MAIL_USERNAME'
|
||||
file_env 'MAIL_PASSWORD'
|
||||
file_env 'MAILGUN_SECRET'
|
||||
file_env 'S3_KEY'
|
||||
file_env 'S3_SECRET'
|
||||
|
||||
echo 'start'
|
||||
exec "$@"
|
||||
# Run Laravel stuff
|
||||
php artisan config:cache
|
||||
php artisan optimize
|
||||
|
||||
exec docker-php-entrypoint "$@"
|
||||
|
||||
Reference in New Issue
Block a user