b545d83f64
- modal.js: add onClose callback to openModal(), fix _initialFormTimeout cleanup, deduplicate escape/overlay-click handlers in confirmModal, promptModal, selectModal using the new callback - calendar.js: replace popup.innerHTML with insertAdjacentHTML (constraint), add truncateDescription() to cap long event descriptions at 500 chars - validate.js: extend DATETIME_RE to cover ISO 8601 with ms/timezone, normalise datetime values to YYYY-MM-DDTHH:MM on input - index.js: include app version in startup log message - docker-compose.yml / .env.example: switch from named volume to host-mounted DATA_DIR/BACKUP_DIR with sane defaults - docs/installation.md: document host-mount data paths Co-Authored-By: Rafael Foster <rafaelfoster@users.noreply.github.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
29 lines
980 B
YAML
29 lines
980 B
YAML
services:
|
|
oikos:
|
|
image: ghcr.io/ulsklyc/oikos:latest
|
|
build: . # optional: use --build to build locally instead
|
|
container_name: oikos
|
|
restart: unless-stopped
|
|
ports:
|
|
- "0.0.0.0:3000:3000"
|
|
volumes:
|
|
- ${DATA_DIR:-./data}:/data
|
|
- ${BACKUP_DIR:-./backups}:/backups
|
|
env_file:
|
|
- .env
|
|
environment:
|
|
- NODE_ENV=production
|
|
- DB_PATH=${DB_PATH:-/data/oikos.db}
|
|
- BACKUP_DIR=${BACKUP_DIR:-/backups}
|
|
# Reverse proxy setup (Caddy, nginx, Traefik):
|
|
# - Remove SESSION_SECURE=false (default is true)
|
|
# - TRUST_PROXY is automatically set to 1 (trust one proxy hop)
|
|
# Direct HTTP access (no reverse proxy):
|
|
- SESSION_SECURE=false
|
|
healthcheck:
|
|
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health', r => process.exit(r.statusCode === 200 ? 0 : 1))"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 10s
|