Leading open-source headless CMS with a visual content type builder, automatic REST and GraphQL APIs, and a powerful admin panel for managing content.
Grab the automated bash script from GitHub to follow along with the video.
wget https://raw.githubusercontent.com/mhmdali94/Docker/main/cms/strapi/strapi-ubuntu.sh
chmod +x strapi-ubuntu.sh
sudo bash strapi-ubuntu.sh
The script installs Docker if needed, then pulls the Strapi and PostgreSQL images and starts both containers. Strapi admin panel and API will be available on port 1337 with a PostgreSQL database for production-grade data persistence.
wget https://raw.githubusercontent.com/mhmdali94/Docker/main/cms/strapi/strapi-ubuntu.sh
chmod +x strapi-ubuntu.sh
sudo bash strapi-ubuntu.sh
Open your browser and navigate to the Strapi admin panel. On first visit you will be prompted to create the administrator account — set a full name, email, and strong password. This account has full access to all content types, media, settings, and API tokens.
http://<your-server-ip>:1337/admin
Use the visual Content-Type Builder to define your data models without writing code. Create collection types (multiple entries) or single types (one entry). For example, create an Article type with fields like Title (text), Content (rich text), Cover (media), PublishedAt (date), and Category (relation). Strapi automatically generates REST and GraphQL endpoints for each content type you create.
After creating content types and adding entries, call the auto-generated REST API from any frontend or tool. Set permissions in Settings → Roles → Public to allow unauthenticated access, or use a Bearer token for authenticated requests. The API follows a consistent pattern for all content types.
# Get all articles (public)
GET http://<your-server-ip>:1337/api/articles
# Get with Bearer token
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
http://<your-server-ip>:1337/api/articles
| Port | Purpose |
|---|---|
| 1337 | Strapi Admin Panel & API |
| 5432 | PostgreSQL (internal) |
Strapi is the leading open-source headless CMS built on Node.js. It provides a visual Content Type Builder for designing your data models without code, generates REST and GraphQL APIs automatically, and includes a built-in admin panel for content editors — all self-hosted on your own server.
Strapi balances developer power with editor usability. Developers configure content types and plugins; editors manage content in a clean admin UI. Unlike WordPress, Strapi is API-first — designed to serve content to any frontend: Next.js, React, Vue, mobile apps, or static site generators.
Strapi runs on port 1337. In production, always serve it behind a reverse proxy on port 443. The database port should never be exposed. The admin panel at /admin should be restricted to trusted IP ranges if not needed publicly.
Alternatives include Payload CMS (code-first, TypeScript), Directus (wraps existing databases), WordPress REST API (PHP, huge ecosystem), and Contentful (cloud, polished). Choose Strapi for a visual content type builder with the largest open-source headless CMS community.
Avoid Strapi if you need real-time or live preview features — these are limited in Strapi. Also avoid for very high-traffic public APIs without caching in front of it, as Strapi's Node.js server is not optimized for extremely high concurrency without additional infrastructure.
PrismaTechWork provides end-to-end infrastructure services — from initial deployment and security hardening to ongoing monitoring, automated backups, and dedicated support. Whether you need a single-server setup or a multi-site network, our team ensures your infrastructure is built right, secured properly, and maintained reliably.
Minimal code is needed to get started. The Content Type Builder lets you create data models visually. APIs are generated automatically. You will need some Node.js knowledge to customize plugins, add custom routes, or configure lifecycle hooks — but basic Strapi usage is largely no-code for the CMS part.
Strapi v4 supports PostgreSQL, MySQL, MariaDB, and SQLite. SQLite is used by default for development only. For production, use PostgreSQL or MySQL. Configure the database connection in the config/database.js file or via environment variables.
Generate an API token in the Strapi admin panel under Settings then API Tokens. Use this token in the Authorization header of HTTP requests to the Strapi REST API endpoint (e.g., GET /api/articles). Alternatively, use the GraphQL API available at /graphql.
Yes. Enable the Internationalization plugin in Strapi (included by default in v4). Add the i18n field to your content types and specify which locales you support. Content editors can then create localized versions of each entry, and the API returns the requested locale via the locale query parameter.
Yes. Strapi has a plugin system — you can install community plugins from npm or build custom plugins that add new admin panel sections, API routes, middleware, and content type behaviors. The Strapi Marketplace lists vetted community plugins.
Build Strapi for production with npm run build (this compiles the admin panel). Run with npm run start in production mode. Use a process manager like PM2 or Docker Compose to keep it running. Place behind Nginx or Caddy with HTTPS. Use PostgreSQL and configure all secrets as environment variables.
Yes. Strapi includes a built-in media library for uploading and managing images, videos, and files. By default, files are stored locally. For production, configure a cloud storage provider plugin (AWS S3, Cloudinary, or other S3-compatible providers) via the upload provider setting.
Update the Strapi version in package.json, run npm install, and then npm run build followed by restarting the server. Always test upgrades in a staging environment first. Read the migration guide in the Strapi changelog for any breaking changes between versions.