Dokploy

Huly

Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)

Huly logo

Configuration

name: ${DOCKER_NAME}
version: "3"
services:
  nginx:

    image: "nginx:1.21.3"
    ports:
      - 80
    volumes:
      - ../files/volumes/nginx/.huly.nginx:/etc/nginx/conf.d/default.conf
    restart: unless-stopped

  mongodb:

    image: "mongo:7-jammy"
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - db:/data/db
    restart: unless-stopped

  minio:

    image: "minio/minio:RELEASE.2024-11-07T00-52-20Z"
    command: server /data --address ":9000" --console-address ":9001"
    volumes:
      - files:/data
    restart: unless-stopped

  elastic:

    image: "elasticsearch:7.14.2"
    command: |
      /bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment;
      /usr/local/bin/docker-entrypoint.sh eswrapper"
    volumes:
      - elastic:/usr/share/elasticsearch/data
    environment:
      - ELASTICSEARCH_PORT_NUMBER=9200
      - BITNAMI_DEBUG=true
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1024m -Xmx1024m
      - http.cors.enabled=true
      - http.cors.allow-origin=http://localhost:8082
    healthcheck:
      interval: 20s
      retries: 10
      test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
    restart: unless-stopped

  rekoni:

    image: hardcoreeng/rekoni-service:${HULY_VERSION}
    environment:
      - SECRET=${SECRET}
    deploy:
      resources:
        limits:
          memory: 500M
    restart: unless-stopped

  transactor:

    image: hardcoreeng/transactor:${HULY_VERSION}
    environment:
      - SERVER_PORT=3333
      - SERVER_SECRET=${SECRET}
      - SERVER_CURSOR_MAXTIMEMS=30000
      - DB_URL=mongodb://mongodb:27017
      - MONGO_URL=mongodb://mongodb:27017
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
      - FRONT_URL=http://localhost:8087
      - ACCOUNTS_URL=http://account:3000
      - FULLTEXT_URL=http://fulltext:4700
      - STATS_URL=http://stats:4900
      - LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
    restart: unless-stopped

  collaborator:

    image: hardcoreeng/collaborator:${HULY_VERSION}
    environment:
      - COLLABORATOR_PORT=3078
      - SECRET=${SECRET}
      - ACCOUNTS_URL=http://account:3000
      - DB_URL=mongodb://mongodb:27017
      - STATS_URL=http://stats:4900
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
    restart: unless-stopped

  account:

    image: hardcoreeng/account:${HULY_VERSION}
    environment:
      - SERVER_PORT=3000
      - SERVER_SECRET=${SECRET}
      - DB_URL=mongodb://mongodb:27017
      - MONGO_URL=mongodb://mongodb:27017
      - TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
      - FRONT_URL=http://front:8080
      - STATS_URL=http://stats:4900
      - MODEL_ENABLED=*
      - ACCOUNTS_URL=http://localhost:3000
      - ACCOUNT_PORT=3000
    restart: unless-stopped

  workspace:

    image: hardcoreeng/workspace:${HULY_VERSION}
    environment:
      - SERVER_SECRET=${SECRET}
      - DB_URL=mongodb://mongodb:27017
      - MONGO_URL=mongodb://mongodb:27017
      - TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
      - MODEL_ENABLED=*
      - ACCOUNTS_URL=http://account:3000
      - STATS_URL=http://stats:4900
    restart: unless-stopped

  front:

    image: hardcoreeng/front:${HULY_VERSION}
    environment:
      - SERVER_PORT=8080
      - SERVER_SECRET=${SECRET}
      - LOVE_ENDPOINT=http${SECURE:+s}://${HOST_ADDRESS}/_love
      - ACCOUNTS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_accounts
      - REKONI_URL=http${SECURE:+s}://${HOST_ADDRESS}/_rekoni
      - CALENDAR_URL=http${SECURE:+s}://${HOST_ADDRESS}/_calendar
      - GMAIL_URL=http${SECURE:+s}://${HOST_ADDRESS}/_gmail
      - TELEGRAM_URL=http${SECURE:+s}://${HOST_ADDRESS}/_telegram
      - STATS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_stats
      - UPLOAD_URL=/files
      - ELASTIC_URL=http://elastic:9200
      - COLLABORATOR_URL=ws${SECURE:+s}://${HOST_ADDRESS}/_collaborator
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
      - DB_URL=mongodb://mongodb:27017
      - MONGO_URL=mongodb://mongodb:27017
      - TITLE=${TITLE:-Huly Self Host}
      - DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-en}
      - LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
      - DESKTOP_UPDATES_CHANNEL=selfhost
    restart: unless-stopped

  fulltext:

    image: hardcoreeng/fulltext:${HULY_VERSION}
    environment:
      - SERVER_SECRET=${SECRET}
      - DB_URL=mongodb://mongodb:27017
      - FULLTEXT_DB_URL=http://elastic:9200
      - ELASTIC_INDEX_NAME=huly_storage_index
      - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
      - REKONI_URL=http://rekoni:4004
      - ACCOUNTS_URL=http://account:3000
      - STATS_URL=http://stats:4900
    restart: unless-stopped

  stats:

    image: hardcoreeng/stats:${HULY_VERSION}
    environment:
      - PORT=4900
      - SERVER_SECRET=${SECRET}
    restart: unless-stopped
volumes:
  db:
  elastic:
  files:
[variables]
main_domain = "${domain}"
huly_secret = "${base64:64}"

[config]
env = [
  "HULY_VERSION=v0.6.468",
  "DOCKER_NAME=huly",
  "HOST_ADDRESS=${main_domain}",
  "SECURE=",
  "HTTP_PORT=80",
  "HTTP_BIND=",
  "TITLE=Huly",
  "DEFAULT_LANGUAGE=en",
  "LAST_NAME_FIRST=true",
  "SECRET=${huly_secret}",
]

[[config.domains]]
serviceName = "nginx"
port = 80
host = "${main_domain}"

[[config.mounts]]
filePath = "/volumes/nginx/.huly.nginx"
content = """
server {
    listen 80;
    server_name _;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://front:8080;
    }

    location /_accounts {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        rewrite ^/_accounts(/.*)$ $1 break;
        proxy_pass http://account:3000/;
    }

    location /_collaborator {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        rewrite ^/_collaborator(/.*)$ $1 break;
        proxy_pass http://collaborator:3078/;
    }

    location /_transactor {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        rewrite ^/_transactor(/.*)$ $1 break;
        proxy_pass http://transactor:3333/;
    }

    location ~ ^/eyJ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://transactor:3333;
    }

    location /_rekoni {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        rewrite ^/_rekoni(/.*)$ $1 break;
        proxy_pass http://rekoni:4004/;
    }

    location /_stats {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        rewrite ^/_stats(/.*)$ $1 break;
        proxy_pass http://stats:4900/;
    }
}
"""

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogIm5hbWU6ICR7RE9DS0VSX05BTUV9XG52ZXJzaW9uOiBcIjNcIlxuc2VydmljZXM6XG4gIG5naW54OlxuXG4gICAgaW1hZ2U6IFwibmdpbng6MS4yMS4zXCJcbiAgICBwb3J0czpcbiAgICAgIC0gODBcbiAgICB2b2x1bWVzOlxuICAgICAgLSAuLi9maWxlcy92b2x1bWVzL25naW54Ly5odWx5Lm5naW54Oi9ldGMvbmdpbngvY29uZi5kL2RlZmF1bHQuY29uZlxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgbW9uZ29kYjpcblxuICAgIGltYWdlOiBcIm1vbmdvOjctamFtbXlcIlxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBQVUlEPTEwMDBcbiAgICAgIC0gUEdJRD0xMDAwXG4gICAgdm9sdW1lczpcbiAgICAgIC0gZGI6L2RhdGEvZGJcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG4gIG1pbmlvOlxuXG4gICAgaW1hZ2U6IFwibWluaW8vbWluaW86UkVMRUFTRS4yMDI0LTExLTA3VDAwLTUyLTIwWlwiXG4gICAgY29tbWFuZDogc2VydmVyIC9kYXRhIC0tYWRkcmVzcyBcIjo5MDAwXCIgLS1jb25zb2xlLWFkZHJlc3MgXCI6OTAwMVwiXG4gICAgdm9sdW1lczpcbiAgICAgIC0gZmlsZXM6L2RhdGFcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG4gIGVsYXN0aWM6XG5cbiAgICBpbWFnZTogXCJlbGFzdGljc2VhcmNoOjcuMTQuMlwiXG4gICAgY29tbWFuZDogfFxuICAgICAgL2Jpbi9zaCAtYyBcIi4vYmluL2VsYXN0aWNzZWFyY2gtcGx1Z2luIGxpc3QgfCBncmVwIC1xIGluZ2VzdC1hdHRhY2htZW50IHx8IHllcyB8IC4vYmluL2VsYXN0aWNzZWFyY2gtcGx1Z2luIGluc3RhbGwgLS1zaWxlbnQgaW5nZXN0LWF0dGFjaG1lbnQ7XG4gICAgICAvdXNyL2xvY2FsL2Jpbi9kb2NrZXItZW50cnlwb2ludC5zaCBlc3dyYXBwZXJcIlxuICAgIHZvbHVtZXM6XG4gICAgICAtIGVsYXN0aWM6L3Vzci9zaGFyZS9lbGFzdGljc2VhcmNoL2RhdGFcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gRUxBU1RJQ1NFQVJDSF9QT1JUX05VTUJFUj05MjAwXG4gICAgICAtIEJJVE5BTUlfREVCVUc9dHJ1ZVxuICAgICAgLSBkaXNjb3ZlcnkudHlwZT1zaW5nbGUtbm9kZVxuICAgICAgLSBFU19KQVZBX09QVFM9LVhtczEwMjRtIC1YbXgxMDI0bVxuICAgICAgLSBodHRwLmNvcnMuZW5hYmxlZD10cnVlXG4gICAgICAtIGh0dHAuY29ycy5hbGxvdy1vcmlnaW49aHR0cDovL2xvY2FsaG9zdDo4MDgyXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICBpbnRlcnZhbDogMjBzXG4gICAgICByZXRyaWVzOiAxMFxuICAgICAgdGVzdDogY3VybCAtcyBodHRwOi8vbG9jYWxob3N0OjkyMDAvX2NsdXN0ZXIvaGVhbHRoIHwgZ3JlcCAtdnEgJ1wic3RhdHVzXCI6XCJyZWRcIidcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG4gIHJla29uaTpcblxuICAgIGltYWdlOiBoYXJkY29yZWVuZy9yZWtvbmktc2VydmljZToke0hVTFlfVkVSU0lPTn1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gU0VDUkVUPSR7U0VDUkVUfVxuICAgIGRlcGxveTpcbiAgICAgIHJlc291cmNlczpcbiAgICAgICAgbGltaXRzOlxuICAgICAgICAgIG1lbW9yeTogNTAwTVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgdHJhbnNhY3RvcjpcblxuICAgIGltYWdlOiBoYXJkY29yZWVuZy90cmFuc2FjdG9yOiR7SFVMWV9WRVJTSU9OfVxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBTRVJWRVJfUE9SVD0zMzMzXG4gICAgICAtIFNFUlZFUl9TRUNSRVQ9JHtTRUNSRVR9XG4gICAgICAtIFNFUlZFUl9DVVJTT1JfTUFYVElNRU1TPTMwMDAwXG4gICAgICAtIERCX1VSTD1tb25nb2RiOi8vbW9uZ29kYjoyNzAxN1xuICAgICAgLSBNT05HT19VUkw9bW9uZ29kYjovL21vbmdvZGI6MjcwMTdcbiAgICAgIC0gU1RPUkFHRV9DT05GSUc9bWluaW98bWluaW8/YWNjZXNzS2V5PW1pbmlvYWRtaW4mc2VjcmV0S2V5PW1pbmlvYWRtaW5cbiAgICAgIC0gRlJPTlRfVVJMPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4N1xuICAgICAgLSBBQ0NPVU5UU19VUkw9aHR0cDovL2FjY291bnQ6MzAwMFxuICAgICAgLSBGVUxMVEVYVF9VUkw9aHR0cDovL2Z1bGx0ZXh0OjQ3MDBcbiAgICAgIC0gU1RBVFNfVVJMPWh0dHA6Ly9zdGF0czo0OTAwXG4gICAgICAtIExBU1RfTkFNRV9GSVJTVD0ke0xBU1RfTkFNRV9GSVJTVDotdHJ1ZX1cbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG4gIGNvbGxhYm9yYXRvcjpcblxuICAgIGltYWdlOiBoYXJkY29yZWVuZy9jb2xsYWJvcmF0b3I6JHtIVUxZX1ZFUlNJT059XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIENPTExBQk9SQVRPUl9QT1JUPTMwNzhcbiAgICAgIC0gU0VDUkVUPSR7U0VDUkVUfVxuICAgICAgLSBBQ0NPVU5UU19VUkw9aHR0cDovL2FjY291bnQ6MzAwMFxuICAgICAgLSBEQl9VUkw9bW9uZ29kYjovL21vbmdvZGI6MjcwMTdcbiAgICAgIC0gU1RBVFNfVVJMPWh0dHA6Ly9zdGF0czo0OTAwXG4gICAgICAtIFNUT1JBR0VfQ09ORklHPW1pbmlvfG1pbmlvP2FjY2Vzc0tleT1taW5pb2FkbWluJnNlY3JldEtleT1taW5pb2FkbWluXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcblxuICBhY2NvdW50OlxuXG4gICAgaW1hZ2U6IGhhcmRjb3JlZW5nL2FjY291bnQ6JHtIVUxZX1ZFUlNJT059XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIFNFUlZFUl9QT1JUPTMwMDBcbiAgICAgIC0gU0VSVkVSX1NFQ1JFVD0ke1NFQ1JFVH1cbiAgICAgIC0gREJfVVJMPW1vbmdvZGI6Ly9tb25nb2RiOjI3MDE3XG4gICAgICAtIE1PTkdPX1VSTD1tb25nb2RiOi8vbW9uZ29kYjoyNzAxN1xuICAgICAgLSBUUkFOU0FDVE9SX1VSTD13czovL3RyYW5zYWN0b3I6MzMzMzt3cyR7U0VDVVJFOitzfTovLyR7SE9TVF9BRERSRVNTfS9fdHJhbnNhY3RvclxuICAgICAgLSBTVE9SQUdFX0NPTkZJRz1taW5pb3xtaW5pbz9hY2Nlc3NLZXk9bWluaW9hZG1pbiZzZWNyZXRLZXk9bWluaW9hZG1pblxuICAgICAgLSBGUk9OVF9VUkw9aHR0cDovL2Zyb250OjgwODBcbiAgICAgIC0gU1RBVFNfVVJMPWh0dHA6Ly9zdGF0czo0OTAwXG4gICAgICAtIE1PREVMX0VOQUJMRUQ9KlxuICAgICAgLSBBQ0NPVU5UU19VUkw9aHR0cDovL2xvY2FsaG9zdDozMDAwXG4gICAgICAtIEFDQ09VTlRfUE9SVD0zMDAwXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcblxuICB3b3Jrc3BhY2U6XG5cbiAgICBpbWFnZTogaGFyZGNvcmVlbmcvd29ya3NwYWNlOiR7SFVMWV9WRVJTSU9OfVxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBTRVJWRVJfU0VDUkVUPSR7U0VDUkVUfVxuICAgICAgLSBEQl9VUkw9bW9uZ29kYjovL21vbmdvZGI6MjcwMTdcbiAgICAgIC0gTU9OR09fVVJMPW1vbmdvZGI6Ly9tb25nb2RiOjI3MDE3XG4gICAgICAtIFRSQU5TQUNUT1JfVVJMPXdzOi8vdHJhbnNhY3RvcjozMzMzO3dzJHtTRUNVUkU6K3N9Oi8vJHtIT1NUX0FERFJFU1N9L190cmFuc2FjdG9yXG4gICAgICAtIFNUT1JBR0VfQ09ORklHPW1pbmlvfG1pbmlvP2FjY2Vzc0tleT1taW5pb2FkbWluJnNlY3JldEtleT1taW5pb2FkbWluXG4gICAgICAtIE1PREVMX0VOQUJMRUQ9KlxuICAgICAgLSBBQ0NPVU5UU19VUkw9aHR0cDovL2FjY291bnQ6MzAwMFxuICAgICAgLSBTVEFUU19VUkw9aHR0cDovL3N0YXRzOjQ5MDBcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG4gIGZyb250OlxuXG4gICAgaW1hZ2U6IGhhcmRjb3JlZW5nL2Zyb250OiR7SFVMWV9WRVJTSU9OfVxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBTRVJWRVJfUE9SVD04MDgwXG4gICAgICAtIFNFUlZFUl9TRUNSRVQ9JHtTRUNSRVR9XG4gICAgICAtIExPVkVfRU5EUE9JTlQ9aHR0cCR7U0VDVVJFOitzfTovLyR7SE9TVF9BRERSRVNTfS9fbG92ZVxuICAgICAgLSBBQ0NPVU5UU19VUkw9aHR0cCR7U0VDVVJFOitzfTovLyR7SE9TVF9BRERSRVNTfS9fYWNjb3VudHNcbiAgICAgIC0gUkVLT05JX1VSTD1odHRwJHtTRUNVUkU6K3N9Oi8vJHtIT1NUX0FERFJFU1N9L19yZWtvbmlcbiAgICAgIC0gQ0FMRU5EQVJfVVJMPWh0dHAke1NFQ1VSRTorc306Ly8ke0hPU1RfQUREUkVTU30vX2NhbGVuZGFyXG4gICAgICAtIEdNQUlMX1VSTD1odHRwJHtTRUNVUkU6K3N9Oi8vJHtIT1NUX0FERFJFU1N9L19nbWFpbFxuICAgICAgLSBURUxFR1JBTV9VUkw9aHR0cCR7U0VDVVJFOitzfTovLyR7SE9TVF9BRERSRVNTfS9fdGVsZWdyYW1cbiAgICAgIC0gU1RBVFNfVVJMPWh0dHAke1NFQ1VSRTorc306Ly8ke0hPU1RfQUREUkVTU30vX3N0YXRzXG4gICAgICAtIFVQTE9BRF9VUkw9L2ZpbGVzXG4gICAgICAtIEVMQVNUSUNfVVJMPWh0dHA6Ly9lbGFzdGljOjkyMDBcbiAgICAgIC0gQ09MTEFCT1JBVE9SX1VSTD13cyR7U0VDVVJFOitzfTovLyR7SE9TVF9BRERSRVNTfS9fY29sbGFib3JhdG9yXG4gICAgICAtIFNUT1JBR0VfQ09ORklHPW1pbmlvfG1pbmlvP2FjY2Vzc0tleT1taW5pb2FkbWluJnNlY3JldEtleT1taW5pb2FkbWluXG4gICAgICAtIERCX1VSTD1tb25nb2RiOi8vbW9uZ29kYjoyNzAxN1xuICAgICAgLSBNT05HT19VUkw9bW9uZ29kYjovL21vbmdvZGI6MjcwMTdcbiAgICAgIC0gVElUTEU9JHtUSVRMRTotSHVseSBTZWxmIEhvc3R9XG4gICAgICAtIERFRkFVTFRfTEFOR1VBR0U9JHtERUZBVUxUX0xBTkdVQUdFOi1lbn1cbiAgICAgIC0gTEFTVF9OQU1FX0ZJUlNUPSR7TEFTVF9OQU1FX0ZJUlNUOi10cnVlfVxuICAgICAgLSBERVNLVE9QX1VQREFURVNfQ0hBTk5FTD1zZWxmaG9zdFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgZnVsbHRleHQ6XG5cbiAgICBpbWFnZTogaGFyZGNvcmVlbmcvZnVsbHRleHQ6JHtIVUxZX1ZFUlNJT059XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIFNFUlZFUl9TRUNSRVQ9JHtTRUNSRVR9XG4gICAgICAtIERCX1VSTD1tb25nb2RiOi8vbW9uZ29kYjoyNzAxN1xuICAgICAgLSBGVUxMVEVYVF9EQl9VUkw9aHR0cDovL2VsYXN0aWM6OTIwMFxuICAgICAgLSBFTEFTVElDX0lOREVYX05BTUU9aHVseV9zdG9yYWdlX2luZGV4XG4gICAgICAtIFNUT1JBR0VfQ09ORklHPW1pbmlvfG1pbmlvP2FjY2Vzc0tleT1taW5pb2FkbWluJnNlY3JldEtleT1taW5pb2FkbWluXG4gICAgICAtIFJFS09OSV9VUkw9aHR0cDovL3Jla29uaTo0MDA0XG4gICAgICAtIEFDQ09VTlRTX1VSTD1odHRwOi8vYWNjb3VudDozMDAwXG4gICAgICAtIFNUQVRTX1VSTD1odHRwOi8vc3RhdHM6NDkwMFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgc3RhdHM6XG5cbiAgICBpbWFnZTogaGFyZGNvcmVlbmcvc3RhdHM6JHtIVUxZX1ZFUlNJT059XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIFBPUlQ9NDkwMFxuICAgICAgLSBTRVJWRVJfU0VDUkVUPSR7U0VDUkVUfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG52b2x1bWVzOlxuICBkYjpcbiAgZWxhc3RpYzpcbiAgZmlsZXM6XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuaHVseV9zZWNyZXQgPSBcIiR7YmFzZTY0OjY0fVwiXG5cbltjb25maWddXG5lbnYgPSBbXG4gIFwiSFVMWV9WRVJTSU9OPXYwLjYuNDY4XCIsXG4gIFwiRE9DS0VSX05BTUU9aHVseVwiLFxuICBcIkhPU1RfQUREUkVTUz0ke21haW5fZG9tYWlufVwiLFxuICBcIlNFQ1VSRT1cIixcbiAgXCJIVFRQX1BPUlQ9ODBcIixcbiAgXCJIVFRQX0JJTkQ9XCIsXG4gIFwiVElUTEU9SHVseVwiLFxuICBcIkRFRkFVTFRfTEFOR1VBR0U9ZW5cIixcbiAgXCJMQVNUX05BTUVfRklSU1Q9dHJ1ZVwiLFxuICBcIlNFQ1JFVD0ke2h1bHlfc2VjcmV0fVwiLFxuXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJuZ2lueFwiXG5wb3J0ID0gODBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcblxuW1tjb25maWcubW91bnRzXV1cbmZpbGVQYXRoID0gXCIvdm9sdW1lcy9uZ2lueC8uaHVseS5uZ2lueFwiXG5jb250ZW50ID0gXCJcIlwiXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBzZXJ2ZXJfbmFtZSBfO1xuICAgIGxvY2F0aW9uIC8ge1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1SZWFsLUlQICRyZW1vdGVfYWRkcjtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Gb3IgJHByb3h5X2FkZF94X2ZvcndhcmRlZF9mb3I7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gJHNjaGVtZTtcbiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vZnJvbnQ6ODA4MDtcbiAgICB9XG5cbiAgICBsb2NhdGlvbiAvX2FjY291bnRzIHtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0O1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLVByb3RvICRzY2hlbWU7XG5cbiAgICAgICAgcmV3cml0ZSBeL19hY2NvdW50cygvLiopJCAkMSBicmVhaztcbiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vYWNjb3VudDozMDAwLztcbiAgICB9XG5cbiAgICBsb2NhdGlvbiAvX2NvbGxhYm9yYXRvciB7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLUZvciAkcHJveHlfYWRkX3hfZm9yd2FyZGVkX2ZvcjtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Qcm90byAkc2NoZW1lO1xuXG4gICAgICAgIHByb3h5X2h0dHBfdmVyc2lvbiAxLjE7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgVXBncmFkZSAkaHR0cF91cGdyYWRlO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gXCJ1cGdyYWRlXCI7XG4gICAgICAgIHJld3JpdGUgXi9fY29sbGFib3JhdG9yKC8uKikkICQxIGJyZWFrO1xuICAgICAgICBwcm94eV9wYXNzIGh0dHA6Ly9jb2xsYWJvcmF0b3I6MzA3OC87XG4gICAgfVxuXG4gICAgbG9jYXRpb24gL190cmFuc2FjdG9yIHtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0O1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLVByb3RvICRzY2hlbWU7XG4gICAgICAgIFxuICAgICAgICBwcm94eV9odHRwX3ZlcnNpb24gMS4xO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgJGh0dHBfdXBncmFkZTtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIFwidXBncmFkZVwiO1xuICAgICAgICByZXdyaXRlIF4vX3RyYW5zYWN0b3IoLy4qKSQgJDEgYnJlYWs7XG4gICAgICAgIHByb3h5X3Bhc3MgaHR0cDovL3RyYW5zYWN0b3I6MzMzMy87XG4gICAgfVxuXG4gICAgbG9jYXRpb24gfiBeL2V5SiB7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLUZvciAkcHJveHlfYWRkX3hfZm9yd2FyZGVkX2ZvcjtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Qcm90byAkc2NoZW1lO1xuICAgICAgICBcbiAgICAgICAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlICRodHRwX3VwZ3JhZGU7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgQ29ubmVjdGlvbiBcInVwZ3JhZGVcIjtcbiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vdHJhbnNhY3RvcjozMzMzO1xuICAgIH1cblxuICAgIGxvY2F0aW9uIC9fcmVrb25pIHtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0O1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLVByb3RvICRzY2hlbWU7XG5cbiAgICAgICAgcmV3cml0ZSBeL19yZWtvbmkoLy4qKSQgJDEgYnJlYWs7XG4gICAgICAgIHByb3h5X3Bhc3MgaHR0cDovL3Jla29uaTo0MDA0LztcbiAgICB9XG5cbiAgICBsb2NhdGlvbiAvX3N0YXRzIHtcbiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0O1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7XG4gICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yO1xuICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLVByb3RvICRzY2hlbWU7XG5cbiAgICAgICAgcmV3cml0ZSBeL19zdGF0cygvLiopJCAkMSBicmVhaztcbiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vc3RhdHM6NDkwMC87XG4gICAgfVxufSBcblwiXCJcIlxuIgp9

Tags

project-management, community, discussion


Version: 0.6.377

On this page