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
72 lines
2.2 KiB
YAML
72 lines
2.2 KiB
YAML
name: adconsole
|
|
|
|
# =============================================================================
|
|
# Production-ish Compose stack: PHP/Apache app + MariaDB.
|
|
#
|
|
# Reverse proxy: this file assumes an external Traefik instance on the
|
|
# `traefik_public` network. If you don't use Traefik, drop in a local override
|
|
# that publishes a port instead - see docker/compose.override.yaml.template
|
|
# and docs/deployment.md.
|
|
#
|
|
# Run from the repo root:
|
|
# docker compose -f docker/compose.yaml up -d --build
|
|
# =============================================================================
|
|
|
|
services:
|
|
app:
|
|
build:
|
|
context: ..
|
|
dockerfile: docker/php/Dockerfile
|
|
container_name: adconsole_app
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ..:/var/www/html
|
|
- app_storage:/var/www/html/storage
|
|
depends_on:
|
|
mariadb:
|
|
condition: service_healthy
|
|
networks:
|
|
- internal
|
|
- traefik_public
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.docker.network=traefik_public
|
|
- traefik.http.routers.adconsole.rule=Host(`${APP_DOMAIN:-adconsole.localhost}`)
|
|
- traefik.http.routers.adconsole.entrypoints=websecure
|
|
- traefik.http.routers.adconsole.tls=true
|
|
# Uncomment and set your resolver to let Traefik obtain a certificate:
|
|
# - traefik.http.routers.adconsole.tls.certresolver=letsencrypt
|
|
- traefik.http.services.adconsole.loadbalancer.server.port=80
|
|
|
|
mariadb:
|
|
image: mariadb:11
|
|
container_name: adconsole_db
|
|
restart: unless-stopped
|
|
environment:
|
|
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-change-me-root}
|
|
MARIADB_DATABASE: ${DB_DATABASE:-adconsole}
|
|
MARIADB_USER: ${DB_USERNAME:-adconsole}
|
|
MARIADB_PASSWORD: ${DB_PASSWORD:-change-me}
|
|
MARIADB_AUTO_UPGRADE: "1"
|
|
volumes:
|
|
- db_data:/var/lib/mysql
|
|
healthcheck:
|
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
start_period: 30s
|
|
networks:
|
|
- internal
|
|
|
|
volumes:
|
|
db_data:
|
|
app_storage:
|
|
|
|
networks:
|
|
internal:
|
|
# Provided by your Traefik deployment. Remove this (and the `traefik_public`
|
|
# entry + labels under `app`) if you use the local port-publishing override.
|
|
traefik_public:
|
|
external: true
|