Skip to main content

The Project Tracker, Self-Hosting OpenProject

Reminders Wont Help...

Simple apps to schedule Tasks won't help much in tracking the exact pace of my SAT Prep or essays, Applications submitted to Universities, etc.

I decided to appear for the SAT. Tracking all of the parameters from my progress in SAT Prep to essays for universities that I apply to became too difficult on simple apps or on pen and paper. I decided to host OpenProject in my already setup docker stacks.

Then, I customized the OpenProject UI a bit, changed few colors (selected the best color palette from coolors.co), branded it as Planner and assigned it an internal DNS Name planner.atheesh.org

OpenProject is a web-based project management system for location-independent team collaboration.[2][3][4][5][6]

This free open-source application is released under the GNU (General Public License) Version 3 (GPLv3) and is available as a community edition and a chargeable Enterprise Edition. Development is mostly done by OpenProject GmbH.

Source: https://en.wikipedia.org/wiki/OpenProject

Is my OpenProject Data Backed Up?

Of course, all docker volumes and other non-docker self-hosted website data and databases are backed up using my central Auto Backup Service. Know more about it here.

Contributions to OpenProject

Pull Request Code Changes, Contributions

image.png

image.png

Screenshots

image.png

image.png

image.png

image.png

My Docker Compose File

version: "3.7"

networks:
  frontend:
  backend:

volumes:
  pgdata:
  opdata:

x-op-restart-policy: &restart_policy
  restart: unless-stopped
x-op-image: &image
  image: openproject/community:${TAG:-12}
x-op-app: &app
  <<: [*image, *restart_policy]
  environment:
    RAILS_CACHE_STORE: "memcache"
    OPENPROJECT_CACHE__MEMCACHE__SERVER: "cache:11211"
    OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"
    DATABASE_URL: "${DATABASE_URL:-postgres://*MASKED-FOR-SECURITY*:*MASKED-FOR-SECURITY*@db/openproject?pool=20&encoding=unicode&reconnect=true}"
    RAILS_MIN_THREADS: 4
    RAILS_MAX_THREADS: 16
    # set to true to enable the email receiving feature. See ./docker/cron for more options
    IMAP_ENABLED: "${IMAP_ENABLED:-false}"
  volumes:
    - "${OPDATA:-opdata}:/var/openproject/assets"

services:
  db:
    image: postgres:13
    <<: *restart_policy
    stop_grace_period: "3s"
    volumes:
      - "${PGDATA:-pgdata}:/var/lib/postgresql/data"
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:*MASKED-FOR-SECURITY*}
      POSTGRES_DB: openproject
    networks:
      - backend

  cache:
    image: memcached
    <<: *restart_policy
    networks:
      - backend

  proxy:
    <<: [*image, *restart_policy]
    command: "./docker/prod/proxy"
    ports:
      - "${PORT:-127.0.0.1:8005}:80"
    environment:
      APP_HOST: web
      OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"
    depends_on:
      - web
    networks:
      - frontend

  web:
    <<: *app
    command: "./docker/prod/web"
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - cache
      - seeder
    labels:
      - autoheal=true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}/health_checks/default"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 30s

  autoheal:
    image: willfarrell/autoheal:1.2.0
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      AUTOHEAL_CONTAINER_LABEL: autoheal

  worker:
    <<: *app
    command: "./docker/prod/worker"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder

  cron:
    <<: *app
    command: "./docker/prod/cron"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder

  seeder:
    <<: *app
    command: "./docker/prod/seeder"
    restart: on-failure
    networks:
      - backend