Skip to main content

/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>