Rafter 🏡
Update: Rafter is pivoting to a hosted model. This open-source code remains as a fun reference. Enjoy!
Rafter is a serverless deployment platform powered by Google Cloud. It leverages Google Cloud Run (and many other tools) to transform your Git repository into a fully-scalable serverless application running in the cloud - with zero configuration.
💰 Scales to zero when not in use, saving you money — perfect for hobby projects
🔥 Automatically scales to handle load
🔌 Manages, connects and creates Cloud SQL databases for your applications automatically
⚡️ Connects to GitHub and supports deploy-on-push
🚀 Spin up multiple environments available at vanity URLs at the click of a button
✨ No Dockerfiles required
⚠️ Rafter is still very much a work-in-progress! ⚠️
Google Cloud Services
Cloud Run (web service)
Official Documentation
- Creates services for each environment of each project, automatically
- Cloud Run handles all traffic roll-out, scaling, and configuration
- Environment variables are assigned to each unique service through the API
Cloud Build (image creation)
Official Documentation
- Docker images are created when code is pushed to GitHub
- Dockerfile is automatically provided based on type of project
- Currently supported: Laravel, Node.js
Cloud SQL (database)
Official Documentation
- Database instances are provisioned by Rafter through the API
- Databases are created and assigned to projects automatically using the Admin API
- Environmental variables are properly assigned based on type of project
Cloud Firestore (cache and session drivers)
UPDATE: This… doesn’t work great, due to a number of factors. Looking into alternatives.
Official Documentation
- NoSQL database to support key-value caching and session management
- Drivers integrated automatically based on project
- No additional credentials required for consumer apps to use, since credentials are supplied within Cloud Run
Cloud Tasks (queue driver)
Official Documentation
- Robust queue management platform
- Queues are automatically created for each environment
- Dedicated Cloud Run service is created for each project to handle incoming jobs through HTTP request payloads
- No daemon or worker instance is required
- Since Cloud Run is serverless, instances can fan out, thousands of jobs can be processed in a matter of seconds
Cloud Storage (image artifacts and uploads)
Official Documentation
- Object storage, similar to S3
- Automatically handles uploaded artifacts from Cloud Build
- Integrated into application helpers based on project type to handle user uploads
Cloud Scheduler
Official Documentation
- Used for firing cron events in e.g. Laravel
Cloud Logging
Official Documentation
- HTTP requests, stdout and app logs displayed inside Rafter log viewer
Roadmap
Here are things I’d like to work on next:
- [x] Extract laravel-rafter-core into a package
- [ ] Inject Laravel Stackdriver log driver config
- Support other projects:
- [x] Node
- [ ] WordPress
- [ ] Rails
- [ ] Go
- [ ] Custom Dockerfile
- [ ] Email driver support (does Google offer this as part of GCP?)
- [ ] Integration of Secret Manager
- [x] Integration of commands
- [ ] Integration of GCS for better uploads with Laravel
- [ ] Better Database operations
- [ ] Leverage GitHub Deployment API to mark when a branch has been deployed
- Lots of UI upgrades:
- [x] Log viewer
- [ ] Database information
- [ ] User profile/settings
- Better Cloud Build optimization
- [x] Clone using ZIP instead of Git
- [x] Use secrets rather than plain text tokens for security
- [ ] Consider adding multistage builds for Nodejs, Composer building steps
- [ ] Implement Custom Domain assignment and onboarding
- [ ] Implement an environment deletion workflow to delete resources/schedulers/etc
- [ ] Allow users to clone a public project without having to connect a source provider
- [ ] Create a CLI to allow users to push a local project without connecting a source provider
Development notes
- Clone it
- Use Valet to run it and connect to a local MySQL database
- Run
make share
to fire up ngrok.io local tunnel
- Requires grpc PHP extension to be installed locally:
pecl install grpc
Inspiration