Deploying ChiefOnboarding
Introduction
ChiefOnboarding is a powerful open-source employee onboarding platform that helps organizations automate and streamline the entire onboarding process for new hires. Built with Django and modern web technologies, ChiefOnboarding enables HR teams and managers to create customized onboarding workflows, assign tasks, track progress, send automated notifications, and integrate seamlessly with popular tools like Slack, email, and calendar systems.
Deploying ChiefOnboarding on Klutch.sh provides a production-ready, scalable infrastructure for your employee onboarding automation with automated Docker deployments, persistent storage for employee data and documents, secure environment variable management, and enterprise-grade reliability. Whether you’re onboarding new employees at a startup, managing complex workflows at a growing company, or implementing multi-department onboarding processes, Klutch.sh simplifies the deployment process and ensures your ChiefOnboarding instance is always available.
This comprehensive guide walks you through deploying ChiefOnboarding on Klutch.sh using a Dockerfile, configuring PostgreSQL databases, setting up persistent volumes for data retention and media files, managing environment variables for security and integrations, and implementing production best practices for scalable HR automation and employee onboarding management.
Prerequisites
Before you begin deploying ChiefOnboarding on Klutch.sh, ensure you have:
- A Klutch.sh account (sign up here)
- A GitHub repository for your ChiefOnboarding deployment configuration
- Basic understanding of Docker containers and environment variables
- A PostgreSQL database instance (recommended for production)
- (Optional) Slack workspace with API credentials for integration
- (Optional) SMTP server credentials for email notifications
- Access to the Klutch.sh dashboard
Understanding ChiefOnboarding Architecture
ChiefOnboarding consists of several key components:
- Django Application: Python-based web framework handling business logic, API endpoints, and data management
- Celery Workers: Background task processing for scheduled notifications, email delivery, and workflow automation
- Redis: Required for Celery message queuing and caching
- PostgreSQL Database: Stores employee data, onboarding workflows, tasks, and system configurations
- Static Files & Media: User uploads, profile pictures, documents, and static assets
- NGINX/Gunicorn: Web server and WSGI application server for handling HTTP requests
When deployed on Klutch.sh, ChiefOnboarding automatically detects your Dockerfile and builds a container image that includes all necessary components. The platform manages traffic routing, SSL certificates, and provides persistent storage options for your application data.
Project Structure
A minimal repository structure for deploying ChiefOnboarding on Klutch.sh:
chiefonboarding-deployment/├── Dockerfile├── docker-entrypoint.sh├── .dockerignore├── .gitignore├── .env.example└── README.mdThis simple structure allows Klutch.sh to automatically detect and build your ChiefOnboarding container. The official ChiefOnboarding Docker image comes pre-configured with the application code.
Creating Your Dockerfile
Klutch.sh automatically detects a Dockerfile in the root directory of your repository. Create a Dockerfile that uses the official ChiefOnboarding image or builds from source:
Option 1: Using Official ChiefOnboarding Image (Recommended)
FROM chiefonboarding/chiefonboarding:latest
# Expose the default ChiefOnboarding portEXPOSE 8000
# The official image includes an entrypoint script# that handles database migrations and service startupCMD ["sh", "-c", "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn -b 0.0.0.0:8000 chiefonboarding.wsgi:application"]Option 2: Production Dockerfile with Health Checks
FROM chiefonboarding/chiefonboarding:latest
# Set working directoryWORKDIR /app
# Create directories for media and static filesRUN mkdir -p /app/media /app/staticfiles
# Expose the application portEXPOSE 8000
# Add health check for monitoringHEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8000/health/ || exit 1
# Copy custom entrypoint if neededCOPY docker-entrypoint.sh /app/docker-entrypoint.shRUN chmod +x /app/docker-entrypoint.sh
# Start application with migrations and static filesENTRYPOINT ["/app/docker-entrypoint.sh"]CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "3", "--timeout", "120", "chiefonboarding.wsgi:application"]Option 3: Custom Dockerfile Building from Source
FROM python:3.11-slim
# Install system dependenciesRUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ postgresql-client \ libpq-dev \ curl \ git \ && rm -rf /var/lib/apt/lists/*
# Set working directoryWORKDIR /app
# Clone ChiefOnboarding repositoryRUN git clone https://github.com/chiefonboarding/ChiefOnboarding.git /app
# Install Python dependenciesRUN pip install --no-cache-dir -r requirements.txt
# Create directoriesRUN mkdir -p /app/media /app/staticfiles
# Expose portEXPOSE 8000
# Health checkHEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8000/health/ || exit 1
# Copy entrypoint scriptCOPY docker-entrypoint.sh /app/docker-entrypoint.shRUN chmod +x /app/docker-entrypoint.sh
ENTRYPOINT ["/app/docker-entrypoint.sh"]CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "3", "--timeout", "120", "chiefonboarding.wsgi:application"]Custom Entrypoint Script (docker-entrypoint.sh)
Create a docker-entrypoint.sh file to handle initialization:
#!/bin/bashset -e
echo "Starting ChiefOnboarding..."
# Wait for database to be readyecho "Waiting for PostgreSQL..."while ! nc -z $DATABASE_HOST ${DATABASE_PORT:-5432}; do sleep 1doneecho "PostgreSQL is ready!"
# Run database migrationsecho "Running database migrations..."python manage.py migrate --noinput
# Collect static filesecho "Collecting static files..."python manage.py collectstatic --noinput
# Create superuser if it doesn't exist (optional)if [ "$DJANGO_SUPERUSER_USERNAME" ] && [ "$DJANGO_SUPERUSER_PASSWORD" ] && [ "$DJANGO_SUPERUSER_EMAIL" ]; then echo "Creating superuser..." python manage.py shell << EOFfrom django.contrib.auth import get_user_modelUser = get_user_model()if not User.objects.filter(username='$DJANGO_SUPERUSER_USERNAME').exists(): User.objects.create_superuser('$DJANGO_SUPERUSER_USERNAME', '$DJANGO_SUPERUSER_EMAIL', '$DJANGO_SUPERUSER_PASSWORD') print('Superuser created.')else: print('Superuser already exists.')EOFfi
# Execute the main commandexec "$@"Important Notes:
- ChiefOnboarding’s application listens on port 8000 internally
- Klutch.sh will route external HTTP traffic to port 8000 in your container
- The container includes the Django application, Gunicorn WSGI server
- Celery workers should be configured separately or run in the same container with supervisord
Deploying to Klutch.sh
-
Create Your Repository
Create a new GitHub repository and add your Dockerfile and entrypoint script:
Terminal window mkdir chiefonboarding-deploymentcd chiefonboarding-deployment# Create Dockerfilecat > Dockerfile << 'EOF'FROM chiefonboarding/chiefonboarding:latestWORKDIR /appRUN mkdir -p /app/media /app/staticfilesEXPOSE 8000HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \CMD curl -f http://localhost:8000/health/ || exit 1CMD ["sh", "-c", "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn -b 0.0.0.0:8000 --workers 3 --timeout 120 chiefonboarding.wsgi:application"]EOF# Create .gitignorecat > .gitignore << 'EOF'.env.DS_Store__pycache__/*.pycstaticfiles/media/EOF# Create .dockerignorecat > .dockerignore << 'EOF'.git.gitignore.envREADME.mdEOF# Initialize git and pushgit initgit add .git commit -m "Initial ChiefOnboarding deployment setup"git remote add origin https://github.com/YOUR_USERNAME/chiefonboarding-deployment.gitgit push -u origin main -
Access the Klutch.sh Dashboard
Navigate to klutch.sh/app and log in to your account.
-
Create a New Project
- Click “New Project” in the dashboard
- Enter a project name (e.g., “HR Systems”)
- Select your preferred region for deployment
-
Create a New Application
- Within your project, click “New App”
- Name your application (e.g., “ChiefOnboarding”)
- Connect your GitHub repository containing the Dockerfile
-
Configure Build Settings
Klutch.sh automatically detects the Dockerfile in your repository root. The build process will use this Dockerfile to create your container image.
-
Set Up Persistent Storage
ChiefOnboarding requires persistent storage for media files, uploads, and application data:
- In the app settings, navigate to the “Volumes” section
- Click “Add Volume”
- Set the mount path to
/app/media - Set the volume size (recommended: 10GB minimum for production)
- Click “Add” to attach the volume
- Optionally, add another volume for static files at
/app/staticfiles(5GB)
Critical: The
/app/mediadirectory stores:- Employee profile pictures
- Uploaded documents and files
- Custom resources and training materials
- Integration files and exports
-
Configure Environment Variables
In the app settings, add the following required environment variables:
Essential Variables:
Terminal window SECRET_KEY=your-very-long-secret-key-min-50-charsDEBUG=FalseALLOWED_HOSTS=your-app-name.klutch.sh,example-app.klutch.shDatabase Configuration:
Terminal window DATABASE_ENGINE=django.db.backends.postgresqlDATABASE_HOST=your-postgres-host.klutch.shDATABASE_PORT=8000DATABASE_NAME=chiefonboardingDATABASE_USER=chiefonboarding_userDATABASE_PASSWORD=your-secure-database-passwordRedis Configuration (Required for Celery):
Terminal window REDIS_URL=redis://your-redis-host:6379/0CELERY_BROKER_URL=redis://your-redis-host:6379/0CELERY_RESULT_BACKEND=redis://your-redis-host:6379/0Email Configuration (SMTP):
Terminal window EMAIL_HOST=smtp.gmail.comEMAIL_PORT=587EMAIL_USE_TLS=TrueEMAIL_HOST_USER=your-email@gmail.comEMAIL_HOST_PASSWORD=your-app-specific-passwordDEFAULT_FROM_EMAIL=noreply@yourdomain.comSlack Integration (Optional):
Terminal window SLACK_BOT_TOKEN=xoxb-your-slack-bot-tokenSLACK_CLIENT_ID=your-slack-client-idSLACK_CLIENT_SECRET=your-slack-client-secretSLACK_SIGNING_SECRET=your-slack-signing-secretApplication Configuration:
Terminal window SITE_URL=https://your-app-name.klutch.shBASE_URL=https://your-app-name.klutch.shTIME_ZONE=America/New_YorkLANGUAGE_CODE=en-usSecurity Settings:
Terminal window CSRF_TRUSTED_ORIGINS=https://your-app-name.klutch.shSESSION_COOKIE_SECURE=TrueCSRF_COOKIE_SECURE=TrueSecurity Best Practice: Always use the “Secret” checkbox for sensitive values like SECRET_KEY, database passwords, API tokens, and SMTP passwords.
-
Configure Traffic Settings
- In the “Networking” section, select HTTP as the traffic type
- Set the internal port to 8000 (ChiefOnboarding’s default port)
- Enable automatic HTTPS/SSL (provided by Klutch.sh)
-
Deploy the Application
- Review all settings
- Click “Deploy” to start the build process
- Klutch.sh will:
- Clone your repository
- Detect the Dockerfile
- Build the container image
- Deploy to your selected region
- Provision persistent storage
- Configure networking and SSL
-
Monitor Deployment Progress
- View real-time build logs in the dashboard
- Wait for the deployment status to show “Running”
- Initial startup may take 2-3 minutes as Django runs migrations and collects static files
Once deployment completes, your ChiefOnboarding instance will be accessible at https://your-app-name.klutch.sh or your configured custom domain.
Database Setup and Configuration
ChiefOnboarding requires PostgreSQL for production deployments. SQLite is not recommended for production use.
Setting Up PostgreSQL
-
Provision a PostgreSQL Database
You can use:
- A PostgreSQL instance deployed on Klutch.sh (follow the PostgreSQL deployment guide)
- A managed PostgreSQL service (AWS RDS, Google Cloud SQL, DigitalOcean Managed Database)
- Your own PostgreSQL server
-
Create Application Database and User
Connect to your PostgreSQL instance and create a database for ChiefOnboarding:
CREATE DATABASE chiefonboarding;CREATE USER chiefonboarding_user WITH PASSWORD 'strong-secure-password';GRANT ALL PRIVILEGES ON DATABASE chiefonboarding TO chiefonboarding_user;-- Grant schema privileges (PostgreSQL 15+)\c chiefonboardingGRANT ALL ON SCHEMA public TO chiefonboarding_user; -
Configure Database Connection
In your Klutch.sh app environment variables, set:
Terminal window DATABASE_ENGINE=django.db.backends.postgresqlDATABASE_HOST=your-postgres-host.klutch.shDATABASE_PORT=8000DATABASE_NAME=chiefonboardingDATABASE_USER=chiefonboarding_userDATABASE_PASSWORD=strong-secure-passwordNote: If your PostgreSQL database is deployed on Klutch.sh with TCP traffic, use port 8000 for external connections.
-
Test Database Connection
After setting the environment variables, trigger a new deployment. Check the logs to ensure migrations run successfully:
Terminal window # Look for these log messages:Running migrations...Operations to perform:Applying migrations...
Setting Up Redis for Celery
ChiefOnboarding uses Celery for background task processing (sending emails, Slack notifications, scheduled workflows). Redis is required as the message broker.
-
Deploy Redis Instance
Option A: Deploy Redis on Klutch.sh
- Follow the Redis deployment guide if available
- Use the official Redis Docker image
Option B: Use a managed Redis service
- Redis Labs (cloud-hosted)
- AWS ElastiCache
- DigitalOcean Managed Redis
-
Configure Redis Connection
Add these environment variables to your ChiefOnboarding app:
Terminal window REDIS_URL=redis://your-redis-host:6379/0CELERY_BROKER_URL=redis://your-redis-host:6379/0CELERY_RESULT_BACKEND=redis://your-redis-host:6379/0If Redis requires authentication:
Terminal window REDIS_URL=redis://:password@your-redis-host:6379/0CELERY_BROKER_URL=redis://:password@your-redis-host:6379/0 -
Start Celery Workers
ChiefOnboarding requires Celery workers to process background tasks. You have two options:
Option A: Single Container with Supervisord (simpler but less scalable)
Update your Dockerfile to include supervisor:
FROM chiefonboarding/chiefonboarding:latestRUN apt-get update && apt-get install -y supervisor && rm -rf /var/lib/apt/lists/*COPY supervisord.conf /etc/supervisor/conf.d/supervisord.confEXPOSE 8000CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]Create
supervisord.conf:[supervisord]nodaemon=true[program:django]command=gunicorn -b 0.0.0.0:8000 --workers 3 chiefonboarding.wsgi:applicationautostart=trueautorestart=truestderr_logfile=/var/log/django.err.logstdout_logfile=/var/log/django.out.log[program:celery]command=celery -A chiefonboarding worker -l infoautostart=trueautorestart=truestderr_logfile=/var/log/celery.err.logstdout_logfile=/var/log/celery.out.log[program:celerybeat]command=celery -A chiefonboarding beat -l infoautostart=trueautorestart=truestderr_logfile=/var/log/celerybeat.err.logstdout_logfile=/var/log/celerybeat.out.logOption B: Separate Celery Worker App (recommended for production)
Deploy a second Klutch.sh app for Celery workers:
- Use the same repository and Docker image
- Override the CMD to run Celery instead of Gunicorn
- Set environment variables to match your main app
In the Celery worker app, use this Dockerfile:
FROM chiefonboarding/chiefonboarding:latestCMD ["celery", "-A", "chiefonboarding", "worker", "-l", "info", "--concurrency", "4"]
Setting Up Persistent Volumes
Persistent storage is critical for maintaining employee data, uploaded documents, and configuration files across deployments and restarts.
Required Mount Paths
Configure persistent volumes in the Klutch.sh dashboard:
-
Mount Path:
/app/media -
Recommended Size: 10GB minimum (20GB+ for production with many employees)
-
Mount Path (optional):
/app/staticfiles -
Recommended Size: 5GB
What Gets Stored
The /app/media directory contains:
/app/media/├── profile_photos/ # Employee profile pictures├── documents/ # Uploaded onboarding documents├── resources/ # Training materials and guides├── badges/ # Achievement badges and icons└── exports/ # Data exports and reportsBackup Strategy
For production deployments, implement regular backups:
-
Schedule Volume Snapshots
Use Klutch.sh’s volume snapshot feature (if available) to create regular backups of the media volume.
-
Database Backups
Regularly backup your PostgreSQL database:
Terminal window pg_dump -h host -U chiefonboarding_user -d chiefonboarding > chiefonboarding-backup-$(date +%Y%m%d).sql -
Automated Backup Script
Create a backup script that runs daily:
#!/bin/bashDATE=$(date +%Y%m%d)# Backup databasepg_dump -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAME > /backups/db-$DATE.sql# Compress and upload to S3 or backup servicetar -czf /backups/chiefonboarding-$DATE.tar.gz /backups/db-$DATE.sql /app/media# Upload to S3 (requires AWS CLI)aws s3 cp /backups/chiefonboarding-$DATE.tar.gz s3://your-backup-bucket/# Clean up old backups (keep last 30 days)find /backups -type f -mtime +30 -delete
Environment Variables Reference
Required Variables
| Variable | Description | Example |
|---|---|---|
SECRET_KEY | Django secret key for security (min 50 chars) | django-insecure-a1b2c3d4e5... |
DEBUG | Debug mode (must be False in production) | False |
ALLOWED_HOSTS | Comma-separated list of allowed hostnames | app.klutch.sh,yourdomain.com |
DATABASE_ENGINE | Database backend | django.db.backends.postgresql |
DATABASE_HOST | Database hostname | postgres.klutch.sh |
DATABASE_PORT | Database port | 8000 |
DATABASE_NAME | Database name | chiefonboarding |
DATABASE_USER | Database username | chiefonboarding_user |
DATABASE_PASSWORD | Database password | secure-password-here |
Redis & Celery Variables
| Variable | Description | Example |
|---|---|---|
REDIS_URL | Redis connection URL | redis://host:6379/0 |
CELERY_BROKER_URL | Celery message broker | redis://host:6379/0 |
CELERY_RESULT_BACKEND | Celery result backend | redis://host:6379/0 |
Email Configuration
| Variable | Description | Example |
|---|---|---|
EMAIL_HOST | SMTP server hostname | smtp.gmail.com |
EMAIL_PORT | SMTP server port | 587 |
EMAIL_USE_TLS | Use TLS encryption | True |
EMAIL_HOST_USER | SMTP username | your-email@gmail.com |
EMAIL_HOST_PASSWORD | SMTP password | app-specific-password |
DEFAULT_FROM_EMAIL | Default sender email | noreply@yourdomain.com |
Slack Integration (Optional)
| Variable | Description |
|---|---|
SLACK_BOT_TOKEN | Slack bot OAuth token |
SLACK_CLIENT_ID | Slack app client ID |
SLACK_CLIENT_SECRET | Slack app client secret |
SLACK_SIGNING_SECRET | Slack request signing secret |
Application Settings
| Variable | Description | Default |
|---|---|---|
SITE_URL | Public URL of your instance | https://app.klutch.sh |
BASE_URL | Base URL for links | https://app.klutch.sh |
TIME_ZONE | Server timezone | UTC |
LANGUAGE_CODE | Language code | en-us |
CSRF_TRUSTED_ORIGINS | Trusted origins for CSRF | https://app.klutch.sh |
Slack Integration Setup
ChiefOnboarding integrates with Slack to send onboarding notifications, task reminders, and welcome messages to new employees.
-
Create Slack App
- Go to api.slack.com/apps
- Click “Create New App” → “From scratch”
- Enter app name: “ChiefOnboarding”
- Select your workspace
-
Configure OAuth Scopes
- Navigate to “OAuth & Permissions”
- Add Bot Token Scopes:
chat:writechat:write.publicusers:readusers:read.emailchannels:readgroups:read
-
Install App to Workspace
- Click “Install to Workspace”
- Authorize the requested permissions
- Copy the “Bot User OAuth Token” (starts with
xoxb-)
-
Get App Credentials
- Navigate to “Basic Information”
- Copy:
- Client ID
- Client Secret
- Signing Secret
-
Configure Environment Variables
Add these to your ChiefOnboarding app on Klutch.sh:
Terminal window SLACK_BOT_TOKEN=xoxb-your-token-hereSLACK_CLIENT_ID=123456789.123456789SLACK_CLIENT_SECRET=abcdef123456SLACK_SIGNING_SECRET=your-signing-secret -
Enable Event Subscriptions (Optional)
- In Slack App settings, go to “Event Subscriptions”
- Enable Events
- Set Request URL:
https://your-app-name.klutch.sh/slack/events/ - Subscribe to bot events:
message.channels,app_mention
Custom Domain Configuration
To use your own domain with ChiefOnboarding on Klutch.sh:
-
Add Domain in Dashboard
- Navigate to your ChiefOnboarding app in the Klutch.sh dashboard
- Go to “Domains” section
- Click “Add Custom Domain”
- Enter your domain (e.g.,
onboarding.yourdomain.com)
-
Configure DNS Records
Add a CNAME record in your DNS provider:
Type: CNAMEName: onboarding (or your subdomain)Value: your-app-name.klutch.shTTL: 3600 -
Enable SSL/TLS
Klutch.sh automatically provisions and manages SSL certificates for your custom domain using Let’s Encrypt.
-
Update ChiefOnboarding Configuration
Update environment variables:
Terminal window SITE_URL=https://onboarding.yourdomain.comBASE_URL=https://onboarding.yourdomain.comALLOWED_HOSTS=onboarding.yourdomain.com,your-app-name.klutch.shCSRF_TRUSTED_ORIGINS=https://onboarding.yourdomain.com -
Verify Configuration
- Wait for DNS propagation (usually 5-15 minutes)
- Visit
https://onboarding.yourdomain.com - Verify SSL certificate is active
For detailed domain configuration, see the Klutch.sh Custom Domains guide.
Getting Started with ChiefOnboarding
After deploying your ChiefOnboarding instance, follow these steps to set up your first onboarding workflow:
Initial Setup
-
Access Your Instance
Navigate to
https://your-app-name.klutch.sh(or your custom domain). -
Create Administrator Account
If you didn’t set
DJANGO_SUPERUSER_*environment variables:- Click “Sign up” to create the first admin account
- Enter your email, full name, and password
- Complete the registration
Or access the container and create a superuser manually:
Terminal window python manage.py createsuperuser -
Configure Organization Settings
- Log in to the admin panel
- Navigate to Settings
- Configure:
- Company name and logo
- Default timezone
- Email templates
- Slack workspace connection
-
Set Up Teams and Departments
- Create departments (e.g., Engineering, Sales, Marketing)
- Add team members and managers
- Assign roles and permissions
Creating Your First Onboarding Workflow
-
Create a New Sequence
- Navigate to “Sequences” in the dashboard
- Click “Create New Sequence”
- Enter sequence name (e.g., “Engineering Onboarding”)
- Choose sequence type:
- Pre-boarding (before first day)
- First day
- First week
- First month
-
Add Tasks to Sequence
Click “Add Task” and configure:
Example Task 1: Complete HR Paperwork
Name: Complete employment formsDescription: Fill out W-4, I-9, and direct deposit formsAssigned to: New hireDue: Day 1, 9:00 AMType: Form submissionPriority: HighExample Task 2: Set Up Development Environment
Name: Install development toolsDescription: Install VS Code, Node.js, Git, and DockerAssigned to: New hireDue: Day 1, 2:00 PMType: ChecklistPriority: MediumExample Task 3: Meet with Manager
Name: 1:1 with ManagerDescription: 30-minute intro meeting to discuss role and expectationsAssigned to: ManagerDue: Day 1, 11:00 AMType: MeetingPriority: High -
Configure Notifications
For each task, set up:
- Email notifications (send to employee, manager, or both)
- Slack messages (DM or channel)
- Reminder frequency (1 day before, same day, overdue)
-
Add Resources
Attach helpful resources to tasks:
- PDF documents (employee handbook, policies)
- Links to internal wikis or documentation
- Video tutorials
- Contact information
-
Set Conditions (Optional)
Create conditional logic:
- If task A is completed, trigger task B
- If role = “Developer”, show additional technical setup tasks
- If location = “Remote”, skip office tour
-
Save and Activate Sequence
- Review all tasks and settings
- Click “Save”
- Enable the sequence by toggling it to “Active”
Sample Onboarding Workflow
Here’s a complete example of a software engineering onboarding workflow:
Pre-boarding (Week before start date):
- ✉️ Welcome email with company info
- 📋 Send equipment preference survey
- 📝 Complete I-9 and W-4 forms online
- 🎫 Create accounts (email, Slack, GitHub, Jira)
Day 1:
- 🏢 Office tour (or virtual tour)
- 💻 Receive laptop and equipment
- 👥 Meet the team (introductions)
- 📖 Review employee handbook
- 🔐 Security and compliance training
- 🍕 Lunch with team
Week 1:
- 🛠️ Set up development environment
- 📚 Complete technical onboarding docs
- 🏗️ Deploy first “Hello World” to production
- 🗣️ 1:1 meetings with key stakeholders
- 📊 Review team’s current projects and roadmap
Month 1:
- 🎯 Complete first project milestone
- 📝 Submit first code review
- 🤝 Pair programming with senior developer
- 🧪 Learn testing and CI/CD processes
- 📈 30-day check-in with manager
Onboarding a New Employee
-
Add New Employee
- Navigate to “Employees” → “Add New”
- Enter employee information:
- Full name
- Email address
- Job title
- Department
- Manager
- Start date
-
Assign Onboarding Sequence
- Select one or more sequences to assign
- Choose start date (usually first day of work)
- Customize tasks if needed
-
Send Welcome Email
ChiefOnboarding automatically sends a welcome email with:
- Login credentials
- Overview of onboarding tasks
- First day schedule
- Important contacts
-
Track Progress
- Monitor task completion in real-time
- View progress dashboard
- Receive notifications when tasks are completed or overdue
- Send reminders manually if needed
-
Collect Feedback
After onboarding completion:
- Send feedback survey
- Review what worked well
- Identify areas for improvement
- Update sequences based on feedback
Production Best Practices
Security Hardening
-
Use Strong Secret Key
Generate a secure Django secret key:
Terminal window python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' -
Enable HTTPS Only
Ensure these environment variables are set:
Terminal window SESSION_COOKIE_SECURE=TrueCSRF_COOKIE_SECURE=TrueSECURE_SSL_REDIRECT=True -
Restrict Admin Access
- Use strong passwords for admin accounts
- Enable two-factor authentication (2FA)
- Limit admin privileges to only necessary users
- Regularly audit user access
-
Regular Security Updates
-
Monitor for ChiefOnboarding updates
-
Update your Dockerfile to use specific version tags:
FROM chiefonboarding/chiefonboarding:v2.5.0 -
Test updates in staging before production
-
Subscribe to security advisories
-
-
Database Security
- Use SSL/TLS for database connections
- Restrict database access to only the application
- Use strong database passwords
- Regular database backups
Performance Optimization
-
Configure Celery Workers
Adjust worker concurrency based on workload:
Terminal window celery -A chiefonboarding worker -l info --concurrency=8 -
Enable Redis Caching
Add caching configuration:
Terminal window REDIS_CACHE_URL=redis://your-redis-host:6379/1 -
Optimize Database Queries
- Create database indexes for frequently queried fields
- Use Django’s
select_related()andprefetch_related() - Monitor slow queries with Django Debug Toolbar (dev only)
-
Configure Gunicorn Workers
Adjust workers based on CPU cores:
CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "4", "--threads", "2", "--timeout", "120", "chiefonboarding.wsgi:application"]Rule of thumb:
workers = (2 * CPU cores) + 1 -
Use CDN for Static Assets
Configure a CDN for static files:
Terminal window STATIC_URL=https://cdn.yourdomain.com/static/ -
Monitor Resource Usage
- Track CPU, memory, and disk usage in Klutch.sh dashboard
- Set up alerts for high resource consumption
- Scale vertically (larger instance) if needed
Backup and Disaster Recovery
-
Automated Database Backups
Set up daily PostgreSQL backups:
backup.sh #!/bin/bashDATE=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="/backups"pg_dump -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAME \| gzip > $BACKUP_DIR/chiefonboarding-$DATE.sql.gz# Upload to S3aws s3 cp $BACKUP_DIR/chiefonboarding-$DATE.sql.gz \s3://your-backup-bucket/databases/# Keep only last 30 days locallyfind $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete -
Volume Snapshots
- Schedule regular snapshots of the
/app/mediavolume - Store snapshots in multiple regions
- Test restore procedures regularly
- Schedule regular snapshots of the
-
Configuration Backup
- Store environment variables in secure password manager
- Document all configuration settings
- Keep infrastructure-as-code in version control
-
Disaster Recovery Plan
Document steps to restore from backups:
- Provision new Klutch.sh app
- Restore database from latest backup
- Restore media files from volume snapshot
- Configure environment variables
- Verify application functionality
- Update DNS to point to new instance
Troubleshooting Common Issues
Application Won’t Start
Symptoms: Container starts but ChiefOnboarding UI is not accessible
Solutions:
-
Check logs in the Klutch.sh dashboard for errors
-
Verify all required environment variables are set
-
Ensure SECRET_KEY is at least 50 characters
-
Check database connectivity:
Terminal window python manage.py dbshell -
Verify Redis is accessible:
Terminal window redis-cli -h $REDIS_HOST ping -
Run migrations manually:
Terminal window python manage.py migrate
Database Connection Errors
Symptoms: “Unable to connect to database” errors in logs
Solutions:
-
Verify database credentials in environment variables
-
Check DATABASE_HOST and DATABASE_PORT are correct
-
If using Klutch.sh PostgreSQL with TCP, ensure port is 8000
-
Test connection from container:
Terminal window psql -h $DATABASE_HOST -p $DATABASE_PORT -U $DATABASE_USER -d $DATABASE_NAME -
Verify database user has necessary permissions
-
Check network connectivity between services
Celery Tasks Not Processing
Symptoms: Emails not sending, Slack notifications not appearing
Solutions:
-
Check if Celery worker is running:
Terminal window celery -A chiefonboarding inspect active -
Verify Redis connection:
Terminal window redis-cli -h $REDIS_HOST ping -
Check Celery logs for errors
-
Restart Celery workers
-
Verify CELERY_BROKER_URL matches REDIS_URL
Email Not Sending
Symptoms: Onboarding emails not delivered
Solutions:
-
Check email configuration in environment variables
-
Verify SMTP credentials are correct
-
Test SMTP connection:
Terminal window python manage.py sendtestemail your-email@example.com -
Check if EMAIL_USE_TLS is set correctly (True for port 587)
-
For Gmail, use an App Password instead of your regular password
-
Check spam folder
-
Review Celery worker logs for email task errors
Slack Integration Not Working
Symptoms: Slack notifications not appearing
Solutions:
- Verify Slack environment variables are set correctly
- Check SLACK_BOT_TOKEN starts with
xoxb- - Ensure bot is invited to channels where it should post
- Verify OAuth scopes are correct in Slack App settings
- Test connection in ChiefOnboarding admin panel
- Check Slack signing secret matches
- Review Celery logs for Slack API errors
Static Files Not Loading
Symptoms: Missing CSS, images not displaying
Solutions:
-
Run collectstatic command:
Terminal window python manage.py collectstatic --noinput -
Verify STATIC_ROOT is set correctly
-
Check volume mount for
/app/staticfiles -
Ensure web server (Gunicorn) can access static directory
-
Configure STATIC_URL correctly:
Terminal window STATIC_URL=/static/
Scaling Your ChiefOnboarding Deployment
As your organization grows, consider these scaling strategies:
Vertical Scaling
Increase resources for your ChiefOnboarding instance:
- Upgrade to a larger instance type in the Klutch.sh dashboard
- Increase persistent volume size if storage is constrained
- Recommended specs:
- Small (< 100 employees): 2 CPU, 4GB RAM
- Medium (100-500 employees): 4 CPU, 8GB RAM
- Large (500+ employees): 8+ CPU, 16+ GB RAM
Horizontal Scaling
For very large deployments:
- Deploy separate Celery worker instances
- Use a load balancer for multiple web app instances
- Implement read replicas for PostgreSQL
- Use Redis cluster for caching
Database Optimization
- Enable connection pooling (PgBouncer)
- Create indexes on frequently queried fields
- Archive old completed sequences
- Regular VACUUM and ANALYZE
Migration from Self-Hosted to Klutch.sh
If you’re migrating from an existing ChiefOnboarding installation:
-
Backup Existing Data
Export your database:
Terminal window python manage.py dumpdata > chiefonboarding-data.json# Or use pg_dumppg_dump -h localhost -U user chiefonboarding > backup.sql -
Export Media Files
Copy all uploaded files:
Terminal window tar -czf media-backup.tar.gz /path/to/media/ -
Deploy New Instance on Klutch.sh
Follow the deployment steps in this guide
-
Restore Database
Import your data:
Terminal window python manage.py loaddata chiefonboarding-data.json# Or restore from SQL dumppsql -h host -U user -d chiefonboarding < backup.sql -
Upload Media Files
Extract and upload to the persistent volume:
Terminal window tar -xzf media-backup.tar.gz -C /app/media/ -
Update Configuration
- Update SITE_URL and BASE_URL
- Configure email and Slack with new settings
- Update any webhook URLs
-
Test Thoroughly
- Verify all employees are present
- Check sequences and tasks
- Test email and Slack notifications
- Confirm file uploads work
-
Update DNS
Point your domain to the new Klutch.sh deployment
Advanced Customization
Custom Email Templates
ChiefOnboarding supports custom email templates:
-
Create Template Files
Create HTML email templates in your repository:
templates/emails/welcome.html <!DOCTYPE html><html><head><style>body { font-family: Arial, sans-serif; }.header { background-color: #4CAF50; color: white; padding: 20px; }</style></head><body><div class="header"><h1>Welcome to {{ company_name }}!</h1></div><p>Hi {{ employee_name }},</p><p>We're excited to have you join our team!</p></body></html> -
Update Dockerfile to Include Templates
FROM chiefonboarding/chiefonboarding:latestCOPY templates/ /app/templates/EXPOSE 8000CMD ["gunicorn", "-b", "0.0.0.0:8000", "chiefonboarding.wsgi:application"] -
Configure Template Path
Add environment variable:
Terminal window TEMPLATE_DIR=/app/templates
Custom Branding
Customize ChiefOnboarding’s appearance:
-
Upload Company Logo
- Log in to admin panel
- Navigate to Settings → Branding
- Upload logo (recommended: 200x50px PNG)
-
Configure Brand Colors
Add CSS customization:
custom.css :root {--primary-color: #4CAF50;--secondary-color: #45a049;--accent-color: #FFC107;} -
Custom Welcome Page
Create a custom landing page for new hires with your branding, company values, and culture information.
Cost Optimization Tips
- Right-size your instance: Start with a smaller instance and scale up based on usage
- Use efficient Celery workers: Monitor task queue and adjust worker count
- Implement task retention: Delete old completed tasks to save database space
- Optimize media storage: Compress images and documents before upload
- Archive inactive employees: Move completed onboarding data to cold storage
- Monitor resource usage: Use Klutch.sh monitoring to identify optimization opportunities
Example Deployment Repository
For a complete working example, reference this sample repository structure:
chiefonboarding-klutch/├── Dockerfile├── docker-entrypoint.sh├── supervisord.conf├── .dockerignore├── .gitignore├── .env.example└── README.mdDockerfile:
FROM chiefonboarding/chiefonboarding:v2.5.0
WORKDIR /app
RUN apt-get update && apt-get install -y supervisor curl && \ rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app/media /app/staticfiles
COPY docker-entrypoint.sh /app/docker-entrypoint.shCOPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN chmod +x /app/docker-entrypoint.sh
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8000/health/ || exit 1
ENTRYPOINT ["/app/docker-entrypoint.sh"]CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"].env.example:
# DjangoSECRET_KEY=change-me-to-a-long-random-string-min-50-charsDEBUG=FalseALLOWED_HOSTS=your-app-name.klutch.sh
# DatabaseDATABASE_ENGINE=django.db.backends.postgresqlDATABASE_HOST=postgres-host.klutch.shDATABASE_PORT=8000DATABASE_NAME=chiefonboardingDATABASE_USER=chiefonboarding_userDATABASE_PASSWORD=change-me
# RedisREDIS_URL=redis://redis-host:6379/0CELERY_BROKER_URL=redis://redis-host:6379/0CELERY_RESULT_BACKEND=redis://redis-host:6379/0
# EmailEMAIL_HOST=smtp.gmail.comEMAIL_PORT=587EMAIL_USE_TLS=TrueEMAIL_HOST_USER=your-email@gmail.comEMAIL_HOST_PASSWORD=your-app-passwordDEFAULT_FROM_EMAIL=noreply@yourdomain.com
# ApplicationSITE_URL=https://your-app-name.klutch.shBASE_URL=https://your-app-name.klutch.shTIME_ZONE=UTCCSRF_TRUSTED_ORIGINS=https://your-app-name.klutch.shREADME.md:
# ChiefOnboarding on Klutch.sh
Production-ready ChiefOnboarding deployment for employee onboarding automation.
## Quick Start
1. Clone this repository2. Copy `.env.example` to `.env` and configure3. Push to GitHub4. Deploy on Klutch.sh following the official guide
## Requirements
- PostgreSQL database- Redis instance- SMTP server for emails- (Optional) Slack workspace
## Support
See the full deployment guide at docs.klutch.shAdditional Resources
- Official ChiefOnboarding Documentation
- ChiefOnboarding GitHub Repository
- ChiefOnboarding Community
- Klutch.sh Quick Start Guide
- Klutch.sh Persistent Volumes
- Klutch.sh Deployments
- Klutch.sh Networking
Conclusion
Deploying ChiefOnboarding on Klutch.sh provides a powerful, scalable platform for automating employee onboarding without the complexity of managing infrastructure. With automatic Dockerfile detection, persistent storage, secure environment management, and production-ready configurations, you can focus on creating exceptional onboarding experiences for your new hires.
Whether you’re onboarding software engineers, sales representatives, or remote employees across multiple departments, ChiefOnboarding on Klutch.sh offers the reliability and flexibility you need. Start automating your employee onboarding today and create a seamless first impression that sets new hires up for success from day one.
For additional help or questions, reach out to the ChiefOnboarding community or Klutch.sh support.