Ready-to-go Roadiz headless edition
762
This is the API-ready edition for Roadiz. It is meant to set up your Apache/Nginx server root
to the web/ folder, keeping your app sources secure, and all your business logic into src/ folder
AKA \App PHP namespace.
Headless edition does not need any themes, so you can build your API schema right into the backoffice and use REST API entry points without any code. A built-in tree-walker is configured automatically to walk your node-types children fields to create a JSON graph when requesting a single node (by id or by slug).
Headless edition is heavily based on roadiz/abstract-api-theme features, you will find additional information about registered routes and API entry points on its readme.
AbstractApiTheme is already registered for you so you can begin creating your data structure right away. Any additional configuration is available in your src/AppServiceProvider.php container service-provider.
Automatic node-source controller resolution is disabled and any request on a node-source path will end up in src/Controller/NullController.php, so your application clients have to use your secure API end-points.
This docker image is perfect if you do not need any custom code or to version your content schema. You can launch a Roadiz headless with our docker-compose.standalone.yml example stack.
Override ./app/conf/config.yaml file if necessary (for Solr configuration or custom monolog handler)
docker-compose up -d --force-recreate
docker-compose exec -u www-data app bin/roadiz migration:migrate --allow-no-migration -n
docker-compose exec -u www-data app bin/roadiz install -n --env=install
docker-compose exec -u www-data app bin/roadiz generate:private-key
docker-compose up -d --force-recreate --no-deps app varnish
docker-compose exec -u www-data app bin/roadiz users:create -m [email protected] -b -s -p "supersecretpassword" johndoe
Then browse to https://headless.test/rz-admin and build your headless API.
Standalone code is configured to create a CommonContentResponse from a main-menu node. If you need to customize
common content responses, we invite you to create a custom project.
# Project .env
# Example Traefik local IP and
TRUSTED_PROXIES=172.18.0.1,172.18.0.2,REMOTE_ADDR,varnish
# MySQL
MYSQL_ROOT_PASSWORD=changeme
MYSQL_HOST=db
MYSQL_DATABASE=roadiz
MYSQL_USER=roadiz
MYSQL_PASSWORD=changeme
MYSQL_VERSION=8.0
MAILER_TYPE=smtp
MAILER_HOST=mailer
MAILER_PORT=1025
MAILER_USER=
MAILER_PASSWORD=
MAILER_ENCRYPTION=
APP_ENV=prod
APP_DEBUG=0
APP_CACHE=0
# Api HTTP cache TTL in minutes
APP_API_CACHE_TTL=60
APP_NAMESPACE=headless
APP_TIMEZONE=Europe/Paris
APP_SECURITY_SESSION_NAME=headless_token
APP_SECURITY_SECRET=changeme
APP_SECURITY_COOKIE_SECURE=1
VARNISH_HOST=varnish
VARNISH_DOMAIN=varnish.headless.test
APP_ASSETS_DRIVER=gd
APP_ASSETS_DEFAULT_QUALITY=90
APP_ASSETS_MAX_PIXEL_SIZE=2500
APP_MESSENGER_DEFAULT_TRANSPORT_DSN=sync://
# Docker networking
DEFAULT_GATEWAY=172.22.0.1
# To use with Traefik and your local dev environment
# On linux you can use dnsmasq to redirect all DNS for *.test TLD to your machine.
# Or just copy this line to your /etc/hosts
#
# 127.0.0.1 varnish.headless.test
#
HOSTNAME_VARNISH=`varnish.headless.test`
#docker-compose.yaml
version: '3'
services:
db:
image: mysql:8.0
networks:
- default
restart: unless-stopped
volumes:
- "db_data:/var/lib/mysql:delegated"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
app:
# Need to pass all vars to docker env for Crontab and supervisor scripts
env_file: "./.env"
restart: unless-stopped
image: roadiz/headless-edition:develop
depends_on:
- db
volumes:
# Need to persist config and keys
- app_config:/var/www/app/conf
- private_files:/var/www/html/files
- public_files:/var/www/html/web/files
- assets_files:/var/www/html/web/assets
- gen_src:/var/www/html/app/gen-src/GeneratedNodeSources
- proxies:/var/www/html/app/gen-src/Proxies
- compiled:/var/www/html/app/gen-src/Compiled
networks:
- default
environment:
APP_CACHE: ${APP_CACHE}
TRUSTED_PROXIES: ${TRUSTED_PROXIES}
DEFAULT_GATEWAY: ${DEFAULT_GATEWAY}
varnish:
image: roadiz/varnish:develop
tmpfs: /usr/local/var/varnish:exec
restart: unless-stopped
depends_on:
- app
links:
- app:app
networks:
frontproxynet:
aliases:
- ${APP_NAMESPACE}_varnish
default:
labels:
- "traefik.enable=true"
# Listen HTTP
- "traefik.http.routers.${APP_NAMESPACE}.entrypoints=http"
- "traefik.http.routers.${APP_NAMESPACE}.rule=Host(${HOSTNAME_VARNISH})"
- "traefik.http.routers.${APP_NAMESPACE}.service=${APP_NAMESPACE}"
# Listen HTTPS
- "traefik.http.routers.${APP_NAMESPACE}-secure.entrypoints=https"
- "traefik.http.routers.${APP_NAMESPACE}-secure.tls=true"
- "traefik.http.routers.${APP_NAMESPACE}-secure.tls.certresolver=letsencrypt"
- "traefik.http.routers.${APP_NAMESPACE}-secure.rule=Host(${HOSTNAME_VARNISH})"
- "traefik.http.routers.${APP_NAMESPACE}-secure.service=${APP_NAMESPACE}"
# Apply middlewares
#- "traefik.http.routers.${APP_NAMESPACE}-secure.middlewares=${APP_NAMESPACE}Auth,${APP_NAMESPACE}Redirectregex"
- "traefik.http.routers.${APP_NAMESPACE}.middlewares=${APP_NAMESPACE}Redirectscheme"
# Define Middlewares
# Add a Basic auth protection
#- "traefik.http.middlewares.${APP_NAMESPACE}Auth.basicauth.users=${AUTH_BASIC}"
# IP Whitelist
#- "traefik.http.middlewares.${APP_NAMESPACE}Ipwhitelist.ipwhitelist.sourcerange=${IP_RANGE}"
# Add domain redirection (${APP_NAMESPACE} non-www to www redir)
#- "traefik.http.middlewares.${APP_NAMESPACE}Redirectregex.redirectregex.regex=${REDIRECT_REGEX}"
#- "traefik.http.middlewares.${APP_NAMESPACE}Redirectregex.redirectregex.replacement=${REDIRECT_REPLACEMENT}"
#- "traefik.http.middlewares.${APP_NAMESPACE}Redirectregex.redirectregex.permanent=true"
# Add SSL redirection
- "traefik.http.middlewares.${APP_NAMESPACE}Redirectscheme.redirectscheme.scheme=https"
- "traefik.http.middlewares.${APP_NAMESPACE}Redirectscheme.redirectscheme.permanent=true"
# backup:
# image: ambroisemaupate/s3-backup
# networks:
# - default
# depends_on:
# - db
# environment:
# LOCAL_PATH: /var/www/html
# DB_USER: ${MYSQL_USER}
# DB_HOST: db
# DB_PASS: ${MYSQL_PASSWORD}
# DB_NAME: ${MYSQL_DATABASE}
# S3_ACCESS_KEY: ${S3_ACCESS_KEY}
# S3_SECRET_KEY: ${S3_SECRET_KEY}
# S3_SIGNATURE: ${S3_SIGNATURE}
# S3_BUCKET_LOCATION: ${S3_BUCKET_LOCATION}
# S3_HOST_BASE: ${S3_HOST_BASE}
# S3_HOST_BUCKET: ${S3_HOST_BUCKET}
# S3_BUCKET_NAME: ${S3_BUCKET_NAME}
# S3_FOLDER_NAME: ${S3_FOLDER_NAME}
# volumes:
# - private_files:/var/www/html/files:ro
# - public_files:/var/www/html/web/files:ro
# - gen_src:/var/www/html/app/gen-src:ro
networks:
frontproxynet:
external: true
# If you need to use port forwarding, fixing default gateway can be useful
# to keep same host IP address between service restarts
default:
ipam:
driver: default
config:
- subnet: ${DEFAULT_GATEWAY}/16
volumes:
app_config:
private_files:
public_files:
assets_files:
gen_src:
proxies:
compiled:
db_data:
Content type
Image
Digest
sha256:31e5b51bc…
Size
452.7 MB
Last updated
almost 4 years ago
docker pull roadiz/headless-edition