diff --git a/.env.dokploy b/.env.dokploy new file mode 100644 index 0000000..e7ffc8c --- /dev/null +++ b/.env.dokploy @@ -0,0 +1,29 @@ +# Dokploy Environment Variables +# Use these values in your Dokploy environment variables section + +NODE_ENV=production +APP_PORT=3000 + +# Database (uses Docker volume) +DATABASE_URL=file:/app/data/production.db + +# Security - CHANGE THESE VALUES! +SESSION_SECRET=your-super-secure-session-secret-change-this-in-production-min-32-chars +SUPER_ADMIN=superadmin +SUPER_ADMIN_EMAIL=admin@yourcompany.com +SUPER_ADMIN_PASSWORD=YourSecurePassword123! + +# Domain (set to your actual domain) +DOMAIN=your-domain.com + +# Mail Settings (optional - for password reset features) +MAIL_HOST= +MAIL_PORT=587 +MAIL_SECURE=false +MAIL_USERNAME= +MAIL_PASSWORD= +MAIL_FROM_NAME=Phosphat Report System +MAIL_FROM_EMAIL= + +# Logging +LOG_LEVEL=info \ No newline at end of file diff --git a/DOKPLOY-DEPLOYMENT.md b/DOKPLOY-DEPLOYMENT.md new file mode 100644 index 0000000..e7a8aea --- /dev/null +++ b/DOKPLOY-DEPLOYMENT.md @@ -0,0 +1,174 @@ +# Dokploy Deployment Guide + +This guide will help you deploy the Phosphat Report application on Dokploy. + +## Step 1: Prepare Your Repository + +1. **Fix Git Issues** (if you encountered them): + ```bash + # Remove temporary Excel files + git rm --cached "public/~$16-6 Petra.xlsx" + + # Configure Git line endings for Windows + git config core.autocrlf true + + # Add and commit files + git add . + git commit -m "Initial commit for Dokploy deployment" + git push origin main + ``` + +## Step 2: Create Application in Dokploy + +1. **Login to your Dokploy dashboard** +2. **Click "Create Application"** +3. **Choose "Docker Compose"** +4. **Fill in the details**: + - **Name**: `phosphat-report` (or your preferred name) + - **Repository URL**: Your Git repository URL + - **Branch**: `main` + - **Build Path**: `/` (root directory) + +## Step 3: Configure Environment Variables + +In the Dokploy environment variables section, add these variables: + +### Required Variables +``` +NODE_ENV=production +SESSION_SECRET=your-super-secure-session-secret-change-this-min-32-chars +SUPER_ADMIN=superadmin +SUPER_ADMIN_EMAIL=admin@yourcompany.com +SUPER_ADMIN_PASSWORD=YourSecurePassword123! +``` + +### Optional Variables +``` +APP_PORT=3000 +DOMAIN=your-domain.com +MAIL_HOST=smtp.gmail.com +MAIL_PORT=587 +MAIL_SECURE=false +MAIL_USERNAME=your-email@gmail.com +MAIL_PASSWORD=your-app-password +MAIL_FROM_NAME=Phosphat Report System +MAIL_FROM_EMAIL=noreply@yourcompany.com +LOG_LEVEL=info +``` + +## Step 4: Deploy + +1. **Click "Deploy"** in Dokploy +2. **Monitor the build logs** for any errors +3. **Wait for deployment to complete** + +## Step 5: Access Your Application + +Once deployed, your application will be available at: +- **HTTP**: `http://your-server-ip:3000` +- **HTTPS**: `https://your-domain.com` (if domain is configured) + +## Troubleshooting + +### Common Issues + +1. **Volume Mount Errors**: + - The updated docker-compose.yml uses Docker volumes instead of bind mounts + - This should resolve the "no such file or directory" error + +2. **Build Failures**: + - Check the build logs in Dokploy + - Ensure all environment variables are set correctly + - Verify your repository is accessible + +3. **Database Issues**: + - The database will be created automatically on first run + - Check container logs if the application fails to start + +### Checking Logs + +In Dokploy: +1. Go to your application +2. Click on "Logs" tab +3. Select the container (app or backup) +4. View real-time logs + +### Health Check + +Once deployed, check if the application is healthy: +```bash +curl http://your-server-ip:3000/health +``` + +Should return: +```json +{ + "status": "ok", + "timestamp": "2025-07-24T10:30:00.000Z", + "uptime": 123.45, + "environment": "production", + "database": "connected" +} +``` + +## Database Management + +### Backup +The backup service runs automatically daily at 2 AM. To manually backup: + +1. **Access the container**: + ```bash + docker exec -it phosphat-report-app sh + ``` + +2. **Create backup**: + ```bash + cp /app/data/production.db /app/data/backup_$(date +%Y%m%d_%H%M%S).db + ``` + +### Restore +1. **Stop the application** in Dokploy +2. **Access the server** and restore the database file +3. **Restart the application** + +## Updates + +To update your application: + +1. **Push changes** to your Git repository +2. **Click "Redeploy"** in Dokploy +3. **Monitor the deployment** logs + +## Security Notes + +1. **Change default passwords** in environment variables +2. **Use strong session secret** (minimum 32 characters) +3. **Configure proper domain** and SSL +4. **Regular backups** are handled automatically +5. **Monitor application logs** regularly + +## Support + +If you encounter issues: + +1. **Check Dokploy logs** for build/runtime errors +2. **Verify environment variables** are set correctly +3. **Test health endpoint**: `/health` +4. **Check database connectivity** in logs +5. **Review Docker Compose configuration** + +## File Structure for Dokploy + +Your repository should have these key files: +``` +├── docker-compose.yml # Main compose file (Dokploy compatible) +├── docker-compose.dokploy.yml # Alternative compose file +├── Dockerfile # Application container +├── .dockerignore # Docker build exclusions +├── .env.dokploy # Environment template +├── app/ # Application code +├── prisma/ # Database schema +└── public/ # Static assets +``` + +The deployment is now optimized for Dokploy and should work without volume mounting issues. \ No newline at end of file diff --git a/docker-compose.dokploy.yml b/docker-compose.dokploy.yml new file mode 100644 index 0000000..499c6e2 --- /dev/null +++ b/docker-compose.dokploy.yml @@ -0,0 +1,76 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + args: + - NODE_ENV=production + image: phosphat-report:latest + container_name: phosphat-report-app + restart: unless-stopped + ports: + - "${APP_PORT:-3000}:3000" + environment: + - NODE_ENV=production + - PORT=3000 + - DATABASE_URL=file:/app/data/production.db + - SESSION_SECRET=${SESSION_SECRET} + - SUPER_ADMIN=${SUPER_ADMIN} + - SUPER_ADMIN_EMAIL=${SUPER_ADMIN_EMAIL} + - SUPER_ADMIN_PASSWORD=${SUPER_ADMIN_PASSWORD} + - MAIL_HOST=${MAIL_HOST:-} + - MAIL_PORT=${MAIL_PORT:-587} + - MAIL_SECURE=${MAIL_SECURE:-false} + - MAIL_USERNAME=${MAIL_USERNAME:-} + - MAIL_PASSWORD=${MAIL_PASSWORD:-} + - MAIL_FROM_NAME=${MAIL_FROM_NAME:-Phosphat Report System} + - MAIL_FROM_EMAIL=${MAIL_FROM_EMAIL:-} + volumes: + - app_data:/app/data + - app_logs:/app/logs + networks: + - app_network + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health", "||", "exit", "1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + deploy: + resources: + limits: + memory: 512M + cpus: '0.5' + reservations: + memory: 256M + cpus: '0.25' + + backup: + image: alpine:latest + container_name: phosphat-report-backup + restart: unless-stopped + volumes: + - app_data:/data:ro + - backup_data:/backup + command: > + sh -c " + apk add --no-cache dcron sqlite && + echo '0 2 * * * cp /data/production.db /backup/production_$(date +%Y%m%d_%H%M%S).db && find /backup -name \"production_*.db\" -mtime +7 -delete' | crontab - && + crond -f + " + networks: + - app_network + depends_on: + - app + +volumes: + app_data: + driver: local + app_logs: + driver: local + backup_data: + driver: local + +networks: + app_network: + driver: bridge \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 28f3cff..499c6e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: app: build: @@ -20,7 +18,6 @@ services: - SUPER_ADMIN=${SUPER_ADMIN} - SUPER_ADMIN_EMAIL=${SUPER_ADMIN_EMAIL} - SUPER_ADMIN_PASSWORD=${SUPER_ADMIN_PASSWORD} - # Mail settings (optional) - MAIL_HOST=${MAIL_HOST:-} - MAIL_PORT=${MAIL_PORT:-587} - MAIL_SECURE=${MAIL_SECURE:-false} @@ -47,16 +44,7 @@ services: reservations: memory: 256M cpus: '0.25' - labels: - - "com.docker.compose.service=phosphat-report" - - "com.docker.compose.project=phosphat-report" - - "traefik.enable=true" - - "traefik.http.routers.phosphat-report.rule=Host(`${DOMAIN:-localhost}`)" - - "traefik.http.routers.phosphat-report.tls=true" - - "traefik.http.routers.phosphat-report.tls.certresolver=letsencrypt" - - "traefik.http.services.phosphat-report.loadbalancer.server.port=3000" - # Database backup service (optional but recommended) backup: image: alpine:latest container_name: phosphat-report-backup @@ -64,12 +52,10 @@ services: volumes: - app_data:/data:ro - backup_data:/backup - environment: - - BACKUP_SCHEDULE=${BACKUP_SCHEDULE:-0 2 * * *} command: > sh -c " apk add --no-cache dcron sqlite && - echo '${BACKUP_SCHEDULE:-0 2 * * *} cp /data/production.db /backup/production_$(date +%Y%m%d_%H%M%S).db && find /backup -name \"production_*.db\" -mtime +7 -delete' | crontab - && + echo '0 2 * * * cp /data/production.db /backup/production_$(date +%Y%m%d_%H%M%S).db && find /backup -name \"production_*.db\" -mtime +7 -delete' | crontab - && crond -f " networks: @@ -80,18 +66,10 @@ services: volumes: app_data: driver: local - driver_opts: - type: none - o: bind - device: ${DATA_PATH:-./data} app_logs: driver: local backup_data: driver: local - driver_opts: - type: none - o: bind - device: ${BACKUP_PATH:-./backups} networks: app_network: