A modern marketing website powered by Strapi CMS with a React frontend, fully containerized with Docker for easy deployment and updates.
- 🎨 Dynamic Content Management - Edit pages, content, and settings through Strapi admin panel
- 🎯 Drag & Drop Page Builder - Create and arrange page sections with ease
- 🔧 Configurable Domains - Change app domain (app.jobrythm.com) from admin panel
- 🐳 Docker Ready - Full Docker setup with persistent data storage
- 🚀 Easy Updates - Just
git pullanddocker compose up -d --build - 🔒 Secure - PostgreSQL database, environment variables, security headers
- 📱 Responsive - Mobile-first design with Tailwind CSS
- React 18 + TypeScript
- Vite (build tool)
- Tailwind CSS
- React Router
- Framer Motion (animations)
- Strapi 4.x (Headless CMS)
- PostgreSQL 15
- Node.js 18
- Docker & Docker Compose
- Nginx (reverse proxy & static files)
- Persistent volumes for database & uploads
- Docker & Docker Compose installed
- Git
-
Clone the repository
git clone https://github.com/Jobrythm/jobrythm.com.git cd jobrythm.com -
Create environment file
cp .env.example .env
-
Generate secure keys (Important for production!)
# Generate random keys for production node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
Update
.envwith generated keys:APP_KEYS(generate 4 keys, comma-separated)API_TOKEN_SALTADMIN_JWT_SECRETTRANSFER_TOKEN_SALTJWT_SECRETDATABASE_PASSWORD
-
Start the application
docker compose up -d --build
-
Wait for services to start (~2-3 minutes on first run)
docker compose logs -f strapi
-
Access the application
- Frontend: http://localhost
- Strapi Admin: http://localhost:1337/admin
-
Create admin user (First time only)
- Navigate to http://localhost:1337/admin
- Create your admin account
- Email:
admin@jobrythm.com - Password:
adminpassword(or your choice)
-
Login to Strapi Admin
- URL: http://localhost:1337/admin
- Default credentials: admin@jobrythm.com / adminpassword
-
Create Content Types
- Pages
- Page Sections (Hero, Features, Pricing, etc.)
- Settings (App Domain, Site Title, etc.)
-
Build Pages
- Add sections using drag & drop
- Edit content with markdown support
- Publish when ready
When you make code changes or pull updates:
# Pull latest changes
git pull
# Rebuild and restart
docker compose up -d --build
# View logs
docker compose logs -f- Go to Strapi Admin → Settings
- Add/Edit setting:
app_domain - Set value:
app.jobrythm.comorapp.jobrythm.aricummings.com - Frontend will automatically use this value
# Start all services
docker compose up -d
# Start with rebuild
docker compose up -d --build
# Stop all services
docker compose down
# View logs
docker compose logs -f [service_name]
# Restart a service
docker compose restart [service_name]
# Remove all containers and volumes (WARNING: deletes data!)
docker compose down -vAll data is stored in Docker volumes:
db_data- PostgreSQL databasestrapi_uploads- Uploaded media files
Important: These volumes persist even when containers are removed (unless you use docker compose down -v).
cd frontend
npm install
npm run devcd strapi
npm install
npm run developUpdate .env files in each directory with local database credentials.
jobrythm.com/
├── frontend/ # React frontend
│ ├── src/
│ │ ├── components/ # Reusable components
│ │ ├── pages/ # Page components
│ │ └── services/ # API services
│ ├── Dockerfile
│ └── nginx.conf
│
├── strapi/ # Strapi CMS
│ ├── config/ # Configuration files
│ ├── src/
│ │ ├── api/ # API endpoints
│ │ └── admin/ # Admin customization
│ └── Dockerfile
│
├── docker-compose.yml # Docker orchestration
└── .env.example # Environment template
- Route (e.g.,
/,/features,/pricing) - Title & Meta Description (SEO)
- Sections (relation to Page Sections)
- Published status
- Section Type (Hero, Features, Pricing, Markdown, etc.)
- Content (JSON with markdown support)
- Position (for ordering)
- Visibility toggle
- App Domain
- Site Title
- Contact Email
- Social Links
- Custom settings
See .env.example for all available variables.
Critical for production:
- Generate unique, secure keys for all
APP_KEYS, secrets, and salts - Use strong database password
- Set
NODE_ENV=production
# Check Strapi logs
docker compose logs strapi
# Rebuild Strapi
docker compose up -d --build strapi# Check database is running
docker compose ps
# Check database logs
docker compose logs database
# Restart database
docker compose restart databaseIf ports 80, 443, or 1337 are in use:
- Stop conflicting services
- Or modify
docker-compose.ymlto use different ports
Data in Docker volumes persists automatically. If you need to backup:
# Backup database
docker compose exec database pg_dump -U strapi strapi > backup.sql
# Restore database
docker compose exec -T database psql -U strapi strapi < backup.sql- ✅ All sensitive data in environment variables
- ✅ PostgreSQL with persistent storage
- ✅ Nginx security headers
- ✅ Strapi admin protected by JWT
- ✅ CORS configuration
- ✅ Rate limiting (can be configured)
For production:
- Use strong, unique secrets
- Enable HTTPS (add SSL certificates to nginx)
- Configure firewall rules
- Regular backups
- Keep dependencies updated
- Fork the repository
- Create a feature branch
- Make your changes
- Test with Docker
- Submit a pull request
MIT License - see LICENSE file for details
For issues and questions:
- GitHub Issues: https://github.com/Jobrythm/jobrythm.com/issues
- Email: support@jobrythm.com
- Initial release with Strapi CMS
- Docker setup with persistent data
- React frontend with Tailwind CSS
- Configurable domain settings
- Drag & drop page builder