# Custom Apps - Python

pknw1/notflix\_adduser:sso-v5.5

- notflix.pknw1.co.uk
- services.pknw1.co.uk

- containers.notflix.pknw1.co.uk
- containers.notflix.pknw1.co.uk/containers
- containers.notflix.pknw1.co.uk/containers/&lt;app&gt;/logs
- containers.notflix.pknw1.co.uk/containers/all/logs
- containers.notflix.pknw1.co.uk/containers/status
- containers.notflix.pknw1.co.uk/containers/check?api=
- containers.notflix.pknw1.co.uk/containers/service/&lt;app&gt;
- containers.notflix.pknw1.co.uk/containers/service/stop/&lt;app&gt;

- register.notflix.pknw1.co.uk
- register.notflix.pknw1.co.uk/sso
- register.notflix.pknw1.co.uk/sso/check\_success
- register.notflix.pknw1.co.uk/sso/register
- register.notflix.pknw1.co.uk/sso/auth
- register.notflix.pknw1.co.uk/sso/login
- register.notflix.pknw1.co.uk/sso/logout
- register.notflix.pknw1.co.uk/sso/ldap\_success

# /home/apps/frontend/sso-registration

```
name: frontend
services:
  sso-registration:
    image: pknw1/notflix_adduser:sso-v5.5
    container_name: sso-registration
    hostname: sso-registration
    ports:
      - 172.22.20.1:3334:3334
    environment:
      - VIRTUAL_HOST=notflix.pknw1.co.uk,containers.notflix.pknw1.co.uk,containers.pknw1.co.uk,signup.notflix.pknw1.co.uk
      - VIRTUAL_PORT=3334
      - TZ=Europe/Paris
    networks:
      - proxy
    volumes:
      - ./config:/config
      - ./logs:/logs
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped

networks:
  proxy:
    external: true
```

<details id="bkmrk-config%2F-signup.ini-%3B"><summary>config/</summary>

<details><summary>signup.ini</summary>

```
; signup.ini


[DEFAULT]
[cookies]
enabled = false
key = 5crxnvCUG768Kwm08MwSt7-cM_J3UvPFUjo6kp-Qm7w=



[index]
enabled = false
Create New User = /register
More Info = https://info.notflix.pknw1.co.uk
Apps for Users = https://apps.notflix.pknw1.co.uk
Apps for Admin = https://apps.admin.pknw1.co.uk
OnDemand Apps = /containers/status
Status = https://status.pknw1.co.uk


[index_static_content]
enabled = false
title = Notflix Registration
text = Registration and Info Options : Choose a topic below


[sso_register]
enabled = false
ldap_Server = ldap://172.22.20.1:3890
base_dn = dc=pknw1,dc=co,dc=uk
ldap_cn = api_register_sso
ldap_password = 4as3bpni3qupbteth5kxjpz4bephdtho

[notflix]
enabled = true
url = http://jellyseerr-admin:8056/user/invite
title = Add Notflix & Requests accounts
api_key = 
api_data = {"code": "DATA_CODE", "email": "DATA_EMAIL", "username": "DATA_USERNAME", "password": "DATA_PASSWORD"}
select = Notflix

[filebrowser]
enabled = false
title = Add Download Account
url = https://fb.pknw1.co.uk/api/users
api_key = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiIiLCJuYW1lIjoiYWRkdXNlciIsImNyZWF0ZWRBdCI6MTc1MDEwMDUyMiwiZXhwaXJlc0F0Ijo0MzM5NTA4NTIyLCJiZWxvbmdzVG8iOjIsIlBlcm1pc3Npb25zIjp7ImFwaSI6dHJ1ZSwiYWRtaW4iOnRydWUsIm1vZGlmeSI6dHJ1ZSwic2hhcmUiOnRydWUsInJlYWx0aW1lIjpmYWxzZX19.MXfAGHi2N0HGdqAfPG1cq0HV9JW2i9iLWjbfmekrnZ0
api_data = {"what":"user","which":[],"data":{"stickySidebar":true,"darkMode":true,"locale":"en","viewMode":"normal","singleClick":false,"showHidden":false,"dateFormat":false,"gallerySize":3,"themeColor":"var(--blue)","quickDownload":false,"disableOnlyOfficeExt":".txt .csv .html .pdf","disableOfficePreviewExt":"","lockPassword":false,"preview":{"highQuality":true,"image":true,"video":true,"motionVideoPreview":false,"office":false,"popup":true},"permissions":{"api":false,"admin":false,"modify":false,"share":true,"realtime":false},"loginMethod":"password","password":"DATA_PASSWORD","scopes":[{"path":"/srv","name":"srv","config":{"indexingInterval":0,"disabled":false,"maxWatchers":0,"neverWatchPaths":null,"ignoreHidden":false,"ignoreZeroSizeFolders":false,"exclude":{"files":null,"folders":null,"fileEndsWith":null},"include":{"files":null,"folders":null,"fileEndsWith":null},"defaultUserScope":"/","defaultEnabled":true,"createUserDir":false}}],"username":"DATA_USERNAME"}}


[youtube]
enabled = false
url_get = https://proxymanager.admin.pknw1.co.uk/api/nginx/access-lists/4?expand=items
url_auth  = https://proxymanager.admin.pknw1.co.uk/api/tokens 
update_url = https://proxymanager.admin.pknw1.co.uk/api/nginx/access-lists/4
url = https://proxymanager.admin.pknw1.co.uk/api
admin_user = pkswansea@outlook.com
admin_password = !C0nduit77
api_data = { "name": "Updated YTPTube Accesss", "satisfy_any": True, "items": new_items }
title = 

[reddit]
enabled = false
client_id = 3k1mUiepgz-wP7a6d_4zZQ
client_Secret = RZzw-OIqSqCmGJWMAMOi6jM8u2xg9g
reddit_admin = OkBrilliant8092
reddit_password = !C0nduit77
subreddit = pknw1
title = Access r/pknw1 private Subreddit 
api_key = 01792421475

[ntfy]
enabled = false
api_key = tk_seujdzke7j0jwrfy97g1qydtzp1ux
url = https://ntfy.sh/

```

</details><details><summary>apps.ini</summary>

```
[DEFAULT]
api_key = 020668000
logs_folder = logs/
auto_refresh = 10
app_port = 5000
redirect_url = https://watch.notflix.pknw1.co.uk
about1 = available routes
about2 = 
about3 = /check			- periodic check for over-running services
about4 = /service/service.fqdn 	- start paused service



[apps.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["iso-user-dashboard"]
monitorLog = logs/proxymanager/proxy-host-*_access.log
monitorUrl = apps.notflix.pknw1.co.uk
idleTime = 5
countdown = 10
currentStatus = running
lastUpdate = 2025-08-21 23:14:39
lastChecked = 2025-08-20T13:00:00

[fb.notflix.pknw1.co.uk]
monitoringStatus = false
internal_proxy = false
containerNames = ["filebrowser2"]
monitorLog = logs/proxymanager/proxy-host-88_access.log
monitorUrl = fb.notflix.pknw1.co.uk
idleTime = 1
countdown = 10
currentStatus = running
lastUpdate = 2025-08-21 23:14:39
lastChecked = 2025-08-20T13:00:00


[info.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["iso-info-dashboard"]
monitorLog = logs/proxymanager/proxy-host-77_access.log
monitorUrl = info.notflix.pknw1.co.uk
idleTime = 5
countdown = 10
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[bookstack.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["bookstack","bookstack-mysql"]
monitorLog = logs/proxymanager/proxy-host-77_access.log
monitorUrl = bookstack.notflix.pknw1.co.uk
idleTime = 5
countdown = 25
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[vue.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["jellyfin_vue"]
monitorLog = logs/proxymanager/proxy-host-43_access.log
monitorUrl = vue.notflix.pknw1.co.uk
idleTime = 30
countdown = 10
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[requests.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["jellyseerr"]
monitorLog = logs/proxymanager/proxy-host-77_access.log
monitorUrl = requests.notflix.pknw1.co.uk
idleTime = 15
countdown = 25
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[metube.notflix.pknw1.co.uk]
monitoringStatus = true
internal_proxy = false
containerNames = ["metube"]
monitorLog = logs/proxymanager/proxy-host-80_access.log
monitorUrl = metube.notflix.pknw1.co.uk
idleTime = 30
countdown = 15
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[portainer.admin.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["portainer"]
monitorLog = logs/proxymanager-admin/proxy-host-3_access.log
monitorUrl = portainer.admin.pknw1.co.uk
idleTime = 20
countdown = 10
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

[glances.admin.pknw1.co.uk]
monitoringStatus = true
internal_proxy = true
containerNames = ["glances"]
monitorLog = logs/proxymanager-admin/proxy-host-3_access.log
monitorUrl = glances.admin.pknw1.co.uk
idleTime = 30
countdown = 20
currentStatus = running
lastUpdate = 2025-08-21 23:03:42
lastChecked = 2025-08-20T13:00:00

[caddyui.admin.pknw1.co.uk]
monitoringStatus = true
internal_proxy = false
containerNames = ["caddyui-mongodb","caddyui-frontend","caddyui-backend"]
monitorLog = logs/proxymanager-admin/proxy-host-3_access.log
monitorUrl = caddyui.admin.pknw1.co.uk
idleTime = 30
countdown = 20
currentStatus = running
lastUpdate = 2025-08-21 23:03:42
lastChecked = 2025-08-20T13:00:00

[vault.pknw1.co.uk]
monitoringStatus = true
internal_proxy = false
containerNames = ["aliasvault-smtp","aliasvault-reverse-proxy","aliasvault-task-runner","aliasvault-admin","aliasvault-api","aliasvault-postgres","aliasvault-client"]
monitorLog = logs/proxymanager/proxy-host-82_access.log
monitorUrl = vault.pknw1.co.uk
idleTime = 120
countdown = 45
currentStatus = stopped
lastUpdate = 2025-08-21 23:00:46
lastChecked = 2025-08-20T13:00:00

```

</details></details>

# development

<details id="bkmrk-dev-tree-%E2%94%9C%E2%94%80%E2%94%80-dockerf"><summary>dev tree</summary>

```
├── Dockerfile
├── README.md
├── REMOVE_RESULT
├── RESULT
├── assets
│   ├── animate.css
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-reboot.min.css
│   ├── bootstrap.bundle.min.js
│   ├── bootstrap.min.css
│   ├── css.css
│   ├── error-background.png
│   ├── ezgif-2cb022df995c2e.png
│   ├── google-analytics_analytics.js
│   ├── index.js
│   ├── jarallax.css
│   ├── jarallax.js
│   ├── mbr-additional.css
│   ├── mobirise2.css
│   ├── navbar-dropdown.js
│   ├── notflix-logo-telegram-128x72.png
│   ├── script.js
│   ├── smooth-scroll.js
│   ├── squid-background.png
│   ├── style.css
│   ├── style_002.css
│   ├── style_003.css
│   └── styles.css
├── build.sh
├── config
│   ├── adduser.log
│   ├── apps.ini
│   ├── config.txt
│   ├── config.txt.example
│   ├── images
│   │   ├── logo.png
│   │   ├── poster.gif
│   │   └── poster.png
│   └── signup.ini
├── create_files
│   ├── animate.css
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-reboot.min.css
│   ├── bootstrap.bundle.min.js
│   ├── bootstrap.min.css
│   ├── css.css
│   ├── error-background.png
│   ├── ezgif-2cb022df995c2e.png
│   ├── google-analytics_analytics.js
│   ├── index.js
│   ├── jarallax.css
│   ├── jarallax.js
│   ├── mbr-additional.css
│   ├── mobirise2.css
│   ├── navbar-dropdown.js
│   ├── notflix-logo-telegram-128x72.png
│   ├── script.js
│   ├── smooth-scroll.js
│   ├── squid-background.png
│   ├── style.css
│   ├── style_002.css
│   ├── style_003.css
│   └── styles.css
├── docker-compose.yml
├── lib
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-310.pyc
│   │   ├── __init__.cpython-312.pyc
│   │   ├── autoshutdown.cpython-312.pyc
│   │   ├── cookies.cpython-310.pyc
│   │   ├── cookies.cpython-312.pyc
│   │   ├── filebrowser.cpython-310.pyc
│   │   ├── filebrowser.cpython-312.pyc
│   │   ├── jfaadmin.cpython-310.pyc
│   │   ├── jfaadmin.cpython-312.pyc
│   │   ├── ldap_account.cpython-312.pyc
│   │   ├── ldap_authenticate.cpython-312.pyc
│   │   ├── ldap_register.cpython-312.pyc
│   │   ├── ntfy.cpython-310.pyc
│   │   ├── ntfy.cpython-312.pyc
│   │   ├── reddit_adduser.cpython-312.pyc
│   │   ├── reddit_api.cpython-310.pyc
│   │   ├── reddit_api.cpython-312.pyc
│   │   ├── reddit_subreddit.cpython-312.pyc
│   │   ├── register.cpython-312.pyc
│   │   ├── sonarr_schedule.cpython-312.pyc
│   │   ├── static.cpython-312.pyc
│   │   ├── subreddit.cpython-310.pyc
│   │   └── subreddit.cpython-312.pyc
│   ├── autoshutdown.py
│   ├── cookies.py
│   ├── filebrowser.py
│   ├── jellyfin.py
│   ├── jfaadmin.py
│   ├── ldap_authenticate.py
│   ├── ldap_register.py
│   ├── logout.py
│   ├── nginx_proxy_manager.py
│   ├── ntfy.py
│   ├── reddit_api.py
│   ├── reddit_subreddit.py
│   ├── sonarr_schedule.py
│   ├── static.py
│   └── subreddit.py
├── logs
│   ├── proxymanager -> /home/apps/core/proxymanager/config/data/logs
│   └── proxymanager-admin -> /home/apps/core/proxymanager-admin/config/data/logs
├── middle.py
├── notflix_adduser_service.py
├── npm.ini
├── npm.py
├── npm.sh
├── on-boarding_files
│   ├── amazon-fire-tv-stick-2044516823-1000x600.jpg
│   ├── animate.css
│   ├── bjllgl5iba8y-3307632018-400x62.png
│   ├── bjllgl5iba8y-3307632019-400x62.png
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-reboot.min.css
│   ├── bootstrap.bundle.min.js
│   ├── bootstrap.min.css
│   ├── css.css
│   ├── ezgif-2cb022df995c2e.gif
│   ├── google-analytics_analytics.js
│   ├── index.js
│   ├── jarallax.css
│   ├── jarallax.js
│   ├── mbr-additional.css
│   ├── mbr-switch-arrow.js
│   ├── menu.gif
│   ├── mobirise-icons-bold.css
│   ├── mobirise-mobiles-4-482x757.png
│   ├── mobirise2.css
│   ├── navbar-dropdown.js
│   ├── netflix-background.jpg
│   ├── notflix-jellyfin-1256x573.png
│   ├── notflix-logo-telegram-128x72.png
│   ├── script.js
│   ├── smooth-scroll.js
│   ├── style.css
│   ├── style_002.css
│   ├── style_003.css
│   └── styles.css
├── refactor1.py
├── refactor2.py
├── refactor3.py
├── requirements.txt
├── templates
│   ├── 404.html
│   ├── add_user.html
│   ├── add_user_webhook.html
│   ├── authenticate.html
│   ├── autoshutdown.html
│   ├── check.html
│   ├── coming_soon.html
│   ├── create.html
│   ├── error.html
│   ├── error2.html
│   ├── error3.html
│   ├── ldap_login.html
│   ├── ldap_logout.html
│   ├── ldap_success.html
│   ├── main_menu.html
│   ├── message.html
│   ├── redirect.html
│   ├── register.html
│   ├── squid.html
│   ├── success.html
│   ├── tvshows.html
│   └── webhook_form.html
└── test.py


```

</details><details id="bkmrk-%2Fetc%2Fpknw1%2Fdev%2Freddi"><summary>/etc/pknw1/dev/reddit-automation/notflix\_useradd\_multiapps</summary>

<details><summary>root files</summary>

</details><details><summary>lib files</summary>

</details></details>

# @app.routes

<details id="bkmrk-%40app.routes-%2F-.%2Frefa"><summary>@app.routes /</summary>

```
./refactor3.py:@app.route('/')
./refactor3.py:@app.route('/<static_path>/<path:path>')
./refactor3.py:@app.route('/cookie')
./refactor3.py:@app.route('/cookie/<action>')
./refactor3.py:@app.route('/cookie/get')
./refactor3.py:@app.route('/healthcheck')
./refactor3.py:@app.route('/ntfy/')
./refactor3.py:@app.route('/ntfy/<channel>/<message>')
./refactor3.py:@app.route('/requests', methods=['GET','POST'])
./refactor3.py:@app.route('/squid')
./refactor3.py:@app.route('/webhook/jellyfin',methods=['GET','POST'])

```

</details><details id="bkmrk-%40app.routes-%2Fstatic-"><summary>@app.routes /static</summary>

```
./lib/static.py:@static_blueprint.route('/check')
./lib/static.py:@static_blueprint.route('/comingsoon/<feature>', methods=['GET'])
./lib/static.py:@static_blueprint.route('/contact')
./lib/static.py:@static_blueprint.route('/error')
./lib/static.py:@static_blueprint.route('/healthcheck')
./lib/static.py:@static_blueprint.route('/success')


```

</details><details id="bkmrk-%40app.routes-%2Fsonarr-"><summary>@app.routes /sonarr</summary>

<details id="bkmrk-%40app.routes-%2Fsonarr%2F"><summary>@app.routes /sonarr/tvshows</summary>

```
./lib/sonarr_schedule.py:@sonarr_blueprint.route('/sonarr/tvshows', methods=['GET'])



```

</details></details><details id="bkmrk-%40app.routes-%2Freddit-"><summary>@app.routes /reddit-api</summary>

```
./lib/reddit_api.py:@app.route('/jellyfin', methods=['GET','POST'])
./lib/reddit_api.py:@app.route('/poll', methods=['GET','POST'])



```

</details><details id="bkmrk-%40app.routes-%2Fproxyma"><summary>@app.routes /proxymanager</summary>

```
./lib/nginx_proxy_manager.py:@app.route('/')
./lib/nginx_proxy_manager.py:@app.route('/adduser', methods=['GET','POST'])
./lib/nginx_proxy_manager.py:@app.route('/create_files/<path:path>')




```

</details><details id="bkmrk-%40app.routes-%2Fldap_re"><summary>@app.routes /ldap\_register</summary>

```
./lib/ldap_register.py:@register_blueprint.route('/sso/check_success')
./lib/ldap_register.py:@register_blueprint.route('/sso/register', methods=['GET', 'POST'])
./lib/ldap_register.py:@register_blueprint.route('/sso/register/', methods=['GET', 'POST'])
./lib/ldap_register.py:@register_blueprint.route('/test_ntfy')



```

</details><details id="bkmrk-%40app.routes-%2Fldap_au"><summary>@app.routes /ldap\_authenticate</summary>

```
./lib/ldap_authenticate.py:@authenticate_blueprint.route('/api/auth', methods=['POST','GET'])
./lib/ldap_authenticate.py:@authenticate_blueprint.route('/sso/auth', methods=['POST','GET'])
./lib/ldap_authenticate.py:@authenticate_blueprint.route('/sso/ldap_success')
./lib/ldap_authenticate.py:@authenticate_blueprint.route('/sso/login', methods=['POST','GET'])
./lib/ldap_authenticate.py:@authenticate_blueprint.route('/sso/logout')



```

</details><details id="bkmrk-%40app.routes-%2Fautoshu"><summary>@app.routes /containers</summary>

```
./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'])

```

<details id="bkmrk-%40app.routes-%2Fcontain"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-1"><summary>@app.routes /containers/&lt;app&gt;/logs</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-2"><summary>@app.routes /containers/about</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-3"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-4"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-5"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-6"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-7"><summary>@app.routes /containers</summary>

```
./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'])

```

</details></details>

# /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=&lt;api\_key&gt;
- opening https://containers.notflix.pknw1.co.uk/containers/suspend?api=&lt;api\_key&gt;

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`

<table id="bkmrk-%C2%A0default-section-api" style="border-collapse:collapse;width:100%;height:178.8px;"><colgroup><col style="width:50%;"></col><col style="width:50%;"></col></colgroup><tbody><tr style="height:29.8px;"><td style="height:29.8px;"> **Default Section**</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`api_key`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`logs_folder`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`auto_refresh`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`redirect_url`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`about fields`</td><td style="height:29.8px;">  
</td></tr></tbody></table>

<table id="bkmrk-per-application-sect" style="border-collapse:collapse;width:100%;height:542.4px;"><colgroup><col style="width:50%;"></col><col style="width:50%;"></col></colgroup><tbody><tr style="height:29.8px;"><td style="height:29.8px;">**Per Application Section**</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`[apps.notflix.pknw1.co.uk]`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`monitoringStatus`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`internal_proxy`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`status_source`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`containerNames`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`monitorLog`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`monitorUrl`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`idleTime`</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`countdown`</td><td style="height:29.8px;">  
</td></tr><tr><td>`currentStatus`</td><td>  
</td></tr><tr><td>`lastUpdate`</td><td>  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">`lastChecked`</td><td style="height:29.8px;">  
</td></tr></tbody></table>

<details id="bkmrk-%40app.routes-%2Fautoshu"><summary>@app.routes /containers</summary>

```
./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'])

```

<details id="bkmrk-%40app.routes-%2Fcontain"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-1"><summary>@app.routes /containers/&lt;app&gt;/logs</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-2"><summary>@app.routes /containers/about</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-3"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-4"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-5"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-6"><summary>@app.routes /containers</summary>

```
./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'])

```

</details><details id="bkmrk-%40app.routes-%2Fcontain-7"><summary>@app.routes /containers</summary>

```
./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'])

```

</details></details>#### Sub-Application Routes

<table id="bkmrk-unprotected-routes-d" style="border-collapse:collapse;width:100%;"><colgroup><col style="width:50%;"></col><col style="width:50%;"></col></colgroup><tbody><tr><td class="align-center">**Unprotected Routes**</td><td class="align-center">**Description**</td></tr><tr><td>/containers</td><td>  
</td></tr><tr><td>/containers/about</td><td>  
</td></tr><tr><td>/containers/&lt;app&gt;/logs</td><td>  
</td></tr><tr><td>/containers/&lt;status</td><td>  
</td></tr><tr><td>/containers/service/&lt;app&gt;</td><td>  
</td></tr></tbody></table>

<table id="bkmrk-protected-routes-des" style="border-collapse:collapse;width:100%;"><colgroup><col style="width:50%;"></col><col style="width:50%;"></col></colgroup><tbody><tr><td class="align-center">Protected Routes</td><td class="align-center">**Description**</td></tr><tr><td>/containers/check?api=&lt;api\_key&gt;</td><td>  
</td></tr><tr><td>/containers/suspend?api=&lt;api\_key&gt;</td><td>  
</td></tr><tr><td>/containers/cservice/stop/&lt;app&gt;?api=&lt;api\_key&gt;</td><td>  
</td></tr></tbody></table>