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/<app>/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/<app>
- containers.notflix.pknw1.co.uk/containers/service/stop/<app>
- 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
config/
signup.ini
; 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/
apps.ini
[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
development
dev tree
├── 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
/etc/pknw1/dev/reddit-automation/notflix_useradd_multiapps
root files
lib files
@app.routes
@app.routes /
./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'])
@app.routes /static
./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')
@app.routes /sonarr
@app.routes /sonarr/tvshows
./lib/sonarr_schedule.py:@sonarr_blueprint.route('/sonarr/tvshows', methods=['GET'])
@app.routes /reddit-api
./lib/reddit_api.py:@app.route('/jellyfin', methods=['GET','POST'])
./lib/reddit_api.py:@app.route('/poll', methods=['GET','POST'])
@app.routes /proxymanager
./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>')
@app.routes /ldap_register
./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')
@app.routes /ldap_authenticate
./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')
@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'])
/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_HOSTwith 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> |