Skip to content

Instantly share code, notes, and snippets.

@markasoftware
Last active July 16, 2024 09:39
Show Gist options
  • Save markasoftware/f5b2e55a2c2e3abb1f9eefcdf0bfff45 to your computer and use it in GitHub Desktop.
Save markasoftware/f5b2e55a2c2e3abb1f9eefcdf0bfff45 to your computer and use it in GitHub Desktop.
OpenProject Enterprise mode for free
############ REPLACE app/models/enterprise_token.rb in the source code with this file! ################
############ also be sure to RESTART OpenProject after replacing the file. ################
############ it doesn't show that enterprise mode is enabled in the settings, but all ################
############ enterprise mode features, such as KanBan boards, are enabled. ################
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2023 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++
class EnterpriseToken < ApplicationRecord
class << self
def current
RequestStore.fetch(:current_ee_token) do
set_current_token
end
end
def table_exists?
connection.data_source_exists? table_name
end
def allows_to?(action)
true
end
def active?
true
end
def show_banners?
false
end
def set_current_token
token = EnterpriseToken.order(Arel.sql('created_at DESC')).first
if token&.token_object
token
end
end
end
validates :encoded_token, presence: true
validate :valid_token_object
validate :valid_domain
before_save :unset_current_token
before_destroy :unset_current_token
delegate :will_expire?,
:subscriber,
:mail,
:company,
:domain,
:issued_at,
:starts_at,
:expires_at,
:reprieve_days,
:reprieve_days_left,
:restrictions,
to: :token_object
def token_object
load_token! unless defined?(@token_object)
@token_object
end
def allows_to?(action)
true
end
def unset_current_token
# Clear current cache
RequestStore.delete :current_ee_token
end
def expired?(reprieve: true)
false
end
##
# The domain is only validated for tokens from version 2.0 onwards.
def invalid_domain?
false
end
private
def load_token!
@token_object = OpenProject::Token.import(encoded_token)
rescue OpenProject::Token::ImportError => e
Rails.logger.error "Failed to load EE token: #{e}"
nil
end
def valid_token_object
errors.add(:encoded_token, :unreadable) unless load_token!
end
def valid_domain
errors.add :domain, :invalid if invalid_domain?
end
end
@markasoftware
Copy link
Author

Ok great to hear! The reports of my demise have been greatly exaggerated 😆

@yud1z
Copy link

yud1z commented May 28, 2024

nice... it works

@mischu81
Copy link

Even with 14.1 ?

@yud1z
Copy link

yud1z commented May 28, 2024

Even with 14.1 ?

correct, i even put it in persistent volume in my dockerfile

@CC1119
Copy link

CC1119 commented May 28, 2024

@mischu81 and @yud1z it works on 14.1 w/ docker and DEB/RPM packages

@fortiblox
Copy link

Even with 14.1 ?

correct, i even put it in persistent volume in my dockerfile

you have a tldr on how to do it with docker or portainer?

@mischu81
Copy link

mischu81 commented Jun 8, 2024

For me it only works up to 14.0.2 on Docker. With 14.1 I have some problems that compose-web always crashes

@ados8
Copy link

ados8 commented Jul 12, 2024

I'm still on 12.4.1 since there's no new features I'm interested in.
They still haven't added a function to sort the wiki column, you have to add numbers to the title to sort them. 🤮

@perexwi
Copy link

perexwi commented Jul 13, 2024

For me it only works up to 14.0.2 on Docker. With 14.1 I have some problems that compose-web always crashes

What problems do you have?, I'm running the last version (14.2.1) with docker.

Here are my local docker-compose.yml file:

  • I'm running it in openproject.local
networks:
  frontend:
  backend:

volumes:
  pgdata:
  opdata:
  assets:

x-op-restart-policy: &restart_policy
  restart: unless-stopped
x-op-image: &image
  image: openproject/openproject:${TAG:-14-slim}
x-op-app: &app
  <<: [*image, *restart_policy]
  environment:
    OPENPROJECT_HTTPS: "${OPENPROJECT_HTTPS:-false}"
    OPENPROJECT_HOST__NAME: "${OPENPROJECT_HOST__NAME:-openproject.local:80}"
    OPENPROJECT_HSTS: "${OPENPROJECT_HSTS:-true}"
    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://postgres:p4ssw0rd@db/openproject?pool=20&encoding=unicode&reconnect=true}"
    RAILS_MIN_THREADS: ${RAILS_MIN_THREADS:-4}
    RAILS_MAX_THREADS: ${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:
    - "./enterprise_token.rb:/app/app/models/enterprise_token.rb:ro"

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

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

  proxy:
    image: caddy:2
    <<: *restart_policy
    command: "/usr/local/bin/proxy-entrypoint.sh"
    ports:
      - "${PORT:-3000}:80"
    environment:
      APP_HOST: web
    depends_on:
      - web
    networks:
      - frontend
    volumes:
      - ./Caddyfile.template:/etc/caddy/Caddyfile.template:ro
      - ./proxy-entrypoint.sh:/usr/local/bin/proxy-entrypoint.sh:ro
      - assets:/public:ro

  web:
    <<: *app
    command: "./docker/prod/web"
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - cache
      - seeder
    labels:
      - autoheal=true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://openproject.local:80${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}/health_checks/default"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 30s
    volumes:
      - "${OPDATA:-opdata}:/var/openproject/assets"
      - assets:/app/public
      - "./enterprise_token.rb:/app/app/models/enterprise_token.rb:ro"

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

  worker:
    <<: *app
    command: "./docker/prod/worker"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder
    volumes:
      - "${OPDATA:-opdata}:/var/openproject/assets"

  cron:
    <<: *app
    command: "./docker/prod/cron"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder
    volumes:
      - "${OPDATA:-opdata}:/var/openproject/assets"

  seeder:
    <<: *app
    command: "./docker/prod/seeder"
    restart: on-failure
    networks:
      - backend
    volumes:
      - "${OPDATA:-opdata}:/var/openproject/assets"

@mischu81
Copy link

mischu81 commented Jul 13, 2024

Thanks for your docker-compose.yaml file! You helped me a lot with that because I'm not a pro :). Mine is a bit different and https is enabled. I have tried various things. I think it finally worked again when I added the two lines under autoheal:
AUTOHEAL_START_PERIOD: 600
AUTOHEAL_INTERVAL: 30

This is my current file:

 networks:
  frontend:
  backend:

volumes:
  pgdata:
  opdata:
  assets:

x-op-restart-policy: &restart_policy
  restart: unless-stopped
x-op-image: &image
  image: openproject/openproject:14.2.1
x-op-app: &app
  <<: [*image, *restart_policy]
  environment:
    OPENPROJECT_HTTPS: "${OPENPROJECT_HTTPS:-true}"
    OPENPROJECT_HOST__NAME: "${OPENPROJECT_HOST__NAME:-localhost:80}"
    OPENPROJECT_HSTS: "${OPENPROJECT_HSTS:-true}"
    OPENPROJECT_EDITION: "bim"
    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://postgres:p4ssw0rd@db/openproject?pool=20&encoding=unicode&reconnect=true}"
    RAILS_MIN_THREADS: ${RAILS_MIN_THREADS:-4}
    RAILS_MAX_THREADS: ${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"
    - "./enterprise_token.rb:/app/app/models/enterprise_token.rb:ro"

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

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

  proxy:
    <<: [*image, *restart_policy]
    command: "./docker/prod/proxy"
    ports:
      - "${PORT:-8080}: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
      AUTOHEAL_START_PERIOD: 600
      AUTOHEAL_INTERVAL: 30

  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 ```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment