Sign inSign up

nullata/webui-manager

By nullata

Updated 25 days ago

Self-hosted dashboard for organizing and launching your internal web services

Image
Integration & delivery
Developer tools
Content management system
0

2.2K

nullata/webui-manager repository overview

logo

Logo WebUI Manager

Self-hosted dashboard for organizing and launching your internal web services.

Stores service URLs grouped by host with optional credentials, category tags, and auto-discovered favicons.

For full documentation and source code visit github.com/nullata/webui-manager.

Features

  • Session-based login with first-run admin bootstrap and in-app password change
  • Login rate limiting (5 failed attempts triggers a 5-minute IP lockout)
  • Dashboard grouped by host with favicon auto-discovery
  • Custom background image support
  • Full-text search across name, URL, description, host, and category, with optional live (as-you-type) filtering
  • Ctrl+K / Cmd+K to jump to the search box
  • Filter by host or category
  • Optional stored credentials (AES-encrypted at rest), copyable without revealing them
  • Export and import the whole catalog as JSON, for backup or bulk-adding services
  • CSRF protection on all forms and AJAX requests
  • MySQL/MariaDB, PostgreSQL, or self-contained SQLite backend, with automatic schema creation and migration on startup

Quick Start

Create a docker-compose.yml:

services:
  webui-manager:
    image: nullata/webui-manager
    restart: unless-stopped
    ports:
      - "5000:5000"
    environment:
      SECRET_KEY: your-secret-key
      DB_HOST: 192.168.1.100
      DB_PORT: 3306
      DB_USER: webui
      DB_PASSWORD: your-db-password
      DB_NAME: webui_manager

Or against PostgreSQL - a postgres:16 service with a persistent volume, same variables as MySQL, only the port and backend switch:

services:
  webui-manager:
    image: nullata/webui-manager
    restart: unless-stopped
    ports:
      - "5000:5000"
    environment:
      SECRET_KEY: your-secret-key
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: webui
      DB_PASSWORD: your-db-password
      DB_NAME: webui_manager
      # DB_SSLMODE: require   # uncomment for an SSL-enabled server
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: webui_manager
      POSTGRES_USER: webui
      POSTGRES_PASSWORD: your-db-password
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U webui -d webui_manager"]
      interval: 5s
      timeout: 3s
      retries: 10

volumes:
  pg_data:

Case sensitivity: PostgreSQL compares strings case-sensitively where MySQL's default collation does not. Usernames are matched case-insensitively on all backends, so admin, Admin and ADMIN all refer to the same account.

Or fully self-contained with SQLite - no external database, just a volume for the data file:

services:
  webui-manager:
    image: nullata/webui-manager
    restart: unless-stopped
    ports:
      - "5000:5000"
    environment:
      SECRET_KEY: your-secret-key
      DB_TYPE: sqlite
      DB_PATH: /data/webui_manager.sqlite
    volumes:
      - db_data:/data

volumes:
  db_data:

Then run:

docker compose up -d

Navigate to http://localhost:5000 and follow the admin setup prompt.

Environment Variables

VariableRequiredDescription
SECRET_KEYYesFlask session signing key
DB_TYPENoDatabase backend: mysql (default), sqlite, or postgres
DB_USERConditionalDatabase username (required when DB_TYPE=mysql or postgres)
DB_PASSWORDConditionalDatabase password (required when DB_TYPE=mysql or postgres)
DB_HOSTNoDatabase host (default: 127.0.0.1)
DB_PORTNoDatabase port (default: 3306 for MySQL, 5432 for PostgreSQL)
DB_NAMENoDatabase name (default: webui_manager)
DB_SSLMODENoPostgreSQL SSL mode (e.g. require; ignored by MySQL/SQLite)
DB_PATHNoSQLite file path (default: data/webui_manager.sqlite)
DATABASE_URLNoFull SQLAlchemy URL, overrides DB_TYPE and all DB_* fields (e.g. postgresql+psycopg://webui:[email protected]:5432/webui_manager)
APP_CREDENTIALS_KEYNoSeparate key for credential encryption (falls back to SECRET_KEY)
AUTO_MIGRATENoSync existing tables to the current schema on startup (default: true). Missing tables are always created regardless

Upgrading

Schema migrations run automatically on startup (AUTO_MIGRATE, on by default): missing tables and columns are created, nullable and column-type changes are applied, and missing indexes, unique constraints, and MyISAM→InnoDB conversions are handled. Upgrading from any earlier version - including v0.6.4 and older - is just a matter of pulling the new image and restarting. Backing up your database before upgrading is still recommended.

Migrating to PostgreSQL (or any other backend)

Moving between MySQL, PostgreSQL and SQLite is a data export/import, not a schema migration: use Settings → Backup & Restore → Export on the old install (tick "include passwords" - the export writes them as plaintext so they can be re-encrypted for the target install), point the new install at the other backend (DB_TYPE=postgres with the compose file above), and Import the JSON. Accounts and app settings are not in the export - create the admin via the first-run setup screen and re-enter settings on the new install. Full steps are in the GitHub README.

License

Licensed under the Apache License 2.0.

Tag summary

Content type

Image

Digest

sha256:54e193dc6

Size

71.5 MB

Last updated

25 days ago

docker pull nullata/webui-manager