Skip to content

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

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.