Config backup, a Docker dev/prod split, and a Gitea-built release image.
Added
- /settings -> General -> "Configuration backup": JSON export/import of the
panel's general settings + attribute definitions
(App\Services\ConfigBackupService); audited as config.export / config.import.
Export can leave out the attribute-encryption key. No AD data included.
- docker/compose.dev.yaml: live-reload dev stack that bind-mounts the working
tree. docker/php/Dockerfile is now multi-stage (base -> dev / prod).
- .github/workflows/release.yml: on every vX.Y.Z tag, builds the prod image and
pushes gitea.kzbikowski.pl/kzbkowski/adconsole:{X.Y.Z,X.Y,latest}.
Changed
- docker/compose.yaml: self-contained prod image (app code + composer install
--no-dev baked in via COPY); persistent state in docker/data/{app_storage,db};
defaults to the released image (ADCONSOLE_VERSION pins a tag, ADCONSOLE_IMAGE
replaces the ref). Apache now honours public/.htaccess (AllowOverride All).
Run from the repo root with --env-file .env.
- Repo root now holds only README.md; CHANGELOG / CONTRIBUTING / SECURITY /
CODE_OF_CONDUCT moved under docs/.
Upgrade notes: docs/upgrading.md#v110--docker-layout. Full log: docs/CHANGELOG.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JKT9p3bfP8RZesExdYCS52
4.4 KiB
Publishing ADconsole to a Git host
How this working tree was turned into the public repository, and the checklist to follow if you re-publish it somewhere else (a fork, a mirror, a different host).
Canonical repository: https://gitea.kzbikowski.pl/kzbkowski/ADconsle
(self-hosted Gitea). The first public tag is v1.0.0.
1. Placeholders — all filled for the canonical repo
If you re-publish under a different owner/host, revisit these:
| File | Was | Now / put |
|---|---|---|
README.md, docs/installation.md, docs/development.md |
<your-fork-url> in the git clone lines |
https://gitea.kzbikowski.pl/kzbkowski/ADconsle.git |
docs/SECURITY.md |
<SET A SECURITY CONTACT HERE> |
mail@kzbikowski.pl |
.github/ISSUE_TEMPLATE/config.yml |
https://github.com/OWNER/REPO/... |
The repo's Gitea issue/wiki URLs |
LICENSE |
2026 Kacper Żbikowski |
Copyright year + holder, if different |
lang/{pl,en}/pages.php → author.* |
Kacper Żbikowski |
Author/maintainer shown on the in-app About page |
composer.json |
adconsole/adconsole |
Your package name (optional; nothing depends on it) |
tests/Feature/Pages/AboutPageTest.php asserts the author name and
Copyright (c) <year> <name> — if you change pages.php author, update that
test too.
2. Confirm nothing sensitive is tracked
Everything below is already covered by .gitignore / .dockerignore — verify
none of it slipped in:
.env,.env.backup,.env.production,.env.*.localstorage/app/panel_settings.jsonand*.migratedvendor/,node_modules/,public/build/,public/hot/storage/runtime (logs, sessions, framework cache) — only the.gitignorekeep-files should be trackeddocker/compose.override.yaml,docker/compose.dev.override.yamldocker/data/(production DB + storage state)- IDE / agent dirs (
.idea/,.vscode/,.claude/, …)
# Dry-run: what would a fresh repo add?
git init -q _probe && git --git-dir=_probe/.git --work-tree=. add -An | grep -Ei '(^add ...env$|vendor/|node_modules/|storage/(logs|framework)/.+/|panel_settings\.json)'
rm -rf _probe
# No output = clean.
Also grep for lab-specific values before the first push:
grep -rniE 'YOUR-DOMAIN|internal-hostname|real-ip' --exclude-dir=vendor --exclude-dir=node_modules .
3. Green build
composer install
cp .env.example .env && php artisan key:generate
php artisan migrate # against a throwaway SQLite/MySQL
php artisan test # 40+ pass (the DEPR tag is noise)
vendor/bin/pint --test # style clean
4. Create the repository
This tree started life inside an unrelated parent checkout, so it is published as a fresh repo scoped to just this folder:
cd /path/to/adconsole
git init -b main
git add .
git status # sanity-check the file list
git commit -m "ADconsole v1.0.0"
git remote add origin https://gitea.kzbikowski.pl/kzbkowski/ADconsle.git
git push -u origin main
git tag -a v1.0.0 -m "ADconsole v1.0.0"
git push origin v1.0.0
5. On the Git host
- Set the repository description and topics:
active-directory,ldap,laravel,ldaprecord,admin-panel,self-hosted. - Enable Issues. Point the "Question / help" contact link at the repo's issues (Gitea has no Discussions).
- The workflows in
.github/workflows/are read by Gitea Actions if Actions is enabled on the instance (otherwise harmless):ci.yml— Pint + PHPUnit on PHP 8.2/8.3/8.4, on every push / PR.release.yml— on avX.Y.Ztag, buildsdocker/php/Dockerfiletargetprodand pushes…/adconsole:{X.Y.Z, X.Y, latest}to the instance's container registry. Needspackages: write; if the built-in token can't push, add aREGISTRY_TOKENrepo secret. AdjustREGISTRY/IMAGE_NAMEin the workflow (and the default indocker/compose.yaml) for a different host or owner.
- Release:
git tag -a vX.Y.Z -m "ADconsole vX.Y.Z" && git push origin vX.Y.Z(that firesrelease.yml), then cut a release from the tag on the Git host and paste the matchingdocs/CHANGELOG.mdsection as the notes.
6. First-deploy sanity (for whoever installs it)
Point them at installation.md (bare metal) or
deployment.md (Docker), and
active-directory.md for the service account and
delegation. troubleshooting.md covers the usual
first-run stumbles.