Redmine is a flexible project management and issue tracking web application.
Purpose: Project management and issue tracking Version: 6.0 Port: 3000 (application), 443 (nginx-tls) Database: External PostgreSQL Access: VPN-only via HTTPS Authentication: Redmine internal + LDAP (optional)
- Issue Tracking - Bugs, features, tasks
- Project Management - Multiple projects, milestones
- Wiki - Documentation and knowledge base
- Time Tracking - Log work hours
- Gantt Charts - Project timelines
- Version Control Integration - Git, SVN
- Custom Fields - Extensible data model
- Plugins - Rich ecosystem
βββββββββββββββββββββββββββββββββββββββ
β Redmine Pod β
βββββββββββββββββββββββββββββββββββββββ€
β ββββββββββββ ββββββββββββββββββββ β
β β nginx- βββΆβ Redmine β β
β β tls β β (port 3000) β β
β β (443) β ββββββββββββββββββββ β
β ββββββββββββ β β
β βΌ β
β ββββββββββββββββββ β
β β PostgreSQL β β
β β (external) β β
β ββββββββββββββββββ β
β β
β ββββββββββββ β
β βTailscale β VPN connectivity β
β ββββββββββββ (optional) β
βββββββββββββββββββββββββββββββββββββββ
# terraform.tfvars
redmine_enabled = true
redmine_image = "redmine:6.0"
redmine_hostname = "redmine.example.com"
redmine_tailscale_enabled = false # Optional VPN
# Database configuration
redmine_db_host = "postgres.external.com"
redmine_db_port = 22110
redmine_db_name = "redmine"
redmine_db_user = "redmine"
redmine_db_password = "secure-password"# .env
REDMINE_DB_HOST="postgres.external.com"
REDMINE_DB_PORT="22110"
REDMINE_DB_NAME="redmine"
REDMINE_DB_USER="redmine_user"
REDMINE_DB_PASSWORD="your-secure-password"redmine_cpu_request = "500m"
redmine_memory_request = "1Gi"
redmine_cpu_limit = "2"
redmine_memory_limit = "2Gi"Redmine requires an external PostgreSQL database:
- Create database:
CREATE DATABASE redmine CHARACTER SET utf8mb4;
CREATE USER redmine WITH PASSWORD 'secure-password';
GRANT ALL PRIVILEGES ON DATABASE redmine TO redmine;- Configure in terraform.tfvars:
redmine_db_host = "your-postgres-host"
redmine_db_port = 5432
redmine_db_name = "redmine"
redmine_db_user = "redmine"
redmine_db_password = "secure-password"python scripts/redmine/test_connection.py# Via VPN (if tailscale enabled) or direct
open https://redmine.example.comDefault admin account:
- Username:
admin - Password:
admin
Important: Change admin password immediately!
- Login with default credentials
- Click "My account" (top right)
- Change password
- Update email address
# Create timestamped backup
python scripts/redmine/backup_restore_db.py backup
# Output: backups/redmine_backup_YYYYMMDD_HHMMSS.sql# Restore from backup file
python scripts/redmine/backup_restore_db.py restore \
--file backups/redmine_backup_20241110_143000.sql# Redmine application logs
kubectl logs -n dev redmine-0 -c redmine -f
# Database query logs
kubectl logs -n dev redmine-0 -c redmine | grep -i "sql"# Copy plugin to pod
kubectl cp ./redmine_plugin dev/redmine-0:/usr/src/redmine/plugins/ -c redmine
# Run migrations
kubectl exec -n dev redmine-0 -c redmine -- \
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
# Restart Redmine
kubectl delete pod redmine-0 -n dev# Update image version in terraform.tfvars
redmine_image = "redmine:6.1"
# Apply changes
terraform apply
# Run database migrations (if needed)
kubectl exec -n dev redmine-0 -c redmine -- \
bundle exec rake db:migrate RAILS_ENV=production- Admin β Projects β New Project
- Fill in details:
- Name: Project name
- Identifier: URL-safe identifier
- Public: Visibility setting
- Enable modules (Issues, Wiki, etc.)
- Save
- Admin β Users β New user
- Fill in user details
- Add to project:
- Project β Settings β Members
- Add user with role
- Admin β Workflow
- Configure statuses and transitions
- Set permissions per role
# Test database connectivity
python scripts/redmine/test_connection.py
# Check from pod
kubectl exec -n dev redmine-0 -c redmine -- \
nc -zv postgres.external.com 22110
# Check database credentials
kubectl get secret redmine-db -n dev -o yaml# Check pod status
kubectl describe pod redmine-0 -n dev
# View logs
kubectl logs -n dev redmine-0 -c redmine
# Common issues:
# - Database not accessible
# - Missing database migrations
# - Insufficient resources# Check logs for stack trace
kubectl logs -n dev redmine-0 -c redmine | tail -100
# Common causes:
# - Database connection lost
# - Plugin incompatibility
# - Missing assets (run: bundle exec rake assets:precompile)# Check resource usage
kubectl top pod redmine-0 -n dev
# Increase resources:
redmine_cpu_limit = "4"
redmine_memory_limit = "4Gi"
# Optimize database
# Run VACUUM ANALYZE on PostgreSQL
# Enable caching in config/additional_environment.rb:
config.cache_store = :mem_cache_store- Admin β LDAP authentication
- New authentication mode
- Configure FreeIPA:
- Name: FreeIPA
- Host: freeipa.dev.svc.cluster.local
- Port: 636
- LDAPS: Yes
- Base DN:
cn=users,cn=accounts,dc=dev,dc=svc,dc=cluster,dc=local - Login attribute: uid
- Filter: (objectClass=person)
- Try logging in with FreeIPA user
- Redmine creates account on first login
- Admin can assign roles
Create cron job for regular backups:
# Daily backup at 2 AM
0 2 * * * cd /path/to/charon && python scripts/redmine/backup_restore_db.py backupKeep backups for:
- Daily: 7 days
- Weekly: 4 weeks
- Monthly: 12 months
- Restore database from backup
- Restore file attachments (if using file storage)
- Verify data integrity
- Test critical workflows
- Database credentials stored as Kubernetes secrets
- VPN-only access (if Tailscale enabled)
- IP allowlisting (100.64.0.0/10)
- TLS certificates via cert-manager
- Regular security updates
- LDAPS for LDAP authentication
-- Add indexes for frequently queried columns
CREATE INDEX idx_issues_assigned_to ON issues(assigned_to_id);
CREATE INDEX idx_issues_status ON issues(status_id);Enable caching in config/additional_environment.rb:
config.cache_store = :mem_cache_store
config.action_controller.perform_caching = trueFor large teams (50+ users):
redmine_cpu_limit = "4"
redmine_memory_limit = "4Gi"Navigation: Documentation Index | Home