Small, simple Wordpress manager
258
A self-hosted dashboard for managing multiple WordPress sites from a single interface. Tracks WordPress core, plugin, and theme versions across all your sites, detects available updates, and records full version history over time.
Dashboard · Sites · Plugin Overview · Theme Overview · Version History
1. Clone and configure
git clone https://github.com/arogarth/wp-manager.git
cd wp-manager
cp .env.example .env
Edit .env and set at minimum:
ENCRYPTION_KEY= # 64 hex characters (openssl rand -hex 32)
APP_URL=http://localhost:8080
2. Start the stack
docker compose up -d
3. Open the app
Navigate to http://localhost:8080. On first visit you will be prompted to create an admin account.
4. Add a WordPress site
Go to Sites → Add Site and provide:
https://example.com)Hit Sync to pull the first snapshot.
All configuration is done via environment variables (.env file or Docker environment).
| Variable | Default | Description |
|---|---|---|
APP_URL | http://localhost:8080 | Public base URL of this app |
APP_ENV | development | development or production |
HTTP_PORT | 8080 | Host port mapped to nginx |
ENCRYPTION_KEY | — | Required. 64-char hex key for credential encryption |
DB_NAME | wp_manager | MariaDB database name |
DB_USER | wp_manager | MariaDB user |
DB_PASS | secret | MariaDB password |
DB_ROOT_PASS | rootsecret | MariaDB root password |
OIDC_ISSUER_URL | — | OIDC provider base URL (e.g. https://auth.example.com/realms/myrealm) |
OIDC_CLIENT_ID | — | OIDC client ID |
OIDC_CLIENT_SECRET | — | OIDC client secret |
OAUTH_REDIRECT_URI | http://localhost:8080/auth/callback | Must match your OIDC client config |
OIDC is optional. If OIDC_CLIENT_ID is not set, the "Sign in with OpenID Connect" button is hidden and only local login is available.
Configure your OIDC provider with:
https://your-domain/auth/callbackopenid profile emailThe app merges claims from both the ID token and the userinfo endpoint, so email, preferred_username, name, and picture are picked up regardless of which source your provider uses.
nginx (port 8080)
└── PHP-FPM (app container)
├── public/index.php front controller & router
├── src/Controller/ request handlers
├── src/Service/ database, encryption, WordPress API, sync logic
├── src/Auth/ session management, OIDC handler
└── src/View/ PHP templates (Bootstrap 5)
MariaDB 11 (db container)
└── migrations/001_initial_schema.sql full schema
cron container
└── bin/sync-all.php runs every 6 hours via crond
config/routes.php)SyncService::hasChanges() compares full plugin/theme state before inserting a snapshot| Table | Purpose |
|---|---|
users | Local and OIDC accounts, admin flag |
sites | Managed WordPress sites (credentials encrypted) |
site_snapshots | WP/PHP version per sync, with error log |
plugins | Plugin registry per site |
plugin_snapshots | Plugin version state per snapshot |
themes | Theme registry per site |
theme_snapshots | Theme version state per snapshot |
schema_migrations | Tracks applied DB migration files |
To trigger a sync from the command line (e.g. for testing):
docker compose exec app php bin/sync-all.php
docker compose down -v # removes the db_data volume
docker compose up -d
docker compose up -d
# Source is bind-mounted; PHP changes are reflected immediately.
# Composer dependencies live in the named 'vendor' volume built into the image.
To add a Composer dependency:
docker compose exec app composer require vendor/package
HttpOnly and SameSite=Lax; Secure flag is set automatically when the request arrives over HTTPSMIT
Content type
Image
Digest
sha256:85e2f08fd…
Size
43.9 MB
Last updated
5 months ago
docker pull arogarth/wp-manager