Files
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

133 lines
5.0 KiB
Bash

# =============================================================================
# ADconsole - example environment file
#
# Copy to .env and fill in the values for your environment:
# cp .env.example .env && php artisan key:generate
#
# .env is git-ignored - never commit real hosts, service-account DNs or
# passwords. Every value below is a placeholder.
# =============================================================================
# --- Application -------------------------------------------------------------
APP_NAME="ADconsole"
# Use "local" only on a developer machine (enables verbose errors / debugbar).
APP_ENV=production
APP_KEY=
APP_DEBUG=false
# Public URL the panel is served from (used for absolute links and cookies).
APP_URL=https://adconsole.example.com
# Hostname Traefik routes to the container (docker/compose.yaml). Ignored on a
# bare-metal install.
APP_DOMAIN=adconsole.example.com
# Docker image for docker/compose.yaml. By default it pulls the release the
# Gitea workflow published; ADCONSOLE_VERSION pins a tag, ADCONSOLE_IMAGE
# replaces the whole reference (e.g. a private mirror). Ignored on bare metal
# and by `docker compose ... up --build` (which rebuilds locally).
# ADCONSOLE_VERSION=1.1.0
# ADCONSOLE_IMAGE=gitea.kzbikowski.pl/kzbkowski/adconsole:1.1.0
# Interface language: pl | en. FALLBACK is used for missing translation keys.
APP_LOCALE=pl
APP_FALLBACK_LOCALE=en
PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
# --- Logging ---------------------------------------------------------------
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
# debug | info | notice | warning | error ...
LOG_LEVEL=warning
# --- Database -------------------------------------------------------------
# ADconsole keeps NO Active Directory data in SQL. The database only backs the
# application layer: sessions, cache, queue and the panel configuration
# (table `panel_settings`). Any Laravel-supported driver works; MariaDB/MySQL
# is the default and what docker/compose.yaml provisions.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=adconsole
DB_USERNAME=adconsole
DB_PASSWORD=
# Only read by docker/compose.yaml when it first initialises the MariaDB
# data dir (docker/data/db). Changing them later does NOT change an existing
# database.
DB_ROOT_PASSWORD=
# --- Session / cache / queue --------------------------------------------
# "file" keeps sessions on local disk (fine for a single node). Use "database"
# or "redis" when running more than one app container behind a load balancer.
SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
CACHE_STORE=database
QUEUE_CONNECTION=database
# --- Active Directory: connection -------------------------------------------
# Service account used ONLY to read/modify directory objects. Panel admins log
# in with their own domain account (see AD_LOGIN_GROUP); this account is never
# used for interactive login.
LDAP_CONNECTION=default
LDAP_LOGGING=true
# One or more domain controllers (comma-separated, tried in order).
LDAP_HOSTS=dc01.corp.example.com,dc02.corp.example.com
LDAP_USERNAME="CN=svc-adconsole,OU=Service Accounts,DC=corp,DC=example,DC=com"
LDAP_PASSWORD=
# 636 = LDAPS, 389 = plain / STARTTLS.
LDAP_PORT=636
LDAP_TIMEOUT=5
# Transport security. Password reset and every other WRITE to AD REQUIRE an
# encrypted channel - AD rejects unicodePwd over a clear connection.
# LDAP_SSL=true -> LDAPS (port 636) [recommended]
# LDAP_TLS=true -> STARTTLS (port 389)
LDAP_SSL=true
LDAP_TLS=false
# Verify the DC certificate. Set false for a self-signed / internal-CA cert
# that the app server does not trust.
LDAP_TLS_VERIFY=false
# Base DN for ALL modules. It MUST contain the users, computers AND groups
# branches - if those OUs are siblings, point this at the domain root, or the
# computer/group lists and their OU trees come back empty.
LDAP_BASE_DN="DC=corp,DC=example,DC=com"
# --- Active Directory: defaults ------------------------------------------
# OU new objects are created in when no branch is picked in the UI; also caps
# the OU tree shown in each module.
LDAP_DEFAULT_USER_OU="OU=Users,DC=corp,DC=example,DC=com"
LDAP_DEFAULT_COMPUTER_OU="OU=Computers,DC=corp,DC=example,DC=com"
LDAP_DEFAULT_GROUPS_OU="OU=Groups,DC=corp,DC=example,DC=com"
# Domain name shown in the panel header.
AD_DOMAIN_LABEL=corp.example.com
# --- Active Directory: who may sign in ---------------------------------------
# Members of this group may log into the panel. Full group DN (recommended) or
# a bare CN. Nested membership and the primary group are honoured. Empty = no
# one can log in.
AD_LOGIN_GROUP="CN=ADconsole Admins,OU=Groups,DC=corp,DC=example,DC=com"
# --- Mail (optional) -----------------------------------------------------
# ADconsole does not send mail out of the box; configure only if you add it.
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="adconsole@example.com"
MAIL_FROM_NAME="${APP_NAME}"
# --- Front-end build ---------------------------------------------------------
VITE_APP_NAME="${APP_NAME}"