Sign inSign up

roadiz/headless-edition

By roadiz

•Updated almost 4 years ago

Ready-to-go Roadiz headless edition

Image
2

762

roadiz/headless-edition repository overview

⁠Documentation

⁠Headless edition

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.

⁠Ready-to-go Docker image

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.

⁠Stack example using existing Traefik reverse-proxy
# 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:

Tag summary

Content type

Image

Digest

sha256:31e5b51bc…

Size

452.7 MB

Last updated

almost 4 years ago

docker pull roadiz/headless-edition