Files
KeepItGoingServer/PORTAINER_DEPLOYMENT.md
Keith SmithandClaude Sonnet 4.5 4e903b688d Fix duplicate user field in tasks migration
Remove duplicate AddField operation for tag.user field in
tasks/migrations/0002_initial.py. The migration was attempting
to add the user ForeignKey field twice, causing PostgreSQL to
fail with "column 'user_id' of relation 'tags' already exists".

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-26 17:01:59 -07:00

7.7 KiB

KeepItGoing Server - Portainer Stack Deployment Guide

Overview

This guide will walk you through deploying the KeepItGoing server to your Docker server using Portainer Stacks with Git repository integration.

Prerequisites

  • Portainer installed and accessible
  • Access to your Docker server via Portainer
  • Git repository: https://git.firebugit.com/Firebug_IT/KeepItGoingServer.git
  • Git credentials configured in Portainer (or repository is public)

Deployment Steps

Step 1: Access Portainer

  1. Log into your Portainer instance
  2. Select your Docker environment
  3. Navigate to Stacks in the left sidebar

Step 2: Create New Stack

  1. Click + Add stack button
  2. Enter stack name: keepitgoing

Step 3: Configure Git Repository

  1. Select Git Repository as the build method

  2. Fill in the following details:

    Repository URL:

    https://git.firebugit.com/Firebug_IT/KeepItGoingServer.git
    

    Repository reference: refs/heads/main

    Compose path: docker-compose.yml

    Authentication:

    • If repository is private, enable authentication
    • Username: keith@firebugit.com
    • Password: (your Git password)
    • Or use an access token if available

Step 4: Configure Environment Variables

Scroll down to the Environment variables section and paste the following:

# Django Core Settings
SECRET_KEY=Zfb$!,3Gm\b,x~:a)9@k*Gun.#F{ju3dH-G8aWp4R"&NQ{1x>14v#)EbhpB*XMWD
DEBUG=False
ALLOWED_HOSTS=keepitgoing.app,www.keepitgoing.app,localhost
CSRF_TRUSTED_ORIGINS=https://keepitgoing.app,https://www.keepitgoing.app
SITE_DOMAIN=keepitgoing.app

# Database Configuration
DB_NAME=keepitgoing
DB_USER=keepitgoing
DB_PASSWORD=6SWh6Pz01hBFGNzWM0Pszz2moluqxyv7
DB_ROOT_PASSWORD=l7xF4j20HxqE2ZGNDR2FIoCCYwb6tDMq
DB_HOST=mariadb
DB_PORT=3306

# Redis Configuration
REDIS_URL=redis://redis:6379/0

# Email Configuration (Dreamhost SMTP)
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.dreamhost.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=kig@keepitgoing.app
EMAIL_HOST_PASSWORD=Frankenmonster1!
DEFAULT_FROM_EMAIL=KeepItGoing <kig@keepitgoing.app>
SERVER_EMAIL=kig@keepitgoing.app

# Email Verification
EMAIL_VERIFICATION_TOKEN_EXPIRY_HOURS=24

# CORS Configuration
CORS_ALLOWED_ORIGINS=https://keepitgoing.app,https://www.keepitgoing.app

# SaaS Mode
SAAS_MODE=False

# Gunicorn Configuration
GUNICORN_WORKERS=3
GUNICORN_TIMEOUT=60

# Django Settings Module
DJANGO_SETTINGS_MODULE=config.settings.selfhosted

Step 5: Deploy the Stack

  1. Scroll to the bottom
  2. Click Deploy the stack
  3. Portainer will:
    • Clone the Git repository
    • Pull/build the Docker images
    • Start all 5 containers (mariadb, redis, web, celery-worker, celery-beat)

Step 6: Monitor Deployment

  1. Wait for the stack to deploy (2-5 minutes for first deployment)
  2. In Portainer, go to Stacks > keepitgoing
  3. Check the status of all containers:
    • keepitgoing-db (mariadb)
    • keepitgoing-redis
    • keepitgoing-web
    • keepitgoing-celery-worker
    • keepitgoing-celery-beat

Step 7: View Logs

Click on each container to view logs and ensure they started correctly:

Web container logs should show:

✓ MariaDB is ready!
Running database migrations...
✓ Migrations complete
Collecting static files...
✓ Static files collected
Starting Gunicorn WSGI server...

Step 8: Create Django Superuser

  1. In Portainer, navigate to Containers
  2. Click on keepitgoing-web container
  3. Click Console button
  4. Select Connect with /bin/bash shell
  5. Run the following command:
    python manage.py createsuperuser
    
  6. Follow the prompts to create your admin account

Step 9: Configure Nginx Proxy Manager

  1. Open your Nginx Proxy Manager

  2. Go to Hosts > Proxy Hosts

  3. Click Add Proxy Host

  4. Configure as follows:

    Details tab:

    • Domain Names: keepitgoing.app (and www.keepitgoing.app if needed)
    • Scheme: http
    • Forward Hostname/IP:
      • If NPM is on same Docker network: keepitgoing-web
      • If NPM is on same server but different network: localhost or server IP
      • Port: 8000
    • Cache Assets: (enabled)
    • Block Common Exploits: (enabled)
    • Websockets Support: (enabled)

    SSL tab:

    • SSL Certificate: Request a new SSL certificate
    • Force SSL: (enabled)
    • HTTP/2 Support: (enabled)
    • HSTS Enabled: (enabled)
  5. Save the proxy host

Step 10: Test the Deployment

  1. Visit https://keepitgoing.app/api/ - Should show API root
  2. Visit https://keepitgoing.app/admin/ - Should show Django admin login
  3. Log in with your superuser credentials
  4. Test user registration flow (requires email verification)

Post-Deployment

Updating the Stack

When you push new code to the Git repository:

  1. In Portainer, go to Stacks > keepitgoing
  2. Click ⚙️ Editor button
  3. Enable Pull latest image (if needed)
  4. Click ↻ Git pull and redeploy at the bottom
  5. Portainer will pull the latest code and redeploy

Or manually:

  1. Click ⬇️ Pull and redeploy button on the stack page

Viewing Logs

In Portainer:

  • Stacks > keepitgoing > Logs - View all container logs
  • Containers > Select container > Logs - View individual container logs

Managing Containers

All containers are visible in:

  • Stacks > keepitgoing - Stack overview
  • Containers - Individual container management

Database Backups

To backup the database:

  1. Go to Containers > keepitgoing-db
  2. Click Console
  3. Run:
    mysqldump -u root -p keepitgoing > /tmp/backup.sql
    
  4. Enter root password: l7xF4j20HxqE2ZGNDR2FIoCCYwb6tDMq
  5. Use File browser to download /tmp/backup.sql

Scaling

To scale the web service for more capacity:

  1. Stop the stack
  2. Edit docker-compose.yml in Git
  3. Add to web service:
    deploy:
      replicas: 3
    
  4. Push to Git and redeploy in Portainer

Troubleshooting

Container won't start

  1. Check logs in Portainer
  2. Verify environment variables are set correctly
  3. Ensure MariaDB and Redis are healthy before web/celery start

Database connection errors

  1. Check keepitgoing-db container is running
  2. Verify DB_PASSWORD matches in environment variables
  3. Check DATABASE_URL is correctly formatted

Can't access via domain

  1. Verify Nginx Proxy Manager configuration
  2. Check port 8000 is accessible from NPM
  3. Verify ALLOWED_HOSTS includes your domain
  4. Check firewall rules

Email not sending

  1. Verify SMTP credentials are correct
  2. Check Dreamhost allows SMTP from your server IP
  3. View web container logs for email errors

Security Notes

  • .env.docker is not in Git repository (contains secrets)
  • Environment variables are stored in Portainer (encrypted)
  • Database passwords are randomly generated
  • SSL/TLS enforced via Nginx Proxy Manager
  • DEBUG=False in production
  • All containers run as non-root users

Support

For issues or questions:

  • Check container logs in Portainer
  • Review README.md in the repository
  • Check Django admin for application-specific issues

Stack Information

Services:

  • web - Django/Gunicorn (port 8000)
  • mariadb - MariaDB 11.2 database
  • redis - Redis 7 cache/broker
  • celery-worker - Background task processor
  • celery-beat - Scheduled task scheduler

Volumes:

  • keepitgoing_db_data - Database persistence
  • keepitgoing_redis_data - Redis persistence
  • keepitgoing_static_files - Collected static files
  • ./media - User uploaded files (avatars)

Networks:

  • keepitgoing_frontend - External network (web service)
  • keepitgoing_backend - Internal network (database, redis)