- Deployment script for Coolify setup - Comprehensive deployment guide - SSH public key included - Updated .gitignore to exclude private key
9.2 KiB
Deployment Guide - AI Recruitment Site
✅ What's Been Completed
1. Project Setup
- ✅ Complete project structure created
- ✅ Git repository initialized and first commit made
- ✅ All code pushed to Gitea:
git@git.startanaicompany.com:mikael.westoo/ai-recruit-site-template.git
2. Application Built
- ✅ Backend API server with authentication
- ✅ PostgreSQL database schema and migrations
- ✅ Public website (6 pages: home, about, services, jobs, apply, contact)
- ✅ Admin dashboard (4 pages: login, dashboard, applicants, jobs)
- ✅ CV upload and storage system (PostgreSQL BYTEA)
- ✅ Docker + Docker Compose configuration
3. Coolify Setup
- ✅ Coolify project created: "RecruitAI" (UUID:
y8804s80goowsccwk8400kwo) - ✅ SSH deploy keys generated (stored in
./deploy_keyand./deploy_key.pub) - ✅ Deploy key added to Gitea repository
4. DNS Setup
- ✅ CNAME record created:
recruitai.startanaicompany.com
🔧 Manual Steps Required
The Coolify API doesn't support adding private keys programmatically. You need to complete the following steps via the Coolify web UI:
Step 1: Add Private Key to Coolify
-
Login to Coolify: https://app.coolify.io
-
Navigate to: Security → Private Keys
-
Click: "Add Private Key"
-
Fill in:
- Name:
recruitai-deploy-key - Description:
Deploy key for RecruitAI Gitea repository - Private Key: Copy the contents of
./deploy_keyfile
Get the private key:
cd /home/milko/projects/ryan/airecruit-site/ai-recruit-site-template cat ./deploy_key - Name:
-
Save the private key
-
Note down the UUID of the created private key (you'll see it in the URL or key list)
Step 2: Create Application in Coolify
-
Navigate to: Projects → RecruitAI → production environment
-
Click: "+ Add Resource" → "Public Repository (with deploy key)"
-
Fill in the form:
General:
- Name:
recruitai - Description:
AI Recruitment Site for Ryans Recruit Firm
Source:
- Git URL:
git@git.startanaicompany.com:mikael.westoo/ai-recruit-site-template - Branch:
master - Private Key: Select
recruitai-deploy-key(the one you just added)
Build:
- Build Pack:
Dockerfile - Dockerfile Location:
./Dockerfile(default) - Docker Compose Location: Leave empty (we're deploying the app container only)
Network:
- Port:
3000 - Domains:
http://recruitai.startanaicompany.com
Environment Variables (click "Add Environment Variable" for each):
DB_HOST=postgres DB_PORT=5432 DB_NAME=recruitment DB_USER=postgres DB_PASSWORD=your-secure-password-here SESSION_SECRET=your-very-secure-session-secret-here NODE_ENV=production PORT=3000IMPORTANT: Generate secure passwords for
DB_PASSWORDandSESSION_SECRET - Name:
-
Add PostgreSQL Database:
- In the same environment, click "+ Add Resource" → "PostgreSQL"
- Name:
recruitai-postgres - Database Name:
recruitment - Username:
postgres - Password: Use the same password as
DB_PASSWORDabove - Port:
5432 - Image:
postgres:15-alpine
-
Deploy: Click "Deploy" button
Step 3: Configure Webhook (Optional but Recommended)
The webhook has already been added to Gitea, but it's pointing to a null UUID. Update it:
- Get the Application UUID from Coolify (visible in the app URL or details page)
- Update Gitea webhook:
- Go to: https://git.startanaicompany.com/mikael.westoo/ai-recruit-site-template/settings/hooks
- Edit the webhook
- Update URL to:
https://app.coolify.io/api/v1/deploy?uuid=YOUR_APP_UUID - Save
🚀 Accessing the Site
Once deployed:
- Public Site: http://recruitai.startanaicompany.com
- Admin Login: http://recruitai.startanaicompany.com/admin/login
First Time Admin Setup
- Navigate to the admin login page
- On first visit, you'll see a prompt to create the first admin account
- Enter:
- Email: Your email address
- Password: A secure password
- Full Name: Your name
- Click "Create Admin Account"
📋 Database Migrations
Migrations will run automatically when the PostgreSQL container starts for the first time. They're located in /migrations/:
001_init_schema.sql- Creates all tables, indexes, and constraints002_seed_data.sql- Adds 5 sample job postings
🧪 Testing the Site
Public Pages
- Home page - http://recruitai.startanaicompany.com
- Jobs page - http://recruitai.startanaicompany.com/jobs
- Apply page - Click "Apply Now" on any job
- Test application submission:
- Fill in the form
- Upload a CV (PDF, DOC, or DOCX, max 5MB)
- Submit
Admin Panel
- Login at /admin/login
- Dashboard - View statistics
- Applications - See submitted applications
- Download CV - Test CV download functionality
- Jobs Management - Create, edit, activate/deactivate jobs
🔐 Security Checklist
- Session-based authentication implemented
- Passwords hashed with bcrypt
- SQL injection protection (parameterized queries)
- File upload validation (type and size)
- Change default DB_PASSWORD
- Change SESSION_SECRET
- Enable HTTPS (via Coolify or Cloudflare proxy)
- Review and test all endpoints
📁 Project Structure
ai-recruit-site-template/
├── server.js # Main Express server
├── package.json # Node.js dependencies
├── Dockerfile # Docker build configuration
├── docker-compose.yml # Local development setup
├── deploy.sh # Deployment script
├── deploy_key # SSH private key (DO NOT COMMIT)
├── deploy_key.pub # SSH public key
├── migrations/
│ ├── 001_init_schema.sql # Database schema
│ └── 002_seed_data.sql # Sample data
└── public/
├── index.html # Home page
├── about.html # About page
├── services.html # Services page
├── jobs.html # Job listings
├── apply.html # Application form
├── contact.html # Contact form
├── admin/
│ ├── login.html # Admin login
│ ├── dashboard.html # Admin dashboard
│ ├── applicants.html # Applications management
│ └── jobs.html # Jobs management
├── css/
│ └── styles.css # Ryan brand styles
└── js/
├── main.js # Public site JavaScript
└── admin.js # Admin panel JavaScript
🐛 Troubleshooting
Database Connection Errors
# Check if PostgreSQL is running
docker ps | grep postgres
# View PostgreSQL logs
docker logs recruitai-postgres
# Connect to database manually
docker exec -it recruitai-postgres psql -U postgres -d recruitment
Application Won't Start
# View application logs in Coolify dashboard
# Or check Docker logs
docker logs recruitai-app
# Common issues:
# 1. Database not ready - wait 30 seconds and redeploy
# 2. Environment variables missing - check Coolify settings
# 3. Port already in use - change PORT environment variable
CV Upload Fails
- Check file size (max 5MB)
- Check file type (PDF, DOC, DOCX only)
- Verify PostgreSQL has enough space
- Check application logs for errors
📊 Resource Details
Gitea Repository
- URL: https://git.startanaicompany.com/mikael.westoo/ai-recruit-site-template
- SSH: git@git.startanaicompany.com:mikael.westoo/ai-recruit-site-template.git
- Branch: master
Coolify
- Project: RecruitAI (
y8804s80goowsccwk8400kwo) - Environment: production (
a4g8gwwo48wkkck80og0g84k) - Server: h001 (
ngkwo8css8og0s00c4ows44o)
Cloudflare
- Zone ID:
e6ade38a28032c3542140a9cbf592838 - Domain: recruitai.startanaicompany.com
- DNS Record: CNAME pointing to Coolify FQDN
📞 Support
For issues or questions:
- Email: info@ryansrecruit.com
- Repository: https://git.startanaicompany.com/mikael.westoo/ai-recruit-site-template
✨ Features Summary
Public Features
- Professional recruitment website with Ryan brand design
- Job listings with search and filtering
- Online application form with CV upload (PDF/DOC/DOCX)
- Contact form
- Fully responsive (mobile, tablet, desktop)
Admin Features
- Secure authentication (first-time admin creation)
- Dashboard with statistics
- Application management
- View all applications
- Filter by status, job, or search
- Download CVs
- Update application status
- Add notes
- Job management
- Create/edit/delete jobs
- Activate/deactivate listings
- View all jobs (active and inactive)
Technical Features
- PostgreSQL database with proper indexes
- CV storage in BYTEA columns (efficient binary storage)
- Session-based authentication
- Docker containerization
- Auto-deployment via webhook
- Ryan brand colors and design system
Last Updated: 2026-01-23 Version: 1.0.0 Status: Ready for deployment (pending manual Coolify setup)