/containers
The /containers sub-application is designed so that certain apps are stopped until required (OnDemand Apps)
Apps not recently used are stopped
- periodically, the apps (urls) listed in config/apps.ini are checked for usage
- if the app URL is not shown in the logs within the last idleTime minutes AND the app containers are running, each container is stopped
- if the app shows any activity within the configured idleTime window, it is logged and the next app is checked
- if the app shows no activity within the configured idleTime window, it is logged and then each app container is stopped
Applications are checked at a period designated by the config option auto_refresh in config/apps.ini however a manual check can be run to identify any apps that can be suspended, by either
- opening https://containers.notflix.pknw1.co.uk/containers/check?api=<api_key>
- opening https://containers.notflix.pknw1.co.uk/containers/suspend?api=<api_key>
If an App is in the stopped state, each app container is started and then, once a confgiured grace period has passed, the user is redirected to the original URL
Apps currently suspended but requested
Any app thhat is requested via it's AP url (noted as the section header and withion section of config/apps.ini
) will trigger the default HTTP 503 redirect to https://containers.notflix.pknw1.co.uk/containers/<app>
This will attempt to restart each container for the app to funtion and will then, after a configurable delay, automatically redirect to the originally requested App URL - which should now have been
- restarted from a stopped state
- re-registered its
VIRTUAL_HOST
with internal_proxy via the dockergen service monitoring/var/run/docker.sock
- paused on the informartion page to allow all services and dependencies to restart
App Configuration
The sub-app requires default settings and each application (app url) that is deasired to be configured in config/apps.ini
Default Section | |
api_key |
|
logs_folder |
|
auto_refresh |
|
redirect_url |
|
about fields |
Per Application Section | |
[apps.notflix.pknw1.co.uk] |
|
monitoringStatus |
|
internal_proxy |
|
status_source |
|
containerNames |
|
monitorLog |
|
monitorUrl |
|
idleTime |
|
countdown |
|
currentStatus |
|
lastUpdate |
|
lastChecked |
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers/<app>/logs
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers/about
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
@app.routes /containers
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/<app>/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/about')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/all/logs')
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/check', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/service/stop/<section_name>', methods=['GET'])
./lib/autoshutdown.py:@autoshutdown_blueprint.route('/containers/status', methods=['GET'])
Sub-Application Routes
Unprotected Routes | Description |
/containers | |
/containers/about | |
/containers/<app>/logs | |
/containers/<status | |
/containers/service/<app> |
Protected Routes | Description |
/containers/check?api=<api_key> | |
/containers/suspend?api=<api_key> | |
/containers/cservice/stop/<app>?api=<api_key> |