Starpi is a headless and open-source CMS. It’s really complete and offers a bunch of community plugins to add even more features.
Strapi does not offer a docker image, tho we can build our own one.
Then let’s use our postgres db and use the following docker-compose.
version: '3.8'
services: strapi-rgc: image: ghcr.io/zareix/strapi restart: unless-stopped environment: - HOST=${HOST} - PORT=${PORT} - APP_KEYS=${APP_KEYS} - API_TOKEN_SALT=${API_TOKEN_SALT} - ADMIN_JWT_SECRET=${ADMIN_JWT_SECRET} - JWT_SECRET=${JWT_SECRET} - SENDGRID_API_KEY=${SENDGRID_API_KEY} - VERCEL_DEPLOY_PLUGIN_HOOK=${VERCEL_DEPLOY_PLUGIN_HOOK} - VERCEL_DEPLOY_PLUGIN_API_TOKEN=${VERCEL_DEPLOY_PLUGIN_API_TOKEN} - VERCEL_DEPLOY_PLUGIN_APP_FILTER=${VERCEL_DEPLOY_PLUGIN_APP_FILTER} - VERCEL_DEPLOY_PLUGIN_TEAM_FILTER=${VERCEL_DEPLOY_PLUGIN_TEAM_FILTER} - NEXTJS_REVALIDATE_API_URL=${NEXTJS_REVALIDATE_API_URL} - DATABASE_HOST=${DATABASE_HOST} - DATABASE_PORT=${DATABASE_PORT} - DATABASE_NAME=${DATABASE_NAME} - DATABASE_USERNAME=${DATABASE_USERNAME} - DATABASE_PASSWORD=${DATABASE_PASSWORD} - DATABASE_CLIENT=${DATABASE_CLIENT} - R2_ACCESS_KEY_ID=${R2_ACCESS_KEY_ID} - R2_ACCESS_SECRET=${R2_ACCESS_SECRET} - R2_REGION=${R2_REGION} - R2_BUCKET=${R2_BUCKET} - R2_ACCOUNT_ID=${R2_ACCOUNT_ID} - R2_PUBLIC_URL=${R2_PUBLIC_URL} - RECAPTCHA_KEY=${RECAPTCHA_KEY} ports: - 8020:1337 networks: - homelab deploy: labels: - traefik.http.routers.strapi-rgc.rule=Host(`cms.raphael-catarino.fr`) - traefik.http.services.strapi-rgc.loadbalancer.server.port=1337 - traefik.http.routers.strapi-rgc.tls=true - traefik.http.routers.strapi-rgc.tls.certresolver=production - traefik.http.routers.strapi-rgc.tls.domains[0].main=raphael-catarino.fr - traefik.http.routers.strapi-rgc.tls.domains[0].sans=*.raphael-catarino.fr placement: constraints: - node.hostname == neptune
networks: homelab: external: true
Deprecated
Section titled “Deprecated”Strapi is good but sometimes a nightmare to selfhost, so I switch back to a notion databases as my main CMS or static markdown files.