# Startklar config — docs: https://startklar.cyber.house/v1/ # $schema: https://startklar.cyber.house/v1/schema.json # # Example with every feature: TYPO3 backend plus two # Node frontends, deployed via Magallanes. # Everything except "version" is optional, missing # sections are not touched. Paths are relative to # the real location of this file (releases/). version: 1 # Optional: environments and their deploy directories. # Without it, "target: prod" means ~/html/prod. targets: prod: ~/html/prod stage: ~/html/acme/staging apps: backend: type: php version: "8.3" documentRoot: public # Startklar only writes its own block in this file envFile: ../../shared/.env.local # Own values for this envFile, in addition to the credentials envValues: TYPO3_CONTEXT: prod: Production stage: Production/Staging LOG_LEVEL: info software: composer: "2" imagemagick: latest phpExtensions: - excimer - apcu # Global for the project; ${NAME} from the envValues of a resource phpIni: memory_limit: 512M max_execution_time: 120 upload_max_filesize: 64M post_max_size: 64M session.save_handler: redis session.save_path: "tcp://${REDIS_HOST}:${REDIS_PORT}" shop: type: node version: "22" path: frontend/shop command: node server.js envFile: ../../shared/frontend/shop/.env.local landing: type: node version: "22" path: frontend/landing command: node server.js target: prod # only on prod databases: db: type: mysql version: "8.4" charset: utf8mb4 collation: utf8mb4_unicode_ci envValues: DB_HOST: ${host} DB_PORT: ${port} DB_NAME: ${name} DB_USER: ${user} DB_PASSWORD: ${password} cache: type: redis version: "7.2" shared: true # one Redis for prod and stage maxMemory: 512mb maxMemoryPolicy: allkeys-lru persistent: false envValues: REDIS_HOST: ${host} REDIS_PORT: ${port} # Credentials go into the Startklar UI, not here registries: - ghcr.io containers: solr: image: ghcr.io/acme/solr:9.6 port: 8983 shared: true # one instance for prod and stage volumes: - solr-data:/var/solr limits: cpus: "1" memory: 2g secrets: - SOLR_PASSWORD # generated once, 32 chars envValues: SOLR_HOST: ${host} SOLR_PORT: ${port} SOLR_PASSWORD: ${SOLR_PASSWORD} worker: image: ghcr.io/acme/worker:1.4 target: prod command: ["php", "bin/worker", "--queue=default"] environment: DATABASE_URL: "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}" REDIS_URL: "redis://${REDIS_HOST}:${REDIS_PORT}" LOG_LEVEL: info legacy-api: image: ghcr.io/acme/legacy-api:2.1 port: 8080 target: prod secrets: - name: LEGACY_API_PASSWORD length: 12 chars: "A-Za-z0-9!#%" pattern: "^[A-Za-z].*[0-9]" envValues: LEGACY_API_HOST: ${host} LEGACY_API_PORT: ${port} LEGACY_API_PASSWORD: ${LEGACY_API_PASSWORD} mailpit: image: axllent/mailpit:v1.21 port: 8025 target: stage smtp: target: prod envValues: SMTP_HOST: ${host} SMTP_PORT: ${port} SMTP_USER: ${user} SMTP_PASSWORD: ${password} cronjobs: scheduler: schedule: "*/5 * * * *" command: vendor/bin/typo3 scheduler:run app: backend target: prod timeout: 600 timezone: Europe/Vienna email: ops@acme.at cache-warmup: schedule: "0 6 * * *" command: vendor/bin/typo3 cache:warmup app: backend target: [prod, stage] # Project-wide: all files must agree backups: - schedule: "0 3 * * *" keep: 14d - schedule: "0 4 * * 0" keep: 90d routing: - domains: - www.acme.at - www.acme.de app: backend target: prod - domains: - stage.acme.at app: backend target: stage - domains: - shop.acme.at app: shop target: prod - domains: - shop.stage.acme.at app: shop target: stage - domains: - start.acme.at app: landing target: prod - domains: - www.acme.at/search container: solr - domains: - api.acme.at container: legacy-api target: prod port: 8080 - domains: - mail.stage.acme.at container: mailpit target: stage - domains: - acme.at - acme.de redirect: https://www.{domain} - domains: - www.acme-online.at redirect: https://{domain-without-www}