First public release. - docs: document the audit log, user offboarding, CSV export and the "require a reason for destructive actions" setting across README, docs/ and CLAUDE/AGENTS.md; note retention for panel_audit - docs: fill the publishing placeholders (repo URL, security contact, issue-template links) and add a semantic-versioning policy - move agent/contributor context into CLAUDE/ (AGENTS.md + a README); root CLAUDE.md is now a thin @-import pointer - add a favicon (shield-lock, matching the login screen) to the login page and the app layout - CHANGELOG: promote [Unreleased] to [1.0.0]; keep the earlier internal build as [0.1.0] Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UfuvfwexztdS7LDpGuKsuK
3.5 KiB
Installation (bare metal / VM)
For the containerised path see deployment.md; this page covers a classic PHP host.
1. Prerequisites
- PHP 8.2+ with extensions:
ldap,pdo_mysql(orpdo_pgsql/pdo_sqlite),mbstring,curl,zip,openssl,fileinfo,ctype,json - Composer 2
- A web server (Apache with
mod_rewrite, or nginx + PHP-FPM) - A database server — MariaDB 10.6+ / MySQL 8 recommended
- Outbound access to a domain controller on 636/tcp (LDAPS) or 389/tcp (STARTTLS)
Check the LDAP extension:
php -m | grep -i ldap
2. Get the code
git clone https://gitea.kzbikowski.pl/kzbkowski/ADconsle.git /var/www/adconsole
cd /var/www/adconsole
composer install --no-dev --optimize-autoloader
3. Environment
cp .env.example .env
php artisan key:generate
Edit .env — at minimum:
APP_URL— the exact public URL (scheme + host, no trailing slash)APP_ENV=production,APP_DEBUG=falseDB_*— database connectionLDAP_HOSTS,LDAP_USERNAME,LDAP_PASSWORD,LDAP_BASE_DNLDAP_SSL=true(orLDAP_TLS=true),LDAP_TLS_VERIFYLDAP_DEFAULT_USER_OU/_COMPUTER_OU/_GROUPS_OU,AD_DOMAIN_LABELAD_LOGIN_GROUP— the AD group whose members may sign in
Every key is explained in configuration.md.
4. Database
Create the schema (sessions, cache, queue, panel_settings, panel_attributes,
panel_audit):
php artisan migrate --force
5. Caches & storage
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
Make storage/ and bootstrap/cache/ writable by the web-server user:
chown -R www-data:www-data storage bootstrap/cache
find storage bootstrap/cache -type d -exec chmod 775 {} \;
Re-run the three *:cache commands (or php artisan optimize) after any
.env change.
6. Web server
Document root must be public/. Never expose the project root.
Apache
<VirtualHost *:443>
ServerName adconsole.example.com
DocumentRoot /var/www/adconsole/public
<Directory /var/www/adconsole/public>
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/adconsole.pem
SSLCertificateKeyFile /etc/ssl/private/adconsole.key
ErrorLog ${APACHE_LOG_DIR}/adconsole-error.log
CustomLog ${APACHE_LOG_DIR}/adconsole-access.log combined
</VirtualHost>
a2enmod rewrite ssl && systemctl reload apache2. Laravel ships the matching
public/.htaccess.
nginx + PHP-FPM
server {
listen 443 ssl;
server_name adconsole.example.com;
root /var/www/adconsole/public;
index index.php;
ssl_certificate /etc/ssl/certs/adconsole.pem;
ssl_certificate_key /etc/ssl/private/adconsole.key;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* { deny all; }
}
7. First login
Open APP_URL, pick a language, sign in with an AD account that belongs to
AD_LOGIN_GROUP. If it rejects you, see
troubleshooting.md.
8. Scheduler / queue (optional)
ADconsole has no cron jobs or queued work today, so no schedule:run or
queue:work is required. QUEUE_CONNECTION=database is a safe default if you
add async work later.