Files
ADconsle/docs/publishing.md
T
kzbkowskiandClaude Sonnet 5 b313c126ce
CI / PHP 8.2 (push) Failing after 1m40s
CI / PHP 8.3 (push) Failing after 55s
CI / PHP 8.4 (push) Failing after 1m11s
Release image / image (push) Successful in 2m33s
ADconsole v1.1.0
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
2026-09-10 09:13:04 +02:00

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.*.local
  • storage/app/panel_settings.json and *.migrated
  • vendor/, node_modules/, public/build/, public/hot/
  • storage/ runtime (logs, sessions, framework cache) — only the .gitignore keep-files should be tracked
  • docker/compose.override.yaml, docker/compose.dev.override.yaml
  • docker/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 a vX.Y.Z tag, builds docker/php/Dockerfile target prod and pushes …/adconsole:{X.Y.Z, X.Y, latest} to the instance's container registry. Needs packages: write; if the built-in token can't push, add a REGISTRY_TOKEN repo secret. Adjust REGISTRY / IMAGE_NAME in the workflow (and the default in docker/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 fires release.yml), then cut a release from the tag on the Git host and paste the matching docs/CHANGELOG.md section 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.