diff --git a/Dockerfile b/Dockerfile
index 327cb1c..9b92496 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.11-slim as base
+FROM python:3.11-slim AS base
# set version label
ARG BUILD_DATE
@@ -7,13 +7,13 @@ LABEL build_version="Apprise API version:- ${VERSION} Build-date:- ${BUILD_DATE}
LABEL maintainer="Chris-Caron"
# set environment variables
-ENV PYTHONDONTWRITEBYTECODE 1
-ENV PYTHONUNBUFFERED 1
-ENV APPRISE_CONFIG_DIR /config
-ENV APPRISE_ATTACH_DIR /attach
-ENV APPRISE_PLUGIN_PATHS /plugin
+ENV PYTHONDONTWRITEBYTECODE=1
+ENV PYTHONUNBUFFERED=1
+ENV APPRISE_CONFIG_DIR=/config
+ENV APPRISE_ATTACH_DIR=/attach
+ENV APPRISE_PLUGIN_PATHS=/plugin
-FROM base as builder
+FROM base AS builder
WORKDIR /build/
@@ -41,11 +41,11 @@ RUN set -eux && \
--no-binary cryptography \
cryptography
-FROM base as runtime
+FROM base AS runtime
# Install requirements and gunicorn
COPY ./requirements.txt /etc/requirements.txt
-COPY --from=builder /build/*.whl .
+COPY --from=builder /build/*.whl ./
RUN set -eux && \
echo "Installing cryptography" && \
pip3 install *.whl && \
@@ -55,6 +55,9 @@ RUN set -eux && \
apt-get update -qq && \
apt-get install -y -qq \
nginx && \
+ echo "Installing tools" && \
+ apt-get install -y -qq \
+ sed && \
echo "Cleaning up" && \
apt-get --yes autoremove --purge && \
apt-get clean --yes && \
@@ -73,16 +76,13 @@ WORKDIR /opt/apprise
# Copy over Apprise API
COPY apprise_api/ webapp
-#
-# # Configuration Permissions (to run nginx as a non-root user)
+# Configuration Permissions (to run nginx as a non-root user)
RUN umask 0002 && \
- mkdir -p /attach /config /plugin /run/apprise && \
- chown www-data:www-data -R /run/apprise /var/lib/nginx /attach /config /plugin
+ touch /etc/nginx/server-override.conf && \
+ touch /etc/nginx/location-override.conf
-# Handle running as a non-root user (www-data is id/gid 33)
-USER www-data
VOLUME /config
VOLUME /attach
VOLUME /plugin
EXPOSE 8000
-CMD ["/usr/local/bin/supervisord", "-c", "/opt/apprise/webapp/etc/supervisord.conf"]
+CMD ["/opt/apprise/webapp/supervisord-startup"]
diff --git a/README.md b/README.md
index 20b6e2c..474dd0a 100644
--- a/README.md
+++ b/README.md
@@ -56,11 +56,17 @@ docker pull caronc/apprise:latest
# setting APPRISE_STATEFUL_MODE to simple allows you to map your defined {key}
# straight to a file found in the `/config` path. In simple home configurations
# this is sometimes the ideal expectation.
+#
+# Set your User ID or Group ID if you wish to over-ride the default of 1000
+# in the below example, we make sure it runs as the user we created the container as
+
docker run --name apprise \
-p 8000:8000 \
- -v /var/lib/apprise/config:/config \
- -v /var/lib/apprise/plugin:/plugin \
- -v /var/lib/apprise/attach:/attach \
+ -e PUID=$(id -u) \
+ -e PGID=$(id -g) \
+ -v /path/to/local/config:/config \
+ -v /path/to/local/plugin:/plugin \
+ -v /path/to/local/attach:/attach \
-e APPRISE_STATEFUL_MODE=simple \
-e APPRISE_WORKER_COUNT=1 \
-d caronc/apprise:latest
@@ -72,11 +78,17 @@ A common change one might make is to update the Dockerfile to point to the maste
# Setup your environment the way you like
docker build -t apprise/local:latest -f Dockerfile .
+# Set up a directory you wish to store your configuration in:
+mkdir -p /etc/apprise
+
# Launch your instance
docker run --name apprise \
-p 8000:8000 \
+ -e PUID=$(id -u) \
+ -e PGID=$(id -g) \
-e APPRISE_STATEFUL_MODE=simple \
-e APPRISE_WORKER_COUNT=1 \
+ -v /etc/apprise:/config \
-d apprise/local:latest
```
A `docker-compose.yml` file is already set up to grant you an instant production ready simulated environment:
@@ -86,40 +98,6 @@ A `docker-compose.yml` file is already set up to grant you an instant production
docker-compose up
```
-### Config Directory Permissions
-
-Under the hood, An NginX services is reading/writing your configuration files as the user (and group) `www-data` which generally has the id of `33`. In preparation so that you don't get the error: `An error occured saving configuration.` consider also setting up your local `/var/lib/apprise/config` permissions as:
-
-```bash
-# Create a user/group (if one doesn't already exist) owned
-# by the user and group id of 33
-id 33 &>/dev/null || sudo useradd \
- --system --no-create-home --shell /bin/false \
- -u 33 -g 33 www-data
-
-# Securely set the directory limiting access to only those who
-# are part of the www-data group:
-sudo chmod 770 -R /var/lib/apprise/config
-sudo chown 33:33 -R /var/lib/apprise/config
-
-# Now optionally add yourself to the group if you wish to be able to view
-# contents.
-sudo usermod -a -G 33 $(whoami)
-
-# You may need to log out and back in again for the above usermod
-# to reflect on you. Alternatively you can just type the following
-# and it will work as a temporary solution:
-sudo su - $(whoami)
-```
-
-Alternatively a dirty solution is to just set the directory with full read/write permissions (which is not ideal in a production environment):
-
-```bash
-# Grant full permission to the local directory you're saving your
-# Apprise configuration to:
-chmod 777 /var/lib/apprise/config
-```
-
## Dockerfile Details
The following architectures are supported: `amd64`, `arm/v7`, and `arm64`. The following tags can be used:
@@ -398,6 +376,8 @@ The use of environment variables allow you to provide over-rides to default sett
| Variable | Description |
|--------------------- | ----------- |
+| `PUID` | The User ID you wish the Apprise instance under the hood to run as. The default is `1000` if not otherwise specified.
+| `PGID` | The Group ID you wish the Apprise instance under the hood to run as. The default is `1000` if not otherwise specified.
| `APPRISE_DEFAULT_THEME` | Can be set to `light` or `dark`; it defaults to `light` if not otherwise provided. The theme can be toggled from within the website as well.
| `APPRISE_DEFAULT_CONFIG_ID` | Defaults to `apprise`. This is the presumed configuration ID you always default to when accessing the configuration manager via the website.
| `APPRISE_CONFIG_DIR` | Defines an (optional) persistent store location of all configuration files saved. By default:
- Configuration is written to the `apprise_api/var/config` directory when just using the _Django_ `manage runserver` script. However for the path for the container is `/config`.
@@ -421,8 +401,56 @@ The use of environment variables allow you to provide over-rides to default sett
| `DEBUG` | This defaults to `no` and can however be set to `yes` by simply defining the global variable as such.
-## Development Environment
+## Nginx Overrides
+
+The 2 files you can override are:
+1. `/etc/nginx/location-override.conf` which is included within all of the Apprise API NginX `location` references.
+1. `/etc/nginx/server-override.conf` which is included within Apprise API `server` reference.
+
+### Authentication
+Under the hood, Apprise-API is running a small NginX instance. It allows for you to inject your own configuration into it. One thing you may wish to add is basic authentication.
+
+Below we create ourselves some nginx directives we'd like to apply to our Apprise API:
+```nginx
+# Our override.conf file:
+auth_basic "Apprise API Restricted Area";
+auth_basic_user_file /etc/nginx/.htpasswd;
+```
+Now let's set ourselves up with a simple password file (for more info on htpasswd files, see [here](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/)
+```bash
+# Create ourselves a for our user 'foobar'; the below will prompt you for the pass
+# you want to provide:
+htpasswd -c apprise_api.htpasswd foobar
+
+# Note: the -c above is only needed to create the database for the first time
+```
+
+Now we can create our docker container with this new authentication information:
+```bash
+# Create our container containing Basic Auth:
+docker run --name apprise \
+ -p 8000:8000 \
+ -e PUID=$(id -u) \
+ -e PGID=$(id -g) \
+ -v /path/to/local/config:/config \
+ -v /path/to/local/attach:/attach \
+ -v ./override.conf:/etc/nginx/location-override.conf:ro \
+ -v ./apprise_api.htpasswd:/etc/nginx/.htpasswd:ro \
+ -e APPRISE_STATEFUL_MODE=simple \
+ -e APPRISE_WORKER_COUNT=1 \
+ -d caronc/apprise:latest
+```
+
+Visit http://localhost:8000 to see if things are working as expected. If you followed the example above, you should log in as the user `foobar` using the credentials you provided the account.
+
+You can add further accounts to the existing database by omitting the `-c` switch:
+```bash
+# Add another account
+htpasswd apprise_api.htpasswd user2
+```
+
+## Development Environment
The following should get you a working development environment to test with:
```bash
diff --git a/apprise_api/api/templates/base.html b/apprise_api/api/templates/base.html
index 2ebe111..037c2fe 100644
--- a/apprise_api/api/templates/base.html
+++ b/apprise_api/api/templates/base.html
@@ -37,9 +37,9 @@