Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8e520e7f0 | ||
|
|
e14bb16d60 | ||
|
|
b704d58f0f | ||
|
|
246e9a7764 | ||
|
|
1c7b63f583 | ||
|
|
e6476319bc | ||
|
|
c954934b33 | ||
|
|
a72a6886f6 | ||
|
|
a601ba542a | ||
|
|
f22f470ba4 | ||
|
|
3faeeac126 | ||
|
|
40be1d416b | ||
|
|
9ef82458b7 | ||
|
|
da99e363cd | ||
|
|
3110bb48fd | ||
|
|
08e2f2f273 | ||
|
|
6636d12215 | ||
|
|
5f243d173a | ||
|
|
5ea8d3a4c6 | ||
|
|
dad3fd22ec | ||
|
|
f381402e8f | ||
|
|
f010235ff2 | ||
|
|
09f6dcbde1 | ||
|
|
224b8e3492 | ||
|
|
28612bbc8a | ||
|
|
dfe4f7bb56 | ||
|
|
3f28c0dd22 | ||
|
|
959dd1a95a | ||
|
|
d5297cd1df | ||
|
|
95404f43b7 | ||
|
|
9838af5e56 | ||
|
|
dab656f8ca | ||
|
|
802eeb1e6b | ||
|
|
98dd28818a | ||
|
|
f705373cc4 | ||
|
|
5bc60a8dab | ||
|
|
1c8f783767 | ||
|
|
24d3075c85 | ||
|
|
c461adff11 | ||
|
|
b172f7207d | ||
|
|
ef31fffa40 | ||
|
|
426632a307 | ||
|
|
2c708b6df6 | ||
|
|
b555d0ccc8 | ||
|
|
e1724c8a12 | ||
|
|
cd35574c0b | ||
|
|
d016cbcffc | ||
|
|
7e4b672888 | ||
|
|
06d9abf6f6 | ||
|
|
a1a6dae5c6 | ||
|
|
c5f40f1be9 | ||
|
|
4358cb5e57 | ||
|
|
a591bf05e0 | ||
|
|
568b7538ad | ||
|
|
bbd7765432 | ||
|
|
558024785f | ||
|
|
76043cc5b6 | ||
|
|
583fca1814 | ||
|
|
806201b8cb | ||
|
|
24c89aeb64 | ||
|
|
8f0d88d9e0 | ||
|
|
e92d8dc127 | ||
|
|
8a99e8f796 | ||
|
|
c0246c6834 | ||
|
|
42ed92f346 | ||
|
|
df0bd90fae | ||
|
|
3453f94b43 | ||
|
|
ca537e266d | ||
|
|
8f3c948614 | ||
|
|
059743ad34 | ||
|
|
33ccf68e17 | ||
|
|
b6f22712f9 | ||
|
|
9e413b3961 | ||
|
|
5dd318a481 | ||
|
|
1783257c0e | ||
|
|
966852c212 | ||
|
|
07d6c1e514 | ||
|
|
09be915ea5 | ||
|
|
abd3c95dfa | ||
|
|
3fa61ac23c | ||
|
|
00bbc26698 | ||
|
|
3004f54b5d | ||
|
|
ef5b888779 | ||
|
|
835e33bf09 | ||
|
|
8ba3a05648 | ||
|
|
73ae73d4c3 | ||
|
|
76175a711a | ||
|
|
574acd6744 | ||
|
|
9e0e052bba | ||
|
|
ffafb30b9b | ||
|
|
9c4e402e6c | ||
|
|
f6f9dbb5e3 | ||
|
|
7beced1e68 | ||
|
|
c8921b77f0 | ||
|
|
482ce0a265 | ||
|
|
c570405d02 | ||
|
|
35ed465e10 | ||
|
|
747bc4c088 | ||
|
|
7c156927e4 | ||
|
|
13f0c77fb6 | ||
|
|
82d9f77eb3 | ||
|
|
151699ceb9 | ||
|
|
cc5d5bdd01 | ||
|
|
f43dadc068 | ||
|
|
b24694bea3 | ||
|
|
f4b31aa771 | ||
|
|
3cd5d00b0b | ||
|
|
7112584139 | ||
|
|
639b9c8f56 | ||
|
|
791ebc6406 | ||
|
|
059134d3d0 | ||
|
|
3b0616c150 | ||
|
|
ad5c4fdca2 | ||
|
|
b219b8fb65 | ||
|
|
73a170a388 | ||
|
|
e55e9c73b9 | ||
|
|
71ed5d3427 | ||
|
|
8b7bdfe0c7 | ||
|
|
ed6018fad1 | ||
|
|
b5f4be36d4 | ||
|
|
5c0a46b006 | ||
|
|
54ed46447a | ||
|
|
84fe3c2f40 | ||
|
|
e30329a18c | ||
|
|
22b40aab5d | ||
|
|
c3c8b1eb70 | ||
|
|
ce82ee8d0d | ||
|
|
04f0967b18 | ||
|
|
f8ef2e33de | ||
|
|
20a8ac7c98 | ||
|
|
37e9236bde | ||
|
|
fc11ff13c5 | ||
|
|
c92586ee64 | ||
|
|
38e2308d94 | ||
|
|
03044250a3 | ||
|
|
ebe7ec40e4 | ||
|
|
412626052b | ||
|
|
2a0af154c6 | ||
|
|
87debbd26b | ||
|
|
10e88fccd6 | ||
|
|
cc781c0082 | ||
|
|
5198ee997c | ||
|
|
4843d6cdc1 | ||
|
|
8ca0b2d9c3 | ||
|
|
cf589cb792 | ||
|
|
eda05e0157 | ||
|
|
4ae8a0308e | ||
|
|
88c6ce1c7e | ||
|
|
b714e2fca0 | ||
|
|
ce3a931c59 | ||
|
|
69f5d90e91 | ||
|
|
1a6ab68752 | ||
|
|
f13001e53a | ||
|
|
824b537db0 | ||
|
|
42e4bc3105 | ||
|
|
ebcedcffec | ||
|
|
b8cc84261f | ||
|
|
4e2475502a | ||
|
|
7dd9bcce2b | ||
|
|
620628dca3 | ||
|
|
5ee7d52e8c | ||
|
|
26004b1f73 | ||
|
|
59c42bc1a3 | ||
|
|
c8a7d539f3 | ||
|
|
98c86bcc0f | ||
|
|
1b138e14c3 | ||
|
|
a54e52d34b | ||
|
|
67218fb61d | ||
|
|
4eb0085243 | ||
|
|
38a8fcb69a | ||
|
|
64592d734c | ||
|
|
abddc8a864 | ||
|
|
09b45aca4f | ||
|
|
f624211620 | ||
|
|
c19cde53d6 | ||
|
|
cf8694fcd1 | ||
|
|
28d640afb4 | ||
|
|
7b432078a0 | ||
|
|
19703fed31 | ||
|
|
b01e127cc3 | ||
|
|
f0c2d81352 | ||
|
|
67896adefc | ||
|
|
d1b29b6e61 | ||
|
|
ef93aad659 | ||
|
|
616b433409 | ||
|
|
515d96eef0 | ||
|
|
85963cc58d | ||
|
|
e15611a0ea | ||
|
|
f89a2ab91d | ||
|
|
18d3fb75ac | ||
|
|
f5bc2b08f9 | ||
|
|
80e5916394 | ||
|
|
48c47f9911 | ||
|
|
c3f5849f11 | ||
|
|
c73346eda0 | ||
|
|
d976455a12 | ||
|
|
f10f80f655 | ||
|
|
b680d03da2 | ||
|
|
9590fec3fc | ||
|
|
e9fc5537e4 | ||
|
|
8ae47cb2f8 | ||
|
|
2fefaf1b5b | ||
|
|
5554cd7567 | ||
|
|
442ea7595a | ||
|
|
0e6d83c085 | ||
|
|
3199da4b3d | ||
|
|
23c2a2bc22 | ||
|
|
554bec4f1e | ||
|
|
4d6e6a85e0 | ||
|
|
fe887b7b5e | ||
|
|
d954b97aac | ||
|
|
374e673107 | ||
|
|
68c0d3fbe5 | ||
|
|
335f0451e0 | ||
|
|
b5a071f51e | ||
|
|
805458a763 | ||
|
|
4f8e711a5f | ||
|
|
06397e9e11 | ||
|
|
94be762f68 | ||
|
|
ccb48d0711 | ||
|
|
b6014ca992 | ||
|
|
02c5f2e3cf | ||
|
|
84a228fc1a | ||
|
|
356fddc182 | ||
|
|
c4853b9aa7 | ||
|
|
d6cb460186 | ||
|
|
a0f9b81113 | ||
|
|
15b9497a72 | ||
|
|
93be112a94 | ||
|
|
5a9a5df448 | ||
|
|
75383fe477 | ||
|
|
3f0109e810 | ||
|
|
c21db857fb | ||
|
|
e3a0a480ed | ||
|
|
3917d8c4a3 | ||
|
|
6a3b8a668b | ||
|
|
edfa9783c3 | ||
|
|
b4c9c1df9a | ||
|
|
85353d9f90 | ||
|
|
905f0316b6 | ||
|
|
b3961609e1 | ||
|
|
8ad4a1aa96 | ||
|
|
3fd1f4f5ec | ||
|
|
31ca78c17b | ||
|
|
a628c0fc03 | ||
|
|
3cc10c77f9 | ||
|
|
a727f8a62c | ||
|
|
f324286911 | ||
|
|
7f7d06be65 | ||
|
|
c9f1278651 | ||
|
|
dd69966def | ||
|
|
2f2a039e3c | ||
|
|
80db4cd645 | ||
|
|
ed9338608e | ||
|
|
fef0c0e490 | ||
|
|
e0e703dc72 | ||
|
|
8aca32179e | ||
|
|
ab823795cf | ||
|
|
d90ab03bbe | ||
|
|
bf053e0018 | ||
|
|
46c911bb2a | ||
|
|
2bc8df9188 | ||
|
|
6367b18f4f | ||
|
|
a307bfa1ec | ||
|
|
cfb3caf504 | ||
|
|
daf524238b | ||
|
|
5435604448 | ||
|
|
64500f1f73 | ||
|
|
d5ee0b567a | ||
|
|
5ec4988efe | ||
|
|
e41072dcdf | ||
|
|
126ddda45d | ||
|
|
bec460f77e | ||
|
|
fd56d4c63c | ||
|
|
d9cefb84b8 | ||
|
|
3013114c1f | ||
|
|
095dfdb24f |
No files matched your search
@@ -54,6 +54,7 @@ ENV \
|
||||
OAUTH2_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_B2C_ENABLED=false \
|
||||
OAUTH2_LOGIN_STYLE=redirect \
|
||||
OAUTH2_CLIENT_ID="" \
|
||||
OAUTH2_SECRET="" \
|
||||
|
||||
@@ -11,4 +11,4 @@ jobs:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v4
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v3
|
||||
uses: actions/dependency-review-action@v4
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d
|
||||
uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -48,14 +48,14 @@ jobs:
|
||||
# https://github.com/docker/metadata-action
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934
|
||||
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
# Build and push Docker image with Buildx (don't push on PR)
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09
|
||||
uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -95,7 +95,7 @@ jobs:
|
||||
# CACHING
|
||||
- name: Install Meteor
|
||||
id: cache-meteor-install
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.meteor
|
||||
key: v1-meteor-${{ hashFiles('.meteor/versions') }}
|
||||
@@ -104,7 +104,7 @@ jobs:
|
||||
|
||||
- name: Cache NPM dependencies
|
||||
id: cache-meteor-npm
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: v1-npm-${{ hashFiles('package-lock.json') }}
|
||||
@@ -113,7 +113,7 @@ jobs:
|
||||
|
||||
- name: Cache Meteor build
|
||||
id: cache-meteor-build
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
.meteor/local/resolver-result-cache.json
|
||||
@@ -136,7 +136,7 @@ jobs:
|
||||
run: sh ./test-wekan.sh -cv
|
||||
|
||||
- name: Upload coverage
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
@@ -150,14 +150,14 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download coverage
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
|
||||
|
||||
- name: Coverage Report
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v3.0.0
|
||||
with:
|
||||
path: ".coverage/lcov.info"
|
||||
min_coverage: 1 # TODO add tests and increase to 95!
|
||||
+6
-6
@@ -6,7 +6,7 @@
|
||||
meteor-base@1.5.1
|
||||
|
||||
# Build system
|
||||
ecmascript@0.16.7
|
||||
ecmascript@0.16.8
|
||||
standard-minifier-js@2.8.1
|
||||
mquandalle:jade
|
||||
coffeescript@2.4.1!
|
||||
@@ -20,11 +20,11 @@ cottz:publish-relations
|
||||
dburles:collection-helpers
|
||||
idmontie:migrations
|
||||
easy:search
|
||||
mongo@1.16.8-beta2140.0
|
||||
mongo@1.16.8
|
||||
mquandalle:collection-mutations
|
||||
|
||||
# Account system
|
||||
accounts-password@2.4.0-beta2140.0
|
||||
accounts-password@2.4.0
|
||||
useraccounts:core
|
||||
useraccounts:flow-routing
|
||||
useraccounts:unstyled
|
||||
@@ -42,7 +42,7 @@ jquery@3.0.0!
|
||||
random@1.2.1
|
||||
reactive-dict@1.3.1
|
||||
session@1.2.1
|
||||
tracker@1.3.2
|
||||
tracker@1.3.3
|
||||
underscore@1.0.13
|
||||
arillo:flow-router-helpers
|
||||
audit-argument-checks@1.0.7
|
||||
@@ -83,14 +83,14 @@ matb33:collection-hooks
|
||||
simple:json-routes
|
||||
kadira:flow-router
|
||||
spacebars
|
||||
service-configuration@1.3.2-beta2140.0
|
||||
service-configuration@1.3.2
|
||||
communitypackages:picker
|
||||
minifier-css@1.6.4
|
||||
blaze
|
||||
kadira:blaze-layout
|
||||
peerlibrary:blaze-components
|
||||
ejson@1.1.3
|
||||
logging@1.3.3-beta2140.0
|
||||
logging@1.3.3
|
||||
wekan-fullcalendar
|
||||
momentjs:moment@2.29.3
|
||||
wekan-fontawesome
|
||||
+1
-1
@@ -1 +1 @@
|
||||
METEOR@2.14-beta.0
|
||||
METEOR@2.14
|
||||
+23
-23
@@ -1,6 +1,6 @@
|
||||
accounts-base@2.2.9-beta2140.0
|
||||
accounts-oauth@1.4.3-beta2140.0
|
||||
accounts-password@2.4.0-beta2140.0
|
||||
accounts-base@2.2.10
|
||||
accounts-oauth@1.4.3
|
||||
accounts-password@2.4.0
|
||||
aldeed:collection2@2.10.0
|
||||
aldeed:collection2-core@1.2.0
|
||||
aldeed:schema-deny@1.1.0
|
||||
@@ -10,13 +10,13 @@ allow-deny@1.1.1
|
||||
arillo:flow-router-helpers@0.5.2
|
||||
audit-argument-checks@1.0.7
|
||||
autoupdate@1.8.0
|
||||
babel-compiler@7.10.4
|
||||
babel-compiler@7.10.5
|
||||
babel-runtime@1.5.1
|
||||
base64@1.0.12
|
||||
binary-heap@1.0.11
|
||||
blaze@2.7.1
|
||||
blaze-tools@1.1.3
|
||||
boilerplate-generator@1.7.1
|
||||
boilerplate-generator@1.7.2
|
||||
caching-compiler@1.2.2
|
||||
caching-html-compiler@1.2.1
|
||||
callback-hook@1.5.1
|
||||
@@ -29,22 +29,22 @@ dburles:collection-helpers@1.1.0
|
||||
ddp@1.4.1
|
||||
ddp-client@2.6.1
|
||||
ddp-common@1.4.0
|
||||
ddp-rate-limiter@1.2.0
|
||||
ddp-server@2.7.0-beta2140.0
|
||||
ddp-rate-limiter@1.2.1
|
||||
ddp-server@2.7.0
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.2
|
||||
dynamic-import@0.7.3
|
||||
easy:search@2.2.1
|
||||
easysearch:components@2.2.2
|
||||
easysearch:core@2.2.2
|
||||
ecmascript@0.16.7
|
||||
ecmascript@0.16.8
|
||||
ecmascript-runtime@0.8.1
|
||||
ecmascript-runtime-client@0.12.1
|
||||
ecmascript-runtime-server@0.11.0
|
||||
ejson@1.1.3
|
||||
email@2.2.5
|
||||
es5-shim@4.8.0
|
||||
fetch@0.1.4-beta2140.0
|
||||
fetch@0.1.4
|
||||
geojson-utils@1.0.11
|
||||
hot-code-push@1.0.4
|
||||
html-tools@1.1.3
|
||||
@@ -60,10 +60,10 @@ kadira:flow-router@2.12.1
|
||||
konecty:mongo-counter@0.0.5_3
|
||||
lmieulet:meteor-coverage@1.1.4
|
||||
localstorage@1.2.0
|
||||
logging@1.3.3-beta2140.0
|
||||
logging@1.3.3
|
||||
matb33:collection-hooks@1.3.0
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.11.4-beta2140.0
|
||||
meteor@1.11.5
|
||||
meteor-autosize@5.0.1
|
||||
meteor-base@1.5.1
|
||||
meteorhacks:aggregate@1.3.0
|
||||
@@ -77,11 +77,11 @@ minifier-css@1.6.4
|
||||
minifier-js@2.7.5
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.9.3
|
||||
modern-browsers@0.1.10-beta2140.0
|
||||
modules@0.19.0
|
||||
modern-browsers@0.1.10
|
||||
modules@0.20.0
|
||||
modules-runtime@0.13.1
|
||||
momentjs:moment@2.29.3
|
||||
mongo@1.16.8-beta2140.0
|
||||
mongo@1.16.8
|
||||
mongo-decimal@0.1.3
|
||||
mongo-dev-server@1.1.0
|
||||
mongo-id@1.0.8
|
||||
@@ -94,8 +94,8 @@ mquandalle:jade-compiler@0.4.5
|
||||
mquandalle:jquery-textcomplete@0.8.0_1
|
||||
mquandalle:mousetrap-bindglobal@0.0.1
|
||||
msavin:usercache@1.8.0
|
||||
npm-mongo@4.17.0-beta2140.0
|
||||
oauth@2.2.1-beta2140.0
|
||||
npm-mongo@4.17.2
|
||||
oauth@2.2.1
|
||||
oauth2@1.3.2
|
||||
observe-sequence@1.0.21
|
||||
ongoworks:speakingurl@1.1.0
|
||||
@@ -111,19 +111,19 @@ peerlibrary:blaze-components@0.23.0
|
||||
peerlibrary:computed-field@0.10.0
|
||||
peerlibrary:data-lookup@0.3.0
|
||||
peerlibrary:reactive-field@0.6.0
|
||||
percolate:synced-cron@1.3.2
|
||||
percolate:synced-cron@1.5.2
|
||||
promise@0.12.2
|
||||
raix:eventemitter@0.1.3
|
||||
raix:handlebar-helpers@0.2.5
|
||||
random@1.2.1
|
||||
rate-limit@1.1.1
|
||||
react-fast-refresh@0.2.8-beta2140.0
|
||||
react-fast-refresh@0.2.8
|
||||
reactive-dict@1.3.1
|
||||
reactive-var@1.0.12
|
||||
reload@1.3.1
|
||||
retry@1.1.0
|
||||
routepolicy@1.1.1
|
||||
service-configuration@1.3.2-beta2140.0
|
||||
service-configuration@1.3.3
|
||||
session@1.2.1
|
||||
sha@1.0.9
|
||||
shell-server@0.5.0
|
||||
@@ -132,7 +132,7 @@ simple:json-routes@2.3.1
|
||||
simple:rest-accounts-password@1.2.2
|
||||
simple:rest-bearer-token-parser@1.1.1
|
||||
simple:rest-json-error-handler@1.1.1
|
||||
socket-stream-client@0.5.1
|
||||
socket-stream-client@0.5.2
|
||||
spacebars@1.4.1
|
||||
spacebars-compiler@1.3.1
|
||||
standard-minifier-js@2.8.1
|
||||
@@ -141,15 +141,15 @@ templating@1.4.1
|
||||
templating-compiler@1.4.1
|
||||
templating-runtime@1.5.0
|
||||
templating-tools@1.2.2
|
||||
tracker@1.3.2
|
||||
typescript@4.9.4
|
||||
tracker@1.3.3
|
||||
typescript@4.9.5
|
||||
ui@1.0.13
|
||||
underscore@1.0.13
|
||||
url@1.3.2
|
||||
useraccounts:core@1.16.2
|
||||
useraccounts:flow-routing@1.15.0
|
||||
useraccounts:unstyled@1.14.2
|
||||
webapp@1.13.5
|
||||
webapp@1.13.6
|
||||
webapp-hashing@1.1.1
|
||||
wekan-accounts-cas@0.1.0
|
||||
wekan-accounts-lockout@1.0.0
|
||||
|
||||
+417
-14
@@ -1,25 +1,428 @@
|
||||
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
|
||||
|
||||
Newest Node.js is at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4
|
||||
Newest WeKan at these amd64 platforms:
|
||||
|
||||
Required versions of Node.js, MongoDB etc are listed at https://wekan.github.io
|
||||
Download section.
|
||||
- Windows and Linux bundle
|
||||
- Snap Candidate
|
||||
- Docker
|
||||
- Kubernetes
|
||||
|
||||
Newest WeKan is on platforms: Snap Candidate, Docker, Kubernetes, Source/Bundle. Download section at https://wekan.github.io
|
||||
Fixing other platforms In Progress.
|
||||
|
||||
In Progress is:
|
||||
- Getting newest WeKan to all platforms, fixing any migration and upgrade issues
|
||||
- Adding more platforms
|
||||
- Developing all paid features and fixes https://wekan.team/commercial-support/
|
||||
- More info and news at https://github.com/wekan/wekan/issues/4578#issuecomment-1505909376
|
||||
|
||||
Note:
|
||||
- Snap Candidate has newest WeKan with MongoDB 6 https://github.com/wekan/wekan/issues/4824#issuecomment-1425753485
|
||||
- Snap Beta has old WeKan with MongoDB 5 https://github.com/wekan/wekan/issues/4780#issuecomment-1427625571
|
||||
- Snap Stable has old WeKan 6.09 with MongoDB 3.2.2
|
||||
- Install info at Server part of webpage https://wekan.github.io
|
||||
- Newest Node.js is at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4
|
||||
- MongoDB 6.x
|
||||
|
||||
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
|
||||
|
||||
# v7.44 2024-04-26 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Collapse Lists](https://github.com/wekan/wekan/commit/a601ba542aebefdfa8b5d683d22405ab3d5f8569).
|
||||
Thanks to xet7.
|
||||
- [Collapse Swimlanes. In Progress, does not work yet, not visible yet](https://github.com/wekan/wekan/commit b704d58f0f3cf5e7785b79d5a6c9f6c63da4159c).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix board not visible at Collapse Lists](https://github.com/wekan/wekan/commit/e6476319bcb06cc71fa0eefa0a608ec3a7b89767).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.43 2024-04-18 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated release script for Windows On-Premise, that is without container like Docker and Snap](https://github.com/wekan/wekan/commit/802eeb1e6bb87c45fa79298f67ff690e87f939f8).
|
||||
Thanks to xet7.
|
||||
- [Updated translations Transifex URL at readme](https://github.com/wekan/wekan/commit/9838af5e5630a6ef34175e110ddfb6bfc225b40c).
|
||||
Thanks to xet7.
|
||||
- [Improve Docker files](https://github.com/wekan/wekan/pull/5377).
|
||||
Thanks to C0rn3j.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/08e2f2f2731856255e0b40eb692328424efdf9ac),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/da99e363cd72cda7d400ce65785a6650e42c72cf).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix DEBUG environment variable check](https://github.com/wekan/wekan/pull/5380).
|
||||
Thanks to verdel.
|
||||
- [By default, use localized long date-time format](https://github.com/wekan/wekan/pull/5381).
|
||||
Thanks to tvogel.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.42 2024-04-03 WeKan ® release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY ISSUES:
|
||||
|
||||
- [Fixed CRITICAL SECURITY ISSUE by updating meteor-node-stubs](https://github.com/wekan/wekan/commit/c461adff11456734fcb9193b5522cc6451078732).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5355),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5356),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/1c8f783767a680758f2219d2f416ce3ae2fb0c57).
|
||||
Thanks to dependabot and developers of dependencies.
|
||||
- [Small tweaks to moderndark theme](https://github.com/wekan/wekan/pull/5363).
|
||||
Thanks to jghaanstra.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed link at readme](https://github.com/wekan/wekan/pull/5360).
|
||||
Thanks to dyercode.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.41 2024-03-18 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- Fixes for mongosh to allow snap packages to update to the edge/candidate version.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5349),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5350).
|
||||
Thanks to lorodoes.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.40 2024-03-17 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed centering of text below custom login logo](https://github.com/wekan/wekan/commit/24c89aeb64cf6266d95f42124419d4f070864631).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger margin is too much in mobile](https://github.com/wekan/wekan/commit/583fca1814d916490b04947ba8d97dd85168fb22).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.39 2024-03-16 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Clarify usage of api.py.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5341).
|
||||
[Part 2](https://github.com/wekan/wekan/commit/8f3c948614df0641b0971d1882cc241587d9d3b4).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5343),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5344).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Make the contents of the cards grow to the list width](https://github.com/wekan/wekan/pull/5346).
|
||||
Thanks to kuba-orlik.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.38 2024-03-10 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added docs wikis to WeKan repo directory docs, to make possible to send PRs](https://github.com/wekan/wekan/commit/73ae73d4c38640e9daedbe8ef9e5b25b877ee804).
|
||||
Thanks to e-gaulue, C0rn3j and xet7.
|
||||
- [Added script to count lines of code changed per committer email address, because GitHub removed that feature from web UI](https://github.com/wekan/wekan/commit/835e33bf090022875f50916412f80b6a9b4a3b21).
|
||||
Thanks to bgwines and xet7.
|
||||
- [Add info about GitHub top committers at Finland](https://github.com/wekan/wekan/commit/ef5b8887799a75ab797655f39483bc08841815d2).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated contributing to wiki](https://github.com/wekan/wekan/commit/8ba3a05648818f6162b2021affeb33066f91c400).
|
||||
Thanks to xet7.
|
||||
- [Upgraded to MongoDB 6.0.14 at Snap Candidate](https://github.com/wekan/wekan/commit/07d6c1e5148eb0392357d55d0486a9672378c16f).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and tried to fix the following bugs:
|
||||
|
||||
- [Fix error during delete](https://github.com/wekan/wekan/pull/5336).
|
||||
Thanks to xator91.
|
||||
- [Fixed text below custom login logo not visible](https://github.com/wekan/wekan/commit/00bbc2669814247c0ff79bd816be7bf34bcf08a2).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger needs margin](https://github.com/wekan/wekan/commit/abd3c95dfa13cd697ff2fb7e299c85287406772a).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.37 2024-03-07 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed API get swimlane cards wrong order. Please test](https://github.com/wekan/wekan/commit/7beced1e683c2eb2960b0ee40d5ec927d235fa6a).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
- [Fixed API get_all_cards doesn't return SwimlaneId. Please test](https://github.com/wekan/wekan/commit/ffafb30b9b394188e1b60ec836ad83f1738c266d).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.36 2024-03-06 WeKan ® release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [api.py: checklistid, checklistinfo, get_list_cards_count and get_board_cards_count](https://github.com/wekan/wekan/pull/5326).
|
||||
Thanks to xator91.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Card image cover should be margin-top:6px since hamburger menu and due date at the top](https://github.com/wekan/wekan/commit/747bc4c08837ad9781d63b9f16b97a64b0bfe7b8).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- [Try to fix API get cards wrong order. Please test](https://github.com/wekan/wekan/commit/c570405d0267e28f2b2644005d48fb097eac385b).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.35 2024-02-27 WeKan ® release
|
||||
|
||||
This release adds the following features and bugs:
|
||||
|
||||
- [Added back Mathjax that has bug of showing math twice](https://github.com/wekan/wekan/commit/f43dadc06894d874281ec0e449dcc4c81b3c59ad).
|
||||
Thanks to macthecadillac, Dexus and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.34 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated translations](https://github.com/wekan/wekan/commit/3cd5d00b0b8d74acb2cd2afbc12f5b9d7aafcbd8).
|
||||
Thanks to translators.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.33 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated docs for previous version of WeKan](https://github.com/wekan/wekan/commit/3b0616c1500b5070e660d2ba00968d59600958eb).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [OpenAPI: Fix breakage introduced with blank return](https://github.com/wekan/wekan/pull/5321).
|
||||
Thanks to bentiss.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.32 2024-02-22 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [api.py: Added create label](https://github.com/wekan/wekan/pull/5308).
|
||||
Thanks to xator91.
|
||||
- [api.py: Edit card color](https://github.com/wekan/wekan/pull/5309).
|
||||
Thanks to xator91.
|
||||
- [api.py: Add checklist with multiple items also or just title](https://github.com/wekan/wekan/pull/5311).
|
||||
Thanks to xator91.
|
||||
- [api.py: Delete all cards. Will delete all cards from Swimlanes automatically, will retrieve automatically all list id and delete everything](https://github.com/wekan/wekan/pull/5313).
|
||||
Thanks to xator91.
|
||||
- [cards.js: Added a control to check error if card is not updated](https://github.com/wekan/wekan/pull/5312).
|
||||
Thanks to xator91.
|
||||
- [Shortcut a to filter by assignees](https://github.com/wekan/wekan/pull/5318).
|
||||
Thanks to DevOpsNB.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Error 500 when adding user to a board and multiple same avatar icons by reverting back from Meteor 2.15 to 2.14](https://github.com/wekan/wekan/commit/b5f4be36d4577c391ad19c5e5dd9de3036b8998f).
|
||||
Thanks to xator91, mariogalan, bbyszio, zeo101, laurentm255, johnnytolengo and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.31 2024-02-17 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [api.py: Added getcard and cardsbyswimlane](https://github.com/wekan/wekan/pull/5287).
|
||||
Thanks to xator91.
|
||||
- [api.py: Add card with label and add a label to a card](https://github.com/wekan/wekan/pull/5290).
|
||||
Thanks to xator91.
|
||||
- [api.py: Fix BoardID to SwimlaneID in cardsbyswimlane](https://github.com/wekan/wekan/pull/5290).
|
||||
Thanks to xator91.
|
||||
- [boards.js: New update board title function for API](https://github.com/wekan/wekan/pull/5300).
|
||||
Thanks to xator91.
|
||||
- [api.py: EDIT BOARD TITLE](https://github.com/wekan/wekan/pull/5301).
|
||||
Thanks to xator91.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Release scripts: Commented out not currently in use builds of WeKan bundle](https://github.com/wekan/wekan/commit/4eb0085243672071a392dc32f77dba3103c592ab).
|
||||
Thanks to xet7.
|
||||
- [Try to fix Snap](https://github.com/wekan/wekan/commit/a54e52d34bdab02befda7eefad46d16814d2c46e).
|
||||
Thanks to xet7.
|
||||
- [Updated to Meteor 2.15-rc.1 and removed duplicate nodemailer package because of some errors](https://github.com/wekan/wekan/commit/59c42bc1a3a1792a50379be2f9251fce9b45c1a3).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated to Meteor 2.15](https://github.com/wekan/wekan/commit/5198ee997cb43b503fcb2edaf781b0521d8096cd).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.30 2024-01-28 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Back to MongoDB 6.0.13](https://github.com/wekan/wekan/commit/64592d734cfdbe10b48c3aa3ea74e0ba35903976).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.29 2024-01-27 WeKan ® release
|
||||
|
||||
This release removes the following features:
|
||||
|
||||
- [Removed markdown-it-mathjax3](https://github.com/wekan/wekan/commit/19703fed311c894b61e9269cc0b973d0b0275a6a).
|
||||
Thanks to Dexus and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated to Meteor 2.14.1-beta.0](https://github.com/wekan/wekan/commit/28d640afb40f4d7c9070fa514c910fbf7065a724).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated to MongoDB 7.0.5 at Snap Candidate and Docker](https://github.com/wekan/wekan/commit/f624211620c5e42ccdd6f931ba473be62437a62c).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.28 2024-01-23 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added archive option to of Wekan API](https://github.com/wekan/wekan/pull/5265).
|
||||
Thanks to gustavengstrom.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5270),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5271),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/67896adefc4a12a93fed7575f621f8aa924a2ab8).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.27 2024-01-02 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix missing maximize card](https://github.com/wekan/wekan/commit/f10f80f6559a6cdee020d5ca34fd5991e07617cf).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.26 2024-01-02 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
-[Fix some public board buttons](https://github.com/wekan/wekan/commit/8ae47cb2f82bcc2078cc9c9987f7d7b7f6394493).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.25 2023-12-30 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Snap: Organized file locations](https://github.com/wekan/wekan/commit/84a228fc1a7ced2b8b146795acc13eb5abb13d24).
|
||||
Thanks to xet7.
|
||||
- Updated GitHub Actions.
|
||||
[Part 1](https://github.com/wekan/wekan/pulls/5243),
|
||||
[Part 2](https://github.com/wekan/wekan/pulls/5244),
|
||||
[Part 3](https://github.com/wekan/wekan/pulls/5245).
|
||||
- [Updated percolate:synced-cron](https://github.com/wekan/wekan/commit/06397e9e11a689a0a2e6a95ae785749d5a6a695b).
|
||||
Thanks to developers of percolate:synced-cron.
|
||||
- Snap: Added MongoDB 3 binaries for migrating to MongoDB 6.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/805458a7638ff6213929bfa70a46b5afeacaedf1),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/335f0451e07d6ff924c0af3e5a934676c8e69f4c),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/374e67310723f3c0d3ab20f6b2e4bd0b273bce2b).
|
||||
Thanks to xet7.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/0e6d83c0852b2da4430f9c902b84c16f5c2ee8bc).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Translations: Added German (Germany) (de_DE) and Odia (India) (or_IN)](https://github.com/wekan/wekan/commit/23c2a2bc224e2def4722a35c20f32a21062b4154).
|
||||
Thanks to translators.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix: Export HTML popup](https://github.com/wekan/wekan/pull/5252).
|
||||
Thanks to Lewiscowles1986.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.24 2023-12-17 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Azure AD B2C login using OAuth2](https://github.com/wekan/wekan/commit/93be112a9454c894c1ce3146ed377e6a6aeca64a).
|
||||
https://github.com/wekan/wekan/wiki/B2C .
|
||||
Thanks to snowsky and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Meteor 2.14](https://github.com/wekan/wekan/commit/75383fe477874a7aaf5caa3b913e2173694efe13).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.23 2023-12-11 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated security.md about mitm](https://github.com/wekan/wekan/commit/b4c9c1df9a7e89d263b1864407a7007338ce770d).
|
||||
Thanks to xet7.
|
||||
- [Upgraded to Meteor 2.14-rc.3](https://github.com/wekan/wekan/commit/6a3b8a668bc84c89714e44c3865168be81c8e2ed).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/e3a0a480ed960d30fc80f7c7c1a6c7471368d0e8).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.22 2023-12-01 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [At right sidebar, moved Minicard Settings to Card Settings popup](https://github.com/wekan/wekan/commit/2f2a039e3c1957b8921f3800315508d4f51c21b7).
|
||||
Thanks to Roemer and xet7.
|
||||
- [New feature: Sidebar / Card Settings / Creator at minicard](https://github.com/wekan/wekan/commit/f3242869110738210b712761dda67fec34932307).
|
||||
Thanks to Roemer and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgraded to MongoDB 6.0.12 at Snap Candidate](https://github.com/wekan/wekan/commit/31ca78c17b0c734087cef99d481b939ac9533612).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Markdown and copy buttons on top of text](https://github.com/wekan/wekan/commit/3cc10c77f99db344d0af3d6d862eb05c909fbf2c).
|
||||
Thanks to mueller-ma and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.21 2023-11-27 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/fef0c0e490ef0d90b6504074312bf827ff5f2d61).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.20 2023-11-26 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Added standard for public code assessment](https://github.com/wekan/wekan/commit/a307bfa1ec82b66d97714bff32d4201aa8e6e6f7).
|
||||
Thanks to those that participated to making of assessment.
|
||||
- [Upgraded to Meteor 2.14-beta.2](https://github.com/wekan/wekan/commit/126ddda45d07769f9fef67aa74241c9afa04b6a8).
|
||||
Thanks to Meteor developers.
|
||||
- [Upgraded to Meteor 2.14-beta.4](https://github.com/wekan/wekan/commit/d90ab03bbe9f13d211aaca2e72542386fdf2a6ba).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.19 2023-11-20 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
+3
-7
@@ -27,13 +27,9 @@ CVE Hall of Fame is at https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Contributing to Documentation Wiki
|
||||
|
||||
Please clone wiki:
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
Edit .md files, and add changed files in .zip attachment
|
||||
directly to comment of new issue at
|
||||
https://github.com/wekan/wekan/issues
|
||||
Fork WeKan repo https://github.com/wekan/wekan ,
|
||||
edit `docs` directory content at GitHub web interface,
|
||||
and click send PR.
|
||||
|
||||
## Contributing code
|
||||
|
||||
|
||||
+87
-87
@@ -69,6 +69,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
OIDC_REDIRECTION_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_B2C_ENABLED=false \
|
||||
OAUTH2_LOGIN_STYLE=redirect \
|
||||
OAUTH2_CLIENT_ID="" \
|
||||
OAUTH2_SECRET="" \
|
||||
@@ -175,93 +176,92 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
# Copy the app to the image
|
||||
COPY ${SRC_PATH} /home/wekan/app
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan && \
|
||||
\
|
||||
# OS dependencies
|
||||
apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
|
||||
\
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~ && \
|
||||
ln -sf $(which bsdtar) $(which tar) && \
|
||||
\
|
||||
# Download nodejs
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt && \
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
|
||||
#---------------------------------------------------------------------------------------------
|
||||
\
|
||||
# Verify nodejs authenticity
|
||||
grep node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt | shasum -a 256 -c - && \
|
||||
rm -f SHASUMS256.txt && \
|
||||
#grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
|
||||
#rm -f SHASUMS256.txt.asc && \
|
||||
\
|
||||
# Install Node
|
||||
tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
|
||||
ln -s /opt/nodejs/bin/node /usr/bin/node && \
|
||||
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
|
||||
mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config && \
|
||||
chown wekan --recursive /home/wekan/.config && \
|
||||
\
|
||||
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
#paxctl -mC `which node` && \
|
||||
\
|
||||
# Install Node dependencies. Python path for node-gyp.
|
||||
#npm install -g npm@${NPM_VERSION} && \
|
||||
\
|
||||
# Change user to wekan and install meteor
|
||||
cd /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan && \
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
||||
mv /root/.meteor /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan/.meteor && \
|
||||
\
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \
|
||||
cd /home/wekan/.meteor && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help; \
|
||||
\
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
mkdir -p /home/wekan/.npm && \
|
||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js && \
|
||||
cd ../.. && \
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
|
||||
mv /home/wekan/app_build/bundle /build && \
|
||||
\
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar) && \
|
||||
\
|
||||
# Cleanup
|
||||
apt-get remove --purge -y ${BUILD_DEPS} && \
|
||||
apt-get autoremove -y && \
|
||||
npm uninstall -g api2html &&\
|
||||
rm -R /tmp/* && \
|
||||
rm -R /var/lib/apt/lists/* && \
|
||||
rm -R /home/wekan/.meteor && \
|
||||
rm -R /home/wekan/app && \
|
||||
rm -R /home/wekan/app_build && \
|
||||
mkdir /data && \
|
||||
chown wekan --recursive /data
|
||||
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R && \
|
||||
#rm -R /home/wekan/python
|
||||
#rm /home/wekan/install_meteor.sh
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update -y
|
||||
apt-get install -y --no-install-recommends ${BUILD_DEPS}
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
# Download nodejs
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc
|
||||
#---------------------------------------------------------------------------------------------
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt | shasum -a 256 -c -
|
||||
rm -f SHASUMS256.txt
|
||||
#grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c -
|
||||
#rm -f SHASUMS256.txt.asc
|
||||
|
||||
# Install Node
|
||||
tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz
|
||||
rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz
|
||||
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs
|
||||
ln -s /opt/nodejs/bin/node /usr/bin/node
|
||||
ln -s /opt/nodejs/bin/npm /usr/bin/npm
|
||||
mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config
|
||||
chown wekan --recursive /home/wekan/.config
|
||||
|
||||
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
#paxctl -mC `which node`
|
||||
|
||||
# Install Node dependencies. Python path for node-gyp.
|
||||
#npm install -g npm@${NPM_VERSION}
|
||||
|
||||
# Change user to wekan and install meteor
|
||||
cd /home/wekan/
|
||||
chown wekan --recursive /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown wekan --recursive /home/wekan/.meteor
|
||||
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js
|
||||
cd /home/wekan/.meteor
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help;
|
||||
|
||||
# Build app
|
||||
cd /home/wekan/app
|
||||
mkdir -p /home/wekan/.npm
|
||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
cd /home/wekan/app_build/bundle/programs/server/
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install
|
||||
cd node_modules/fibers
|
||||
node build.js
|
||||
cd ../..
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
|
||||
mv /home/wekan/app_build/bundle /build
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
# Cleanup
|
||||
apt-get remove --purge -y ${BUILD_DEPS}
|
||||
apt-get autoremove -y
|
||||
npm uninstall -g api2html
|
||||
rm -R /tmp/*
|
||||
rm -R /var/lib/apt/lists/*
|
||||
rm -R /home/wekan/.meteor
|
||||
rm -R /home/wekan/app
|
||||
rm -R /home/wekan/app_build
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R
|
||||
#rm -R /home/wekan/python
|
||||
#rm /home/wekan/install_meteor.sh
|
||||
EOR
|
||||
|
||||
ENV PORT=8080
|
||||
EXPOSE $PORT
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# Future
|
||||
|
||||
## Moved Import/Export/Sync issues to Big Picture Roadmap wiki page
|
||||
|
||||
This change is limited to only Import/Export/Sync issues, while those are In Progress of being fixed.
|
||||
|
||||
2023-11-21 xet7 closed 261 issues that are linked at https://github.com/wekan/wekan/wiki/Sync ,
|
||||
that is Roadmap of Import/Export/Sync in WeKan. It means, that those issues progress will be
|
||||
updated at that wiki page, when xet7 and other WeKan contributors fix those.
|
||||
Many of those issues are In Progress of being fixed and added.
|
||||
|
||||
## Platform Updates
|
||||
|
||||
Issues related to platforms are being closed, because only list of working platforms is mentioned now
|
||||
at WeKan website https://wekan.github.io Install section and at [ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
where is this new text:
|
||||
|
||||
> Newest WeKan at amd64 platforms: Linux bundle, Snap Candidate, Docker, Kubernetes. Fixing other platforms In Progress.
|
||||
|
||||
Platform support changes often, because:
|
||||
|
||||
- There are many dependencies, that update or break or change often
|
||||
- Node.js segfaults at some CPU/OS
|
||||
- Some platforms have build errors
|
||||
|
||||
Roadmap is to update all existing platforms, and add more platforms.
|
||||
|
||||
Upcoming platform upgrades:
|
||||
|
||||
- Fix migrations, so that newest WeKan can be released to Snap Stable. (Currently newest is at Snap Candidate).
|
||||
|
||||
## WeKan features
|
||||
|
||||
Most Meteor WeKan features are listed here:
|
||||
|
||||
https://github.com/wekan/wekan/wiki/Deep-Dive-Into-WeKan
|
||||
|
||||
Remaining features and all changes are listed here:
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
@@ -2,23 +2,34 @@
|
||||
|
||||
# WeKan ® - Open Source kanban
|
||||
|
||||
## Downloads
|
||||
|
||||
https://wekan.github.io / Install WeKan ® Server
|
||||
|
||||
## Docker Containers
|
||||
|
||||
- [GitHub](https://github.com/wekan/wekan/pkgs/container/wekan)
|
||||
- [Quay](https://quay.io/repository/wekan/wekan)
|
||||
- [Docker Hub](https://hub.docker.com/r/wekanteam/wekan)
|
||||
|
||||
Other platforms and compatible software versions at https://wekan.github.io Download section.
|
||||
docker-compose.yml at https://github.com/wekan/wekan/blob/main/docker-compose.yml
|
||||
|
||||
## Standards
|
||||
|
||||
- [WeKan and Standard for Public Code](https://wekan.github.io/standard-for-public-code/) assessment was made at 2023-11.
|
||||
Currently Wekan meets 8 out of 16 criteria out of the box.
|
||||
Some others could be met with small changes.
|
||||
|
||||
## Code stats
|
||||
|
||||
- [CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619)
|
||||
- [Code Climate](https://codeclimate.com/github/wekan/wekan)
|
||||
- [Open Hub](https://www.openhub.net/p/wekan)
|
||||
- [OSS Insight](https://ossinsight.io/analyze/wekan/wekan)
|
||||
- [CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619)
|
||||
|
||||
## [Translate WeKan ® at Transifex](https://app.transifex.com/wekan/)
|
||||
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/) using webbrowser.
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/wekan) using webbrowser.
|
||||
New English strings of new features can be added as PRs to master branch file wekan/imports/i18n/data/en.i18n.json .
|
||||
|
||||
## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues)
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ and by by companies that have 30k users.
|
||||
## SSL/TLS
|
||||
|
||||
- SSL/TLS encrypts traffic between webbrowser and webserver.
|
||||
- If you are thinking about TLS MITM, look at Caddy 2 webserver MITM detections.
|
||||
- If you are thinking about TLS MITM, look at https://github.com/caddyserver/caddy/issues/2530
|
||||
- Let's Encrypt TLS requires publicly accessible webserver, that Let's Encrypt TLS validation servers check.
|
||||
- If firewall limits to only allowed IP addresses, you may need non-Let's Encrypt TLS cert.
|
||||
- For On Premise:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v7.19.0"
|
||||
appVersion: "v7.44.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -37,9 +37,24 @@ If *nix: chmod +x api.py => ./api.py users
|
||||
python3 api.py customfields BOARDID # Custom Fields of BOARDID
|
||||
python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID
|
||||
python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE # Edit Custom Field
|
||||
python3 api.py listattachments BOARDID # List attachments
|
||||
python3 api.py cardsbyswimlane SWIMLANEID LISTID # Retrieve cards list on a swimlane
|
||||
python3 api.py getcard BOARDID LISTID CARDID # Get card info
|
||||
python3 api.py addlabel BOARDID LISTID CARDID LABELID # Add label to a card
|
||||
python3 api.py addcardwithlabel AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION LABELIDS # Add a card and a label
|
||||
python3 api.py editboardtitle BOARDID NEWBOARDTITLE # Edit board title
|
||||
python3 api.py copyboard BOARDID NEWBOARDTITLE # Copy a board
|
||||
python3 api.py createlabel BOARDID LABELCOLOR LABELNAME (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Create a new label
|
||||
python3 api.py editcardcolor BOARDID LISTID CARDID COLOR (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Edit card color
|
||||
python3 api.py addchecklist BOARDID CARDID TITLE ITEM1 ITEM2 ITEM3 ITEM4 (You can add multiple items or just one, or also without any item, just TITLE works as well. * If items or Title contains spaces, you should add ' between them.) # Add checklist + item on a card
|
||||
python3 api.py deleteallcards BOARDID SWIMLANEID ( * Be careful will delete ALL CARDS INSIDE the swimlanes automatically in every list * ) # Delete all cards on a swimlane
|
||||
python3 api.py checklistid BOARDID CARDID # Retrieve Checklist ID attached to a card
|
||||
python3 api.py checklistinfo BOARDID CARDID CHECKLISTID # Get checklist info
|
||||
python3 api.py get_list_cards_count BOARDID LISTID # Retrieve how many cards in a list
|
||||
python3 api.py get_board_cards_count BOARDID # Retrieve how many cards in a board
|
||||
|
||||
|
||||
Admin API:
|
||||
python3 api.py users # All users
|
||||
python3 api.py boards # All Public Boards
|
||||
@@ -179,6 +194,52 @@ if arguments == 10:
|
||||
print(body.text)
|
||||
# ------- ADD CUSTOM FIELD TO BOARD END -----------
|
||||
|
||||
if arguments == 8:
|
||||
|
||||
if sys.argv[1] == 'addcardwithlabel':
|
||||
# ------- ADD CARD WITH LABEL START -----------
|
||||
authorid = sys.argv[2]
|
||||
boardid = sys.argv[3]
|
||||
swimlaneid = sys.argv[4]
|
||||
listid = sys.argv[5]
|
||||
cardtitle = sys.argv[6]
|
||||
carddescription = sys.argv[7]
|
||||
labelIds = sys.argv[8] # Aggiunto labelIds
|
||||
|
||||
cardtolist = wekanurl + apiboards + boardid + s + l + s + listid + s + cs
|
||||
# Add card
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
post_data = {
|
||||
'authorId': '{}'.format(authorid),
|
||||
'title': '{}'.format(cardtitle),
|
||||
'description': '{}'.format(carddescription),
|
||||
'swimlaneId': '{}'.format(swimlaneid),
|
||||
'labelIds': labelIds
|
||||
}
|
||||
|
||||
body = requests.post(cardtolist, data=post_data, headers=headers)
|
||||
print(body.text)
|
||||
|
||||
# If ok id card
|
||||
if body.status_code == 200:
|
||||
card_data = body.json()
|
||||
new_card_id = card_data.get('_id')
|
||||
|
||||
# Updating card
|
||||
if new_card_id:
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + new_card_id
|
||||
put_data = {'labelIds': labelIds}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== EDIT CARD ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
else:
|
||||
print("Error obraining ID.")
|
||||
else:
|
||||
print("Error adding card.")
|
||||
# ------- ADD CARD WITH LABEL END -----------
|
||||
|
||||
if arguments == 7:
|
||||
|
||||
if sys.argv[1] == 'addcard':
|
||||
@@ -237,7 +298,53 @@ if arguments == 6:
|
||||
print(data2)
|
||||
# ------- EDIT CUSTOMFIELD END -----------
|
||||
|
||||
if arguments == 4:
|
||||
if arguments == 5:
|
||||
|
||||
if sys.argv[1] == 'addlabel':
|
||||
|
||||
# ------- EDIT CARD ADD LABEL START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
labelIds = sys.argv[5]
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
print(edcard)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
put_data = {'labelIds': labelIds}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== ADD LABEL ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
# ------- EDIT CARD ADD LABEL END -----------
|
||||
|
||||
if sys.argv[1] == 'editcardcolor':
|
||||
# ------- EDIT CARD COLOR START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
newcolor = sys.argv[5]
|
||||
|
||||
valid_colors = ['white', 'green', 'yellow', 'orange', 'red', 'purple', 'blue', 'sky', 'lime', 'pink', 'black',
|
||||
'silver', 'peachpuff', 'crimson', 'plum', 'darkgreen', 'slateblue', 'magenta', 'gold', 'navy',
|
||||
'gray', 'saddlebrown', 'paleturquoise', 'mistyrose', 'indigo']
|
||||
|
||||
if newcolor not in valid_colors:
|
||||
print("Invalid color. Choose a color from the list.")
|
||||
sys.exit(1)
|
||||
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
print(edcard)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
put_data = {'color': '{}'.format(newcolor)}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== EDIT CARD COLOR ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
# ------- EDIT CARD COLOR END -----------
|
||||
|
||||
if arguments >= 4:
|
||||
|
||||
if sys.argv[1] == 'newuser':
|
||||
|
||||
@@ -251,9 +358,155 @@ if arguments == 4:
|
||||
print("=== CREATE NEW USER ===\n")
|
||||
print(body.text)
|
||||
# ------- CREATE NEW USER END -----------
|
||||
|
||||
if sys.argv[1] == 'getcard':
|
||||
|
||||
# ------- LIST OF CARD START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
listone = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
print("=== INFO OF ONE LIST ===\n")
|
||||
print("URL:", listone) # Stampa l'URL per debug
|
||||
try:
|
||||
response = requests.get(listone, headers=headers)
|
||||
print("=== RESPONSE ===\n")
|
||||
print("Status Code:", response.status_code) # Stampa il codice di stato per debug
|
||||
|
||||
if response.status_code == 200:
|
||||
data2 = response.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
else:
|
||||
print(f"Error: {response.status_code}")
|
||||
print(f"Response: {response.text}")
|
||||
except Exception as e:
|
||||
print(f"Error in the GET request: {e}")
|
||||
# ------- LISTS OF CARD END -----------
|
||||
|
||||
if sys.argv[1] == 'createlabel':
|
||||
|
||||
# ------- CREATE LABEL START -----------
|
||||
boardid = sys.argv[2]
|
||||
labelcolor = sys.argv[3]
|
||||
labelname = sys.argv[4]
|
||||
label_url = wekanurl + apiboards + boardid + s + 'labels'
|
||||
print(label_url)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
# Object to send
|
||||
put_data = {'label': {'color': labelcolor, 'name': labelname}}
|
||||
print("URL:", label_url)
|
||||
print("Headers:", headers)
|
||||
print("Data:", put_data)
|
||||
try:
|
||||
response = requests.put(label_url, json=put_data, headers=headers)
|
||||
print("=== CREATE LABELS ===\n")
|
||||
print("Response Status Code:", response.status_code)
|
||||
print("Response Text:", response.text)
|
||||
except Exception as e:
|
||||
print("Error:", e)
|
||||
# ------- CREATE LABEL END -----------
|
||||
|
||||
if sys.argv[1] == 'addchecklist':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
checklist_title = sys.argv[4]
|
||||
|
||||
# Aggiungi la checklist
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists'
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
data = {'title': checklist_title}
|
||||
|
||||
response = requests.post(checklist_url, data=data, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
result = json.loads(response.text)
|
||||
checklist_id = result.get('_id')
|
||||
|
||||
print(f"Checklist '{checklist_title}' created. ID: {checklist_id}")
|
||||
|
||||
# Aggiungi gli items alla checklist
|
||||
items_to_add = sys.argv[5:]
|
||||
for item_title in items_to_add:
|
||||
checklist_item_url = wekanurl + apiboards + board_id + s + cs + s + card_id + s + 'checklists' + s + checklist_id + '/items'
|
||||
item_data = {'title': item_title}
|
||||
|
||||
item_response = requests.post(checklist_item_url, data=item_data, headers=headers)
|
||||
item_response.raise_for_status()
|
||||
|
||||
item_result = json.loads(item_response.text)
|
||||
checklist_item_id = item_result.get('_id')
|
||||
|
||||
print(f"Item '{item_title}' added. ID: {checklist_item_id}")
|
||||
|
||||
if sys.argv[1] == 'checklistinfo':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
checklist_id = sys.argv[4]
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists' + s + checklist_id
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
|
||||
checklist_info = response.json()
|
||||
print("Checklist Info:")
|
||||
print(checklist_info)
|
||||
|
||||
if arguments == 3:
|
||||
|
||||
if sys.argv[1] == 'editboardtitle':
|
||||
|
||||
# ------- EDIT BOARD TITLE START -----------
|
||||
boardid = sys.argv[2]
|
||||
boardtitle = sys.argv[3]
|
||||
edboardtitle = wekanurl + apiboards + boardid + s + 'title'
|
||||
print(edboardtitle)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
post_data = {'title': boardtitle}
|
||||
|
||||
body = requests.put(edboardtitle, json=post_data, headers=headers)
|
||||
print("=== EDIT BOARD TITLE ===\n")
|
||||
#body = requests.get(edboardtitle, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
if body.status_code == 200:
|
||||
print("Succesfull!")
|
||||
else:
|
||||
print(f"Error: {body.status_code}")
|
||||
print(body.text)
|
||||
|
||||
# ------- EDIT BOARD TITLE END -----------
|
||||
|
||||
if sys.argv[1] == 'copyboard':
|
||||
|
||||
# ------- COPY BOARD START -----------
|
||||
boardid = sys.argv[2]
|
||||
boardtitle = sys.argv[3]
|
||||
edboardcopy = wekanurl + apiboards + boardid + s + 'copy'
|
||||
print(edboardcopy)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
post_data = {'title': boardtitle}
|
||||
|
||||
body = requests.post(edboardcopy, json=post_data, headers=headers)
|
||||
print("=== COPY BOARD ===\n")
|
||||
#body = requests.get(edboardcopy, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
if body.status_code == 200:
|
||||
print("Succesfull!")
|
||||
else:
|
||||
print(f"Error: {body.status_code}")
|
||||
print(body.text)
|
||||
|
||||
# ------- COPY BOARD END -----------
|
||||
|
||||
if sys.argv[1] == 'createlist':
|
||||
|
||||
# ------- CREATE LIST START -----------
|
||||
@@ -293,6 +546,90 @@ if arguments == 3:
|
||||
print(data2)
|
||||
# ------- INFO OF CUSTOM FIELD END -----------
|
||||
|
||||
if sys.argv[1] == 'cardsbyswimlane':
|
||||
# ------- RETRIEVE CARDS BY SWIMLANE ID START -----------
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
cardsbyswimlane = wekanurl + apiboards + boardid + s + sws + s + swimlaneid + s + cs
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
print("=== CARDS BY SWIMLANE ID ===\n")
|
||||
print("URL:", cardsbyswimlane) # Debug
|
||||
try:
|
||||
body = requests.get(cardsbyswimlane, headers=headers)
|
||||
print("Status Code:", body.status_code) # Debug
|
||||
data = body.text.replace('}', "}\n")
|
||||
print("Data:", data)
|
||||
except Exception as e:
|
||||
print("Error GET:", e)
|
||||
# ------- RETRIEVE CARDS BY SWIMLANE ID END -----------
|
||||
|
||||
if sys.argv[1] == 'deleteallcards':
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
|
||||
# ------- GET SWIMLANE CARDS START -----------
|
||||
get_swimlane_cards_url = wekanurl + apiboards + boardid + s + "swimlanes" + s + swimlaneid + s + "cards"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_swimlane_cards_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
cards_data = response.json()
|
||||
|
||||
# Print the details of each card
|
||||
for card in cards_data:
|
||||
# ------- DELETE CARD START -----------
|
||||
delete_card_url = wekanurl + apiboards + boardid + s + "lists" + s + card['listId'] + s + "cards" + s + card['_id']
|
||||
try:
|
||||
response = requests.delete(delete_card_url, headers=headers)
|
||||
if response.status_code == 404:
|
||||
print(f"Card not found: {card['_id']}")
|
||||
else:
|
||||
response.raise_for_status()
|
||||
deleted_card_data = response.json()
|
||||
print(f"Card Deleted Successfully. Card ID: {deleted_card_data['_id']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error deleting card: {e}")
|
||||
# ------- DELETE CARD END -----------
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error getting swimlane cards: {e}")
|
||||
sys.exit(1)
|
||||
# ------- GET SWIMLANE CARDS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_list_cards_count':
|
||||
# ------- GET LIST CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
|
||||
get_list_cards_count_url = wekanurl + apiboards + boardid + s + l + s + listid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_list_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"List Cards Count: {data['list_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET LIST CARDS COUNT END -----------
|
||||
|
||||
if sys.argv[1] == 'checklistid':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists'
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
checklists = response.json()
|
||||
print("Checklists:")
|
||||
for checklist in checklists:
|
||||
print(checklist)
|
||||
|
||||
if arguments == 2:
|
||||
|
||||
# ------- BOARDS LIST START -----------
|
||||
@@ -364,6 +701,22 @@ if arguments == 2:
|
||||
print(data2)
|
||||
# ------- LISTS OF ATTACHMENTS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_board_cards_count':
|
||||
# ------- GET BOARD CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
|
||||
get_board_cards_count_url = wekanurl + apiboards + boardid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_board_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"Board Cards Count: {data['board_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET BOARD CARDS COUNT END -----------
|
||||
|
||||
if arguments == 1:
|
||||
|
||||
if sys.argv[1] == 'users':
|
||||
|
||||
@@ -1690,6 +1690,11 @@
|
||||
padding: 4px;
|
||||
font-size: 14px;
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.board-color-moderndark#header-quick-access {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
.board-color-moderndark#header-quick-access .allBoards {
|
||||
padding: 5px 10px 0 10px;
|
||||
}
|
||||
@@ -1786,6 +1791,10 @@
|
||||
@media screen and (max-width: 800px) {
|
||||
.board-color-moderndark .list-header .list-header-name {
|
||||
line-height: 40px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
.board-color-moderndark .list-header-black, .board-color-moderndark .mini-list {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
@@ -1797,7 +1806,6 @@
|
||||
}
|
||||
}
|
||||
.board-color-moderndark .list-header .list-header-menu {
|
||||
padding: 10px;
|
||||
top: 0;
|
||||
}
|
||||
.board-color-moderndark .list-header .list-header-plus-top {
|
||||
@@ -1894,17 +1902,20 @@
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.board-color-moderndark .card-details {
|
||||
width: 98%;
|
||||
width: 94%;
|
||||
}
|
||||
.card-details-popup {
|
||||
padding: 0px;
|
||||
.board-color-moderndark .card-details-popup {
|
||||
padding: 0;
|
||||
}
|
||||
.card-details-left, .card-details-right {
|
||||
padding: 0px 10px;
|
||||
.board-color-moderndark .card-details-left, .board-color-moderndark .card-details-right {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
.card-details .card-details-header .card-details-menu-mobile-web {
|
||||
.board-color-moderndark .card-details .card-details-header .card-details-menu-mobile-web {
|
||||
margin-right: 0;
|
||||
}
|
||||
.board-color-moderndark .pop-over > .content-wrapper > .popup-container-depth-0 > .content {
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
.board-color-moderndark .card-details {
|
||||
|
||||
@@ -51,8 +51,9 @@ template(name="attachmentGallery")
|
||||
|
||||
.attachment-gallery
|
||||
|
||||
a.attachment-item.add-attachment.js-add-attachment
|
||||
i.fa.fa-plus.icon
|
||||
if canModifyCard
|
||||
a.attachment-item.add-attachment.js-add-attachment
|
||||
i.fa.fa-plus.icon
|
||||
|
||||
each attachments
|
||||
|
||||
|
||||
@@ -13,11 +13,12 @@ template(name="cardDetails")
|
||||
unless isMiniScreen
|
||||
unless isPopup
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
|
||||
if cardMaximized
|
||||
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
|
||||
else
|
||||
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
|
||||
if currentUser.isBoardMember
|
||||
if canModifyCard
|
||||
if cardMaximized
|
||||
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
|
||||
else
|
||||
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
|
||||
if canModifyCard
|
||||
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
a.fa.fa-link.card-copy-button.js-copy-link(
|
||||
id="cardURL_copy"
|
||||
@@ -29,7 +30,7 @@ template(name="cardDetails")
|
||||
else
|
||||
unless isPopup
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
|
||||
if currentUser.isBoardMember
|
||||
if canModifyCard
|
||||
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
a.fa.fa-link.card-copy-mobile-button.js-copy-link(
|
||||
id="cardURL_copy"
|
||||
|
||||
@@ -56,10 +56,12 @@
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-right: 30px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.minicard-details-menu {
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
@media print {
|
||||
.minicard-details-menu,
|
||||
@@ -99,7 +101,7 @@
|
||||
background-size: contain;
|
||||
height: 145px;
|
||||
user-select: none;
|
||||
margin: -6px -8px 6px -8px;
|
||||
margin: 6px -8px 6px -8px;
|
||||
border-radius: top 2px;
|
||||
}
|
||||
.minicard .minicard-labels {
|
||||
@@ -173,7 +175,6 @@
|
||||
.minicard .minicard-title .viewer {
|
||||
display: block;
|
||||
word-wrap: break-word;
|
||||
max-width: 230px;
|
||||
}
|
||||
}
|
||||
.minicard .dates {
|
||||
|
||||
@@ -3,12 +3,13 @@ template(name="minicard")
|
||||
class="{{#if isLinkedCard}}linked-card{{/if}}"
|
||||
class="{{#if isLinkedBoard}}linked-board{{/if}}"
|
||||
class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}")
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.fa.fa-navicon.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
else
|
||||
a.fa.fa-navicon.minicard-details-menu.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
if canModifyCard
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.fa.fa-navicon.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
else
|
||||
a.fa.fa-navicon.minicard-details-menu.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.dates
|
||||
if getReceived
|
||||
unless getStart
|
||||
@@ -129,12 +130,12 @@ template(name="minicard")
|
||||
each getMembers
|
||||
+userAvatar(userId=this)
|
||||
|
||||
if showCreator
|
||||
if showCreatorOnMinicard
|
||||
.minicard-creator
|
||||
+userAvatar(userId=this.userId noRemove=true)
|
||||
|
||||
.badges
|
||||
unless currentUser.isNoComments
|
||||
if canModifyCard
|
||||
if comments.length
|
||||
.badge(title="{{_ 'card-comments-title' comments.length }}")
|
||||
span.badge-icon.fa.fa-comment-o.badge-comment.badge-text
|
||||
@@ -189,12 +190,11 @@ template(name="editCardSortOrderPopup")
|
||||
|
||||
template(name="minicardDetailsActionsPopup")
|
||||
ul.pop-over-list
|
||||
if currentUser.isBoardAdmin
|
||||
if canModifyCard
|
||||
li
|
||||
a.js-move-card
|
||||
i.fa.fa-arrow-right
|
||||
| {{_ 'moveCardPopup-title'}}
|
||||
unless currentUser.isWorker
|
||||
li
|
||||
a.js-copy-card
|
||||
i.fa.fa-copy
|
||||
|
||||
@@ -37,15 +37,15 @@ BlazeComponent.extendComponent({
|
||||
return ret;
|
||||
},
|
||||
|
||||
showCreator() {
|
||||
showCreatorOnMinicard() {
|
||||
// cache "board" to reduce the mini-mongodb access
|
||||
const board = this.data().board();
|
||||
let ret = false;
|
||||
if (board) {
|
||||
ret =
|
||||
board.allowsCreator === null ||
|
||||
board.allowsCreator === undefined ||
|
||||
board.allowsCreator
|
||||
board.allowsCreatorOnMinicard === null ||
|
||||
board.allowsCreatorOnMinicard === undefined ||
|
||||
board.allowsCreatorOnMinicard
|
||||
;
|
||||
}
|
||||
return ret;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
border-left: 1px solid #ccc;
|
||||
padding: 0;
|
||||
float: left;
|
||||
min-width: 100px; /* TODO(mark-i-m): hardcoded? */
|
||||
/* min-width: 100px; TODO(mark-i-m): hardcoded? */
|
||||
/*max-width: 270px;*/
|
||||
/* Reverted incomplete change list width: */
|
||||
/* https://github.com/wekan/wekan/issues/4558 */
|
||||
@@ -82,6 +82,16 @@
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.list-rotated {
|
||||
width: 10px;
|
||||
margin-top: 10px;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
transform: rotate(90deg);
|
||||
position: relative;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.list-header .list-header-watch-icon {
|
||||
padding-left: 10px;
|
||||
color: #a6a6a6;
|
||||
@@ -99,6 +109,23 @@
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-collapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse-left {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-uncollapse-left {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-uncollapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .highlight {
|
||||
color: #ce1414;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
template(name='list')
|
||||
.list.js-list(id="js-list-{{_id}}"
|
||||
style="width:{{listWidth}}px;")
|
||||
style="{{#unless collapsed}}width:{{listWidth}}px;{{/unless}}"
|
||||
class="{{#if collapsed}}list-collapsed{{/if}}")
|
||||
+listHeader
|
||||
+listBody
|
||||
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
template(name="listBody")
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
unless collapsed
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
|
||||
template(name="spinnerList")
|
||||
.sk-spinner.sk-spinner-list(
|
||||
|
||||
@@ -5,22 +5,43 @@ template(name="listHeader")
|
||||
+inlinedForm
|
||||
+editListTitleForm
|
||||
else
|
||||
unless isMiniScreen
|
||||
if collapsed
|
||||
a.js-collapse(title="{{_ 'uncollapse'}}")
|
||||
i.fa.fa-arrow-left.list-header-uncollapse-left
|
||||
i.fa.fa-arrow-right.list-header-uncollapse-right
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
|
||||
unless isMiniScreen
|
||||
if collapsed
|
||||
if showCardsCountForList cards.length
|
||||
br
|
||||
span.cardCount {{cardsCount}}
|
||||
if isMiniScreen
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
unless isMiniScreen
|
||||
div(class="{{#if collapsed}}list-rotated{{/if}}")
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
unless collapsed
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
if isWatching
|
||||
@@ -36,16 +57,20 @@ template(name="listHeader")
|
||||
else if currentUser.isBoardMember
|
||||
if isWatching
|
||||
i.list-header-watch-icon.fa.fa-eye
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
unless collapsed
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.js-collapse(title="{{_ 'collapse'}}")
|
||||
i.fa.fa-arrow-right.list-header-collapse-right
|
||||
i.fa.fa-arrow-left.list-header-collapse-left
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
|
||||
template(name="editListTitleForm")
|
||||
.list-composer
|
||||
|
||||
@@ -31,6 +31,17 @@ BlazeComponent.extendComponent({
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const list = Template.currentData();
|
||||
const status = list.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
list.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
editTitle(event) {
|
||||
event.preventDefault();
|
||||
const newTitle = this.childComponents('inlinedForm')[0]
|
||||
@@ -104,6 +115,10 @@ BlazeComponent.extendComponent({
|
||||
event.preventDefault();
|
||||
this.starred(!this.starred());
|
||||
},
|
||||
'click .js-collapse'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-list-menu': Popup.open('listAction'),
|
||||
'click .js-add-card.list-header-plus-top'(event) {
|
||||
const listDom = $(event.target).parents(
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
.new-comment a.fa.fa-brands.fa-markdown,
|
||||
.inlined-form a.fa.fa-brands.fa-markdown {
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 20px;
|
||||
right: 56px;
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
right: 60px;
|
||||
}
|
||||
.new-comment a.fa.fa-copy,
|
||||
.inlined-form a.fa.fa-copy {
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 20px;
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
right: 6px;
|
||||
}
|
||||
.js-inlined-form.viewer.btn-sm {
|
||||
|
||||
@@ -470,6 +470,7 @@ a:not(.disabled).is-active i.fa {
|
||||
.select-authentication {
|
||||
width: 100%;
|
||||
}
|
||||
.textBelowCustomLoginLogo,
|
||||
.auth-layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -37,10 +37,13 @@ template(name="userFormsLayout")
|
||||
else
|
||||
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
hr
|
||||
section.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
hr
|
||||
section.auth-layout
|
||||
section.auth-dialog
|
||||
if isLoading
|
||||
+loader
|
||||
|
||||
@@ -175,7 +175,7 @@ template(name="boardInfoOnMyBoardsPopup")
|
||||
|
||||
template(name="boardCardSettingsPopup")
|
||||
form.board-card-settings
|
||||
h3 {{_ 'show-on-card'}}
|
||||
h3 {{_ 'show-on-card'}}, {{_ 'show-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-receiveddate(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||
@@ -206,14 +206,18 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-users
|
||||
| {{_ 'members'}}
|
||||
|
||||
div.check-div
|
||||
a.flex.js-field-has-creator(class="{{#if allowsCreator}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCreator}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-user
|
||||
| {{_ 'creator'}}
|
||||
|
||||
div.check-div
|
||||
a.flex.js-field-has-creator-on-minicard(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-user
|
||||
| {{_ 'creator-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-assignee(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||
@@ -238,6 +242,12 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-sorting-by-number-on-minicard(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-show-lists(class="{{#if allowsShowLists}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsShowLists}}is-checked{{/if}}")
|
||||
@@ -271,6 +281,12 @@ template(name="boardCardSettingsPopup")
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description'}}
|
||||
| {{_ 'custom-field-text'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-description-text-on-minicard(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-checklists(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||
@@ -289,6 +305,19 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'attachments'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-badge-attachment-on-minicard(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'badge-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-cover-attachment-on-minicard(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-book
|
||||
i.fa.fa-picture-o
|
||||
| {{_ 'cover-attachment-on-minicard'}}
|
||||
//div.check-div
|
||||
// a.flex.js-field-has-comments(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||
// .materialCheckBox(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||
@@ -302,35 +331,6 @@ template(name="boardCardSettingsPopup")
|
||||
// i.fa.fa-history
|
||||
// | {{_ 'activities'}}
|
||||
|
||||
template(name="boardMinicardSettingsPopup")
|
||||
form.board-minicard-settings
|
||||
h3 {{_ 'show-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-description-text-on-minicard(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-cover-attachment-on-minicard(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-book
|
||||
i.fa.fa-picture-o
|
||||
| {{_ 'cover-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-badge-attachment-on-minicard(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'badge-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-sorting-by-number-on-minicard(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number-on-minicard'}}
|
||||
|
||||
template(name="boardSubtaskSettingsPopup")
|
||||
form.board-subtask-settings
|
||||
h3 {{_ 'show-parent-in-minicard'}}
|
||||
@@ -473,10 +473,6 @@ template(name="boardMenuPopup")
|
||||
a.js-card-settings
|
||||
i.fa.fa-id-card-o
|
||||
| {{_ 'card-settings'}}
|
||||
li
|
||||
a.js-minicard-settings
|
||||
i.fa.fa-id-card-o
|
||||
| {{_ 'minicard-settings'}}
|
||||
li
|
||||
a.js-subtask-settings
|
||||
i.fa.fa-sitemap
|
||||
|
||||
@@ -236,7 +236,6 @@ Template.boardMenuPopup.events({
|
||||
'click .js-import-board': Popup.open('chooseBoardSource'),
|
||||
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||
'click .js-card-settings': Popup.open('boardCardSettings'),
|
||||
'click .js-minicard-settings': Popup.open('boardMinicardSettings'),
|
||||
'click .js-export-board': Popup.open('exportBoard'),
|
||||
});
|
||||
|
||||
@@ -921,6 +920,14 @@ BlazeComponent.extendComponent({
|
||||
);
|
||||
},
|
||||
|
||||
allowsCreatorOnMinicard() {
|
||||
return (
|
||||
this.currentBoard.allowsCreatorOnMinicard === null ||
|
||||
this.currentBoard.allowsCreatorOnMinicard === undefined ||
|
||||
this.currentBoard.allowsCreatorOnMinicard
|
||||
);
|
||||
},
|
||||
|
||||
allowsMembers() {
|
||||
return this.currentBoard.allowsMembers;
|
||||
},
|
||||
@@ -984,6 +991,22 @@ BlazeComponent.extendComponent({
|
||||
);
|
||||
},
|
||||
|
||||
allowsDescriptionTextOnMinicard() {
|
||||
return this.currentBoard.allowsDescriptionTextOnMinicard;
|
||||
},
|
||||
|
||||
allowsCoverAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsCoverAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsBadgeAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsBadgeAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsCardSortingByNumberOnMinicard() {
|
||||
return this.currentBoard.allowsCardSortingByNumberOnMinicard;
|
||||
},
|
||||
|
||||
boards() {
|
||||
const ret = ReactiveCache.getBoards(
|
||||
{
|
||||
@@ -1106,6 +1129,19 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsCreator,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-creator-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsCreatorOnMinicard = !this.currentBoard.allowsCreatorOnMinicard;
|
||||
this.currentBoard.setAllowsCreatorOnMinicard(this.currentBoard.allowsCreatorOnMinicard);
|
||||
$(`.js-field-has-creator-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsCreatorOnMinicard,
|
||||
);
|
||||
$('.js-field-has-creator-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsCreatorOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-members'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsMembers = !this.currentBoard.allowsMembers;
|
||||
@@ -1241,6 +1277,22 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsCardNumber,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-description-text-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard = !this.currentBoard
|
||||
.allowsDescriptionTextOnMinicard;
|
||||
this.currentBoard.setallowsDescriptionTextOnMinicard(
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$(`.js-field-has-description-text-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$('.js-field-has-description-text-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-description-text'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionText = !this.currentBoard
|
||||
@@ -1318,74 +1370,6 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsActivities,
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('boardCardSettingsPopup');
|
||||
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.currentBoard = Utils.getCurrentBoard();
|
||||
},
|
||||
|
||||
allowsDescriptionTextOnMinicard() {
|
||||
return this.currentBoard.allowsDescriptionTextOnMinicard;
|
||||
},
|
||||
|
||||
allowsCoverAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsCoverAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsBadgeAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsBadgeAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsCardSortingByNumberOnMinicard() {
|
||||
return this.currentBoard.allowsCardSortingByNumberOnMinicard;
|
||||
},
|
||||
|
||||
lists() {
|
||||
return ReactiveCache.getLists(
|
||||
{
|
||||
boardId: this.currentBoard._id,
|
||||
archived: false,
|
||||
},
|
||||
{
|
||||
sort: ['title'],
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
hasLists() {
|
||||
return this.lists().length > 0;
|
||||
},
|
||||
|
||||
isListSelected() {
|
||||
return (
|
||||
this.currentBoard.dateSettingsDefaultBoardId === this.currentData()._id
|
||||
);
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-field-has-description-text-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard = !this.currentBoard
|
||||
.allowsDescriptionTextOnMinicard;
|
||||
this.currentBoard.setallowsDescriptionTextOnMinicard(
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$(`.js-field-has-description-text-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$('.js-field-has-description-text-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-cover-attachment-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsCoverAttachmentOnMinicard = !this.currentBoard
|
||||
@@ -1437,7 +1421,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('boardMinicardSettingsPopup');
|
||||
}).register('boardCardSettingsPopup');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
|
||||
@@ -27,6 +27,15 @@ template(name="swimlaneFixedHeader")
|
||||
if currentUser.isBoardAdmin
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}")
|
||||
//// TODO: Collapse Swimlane: make button working, etc.
|
||||
//unless collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'collapse'}}")
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
//if collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'uncollapse'}}")
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
unless isTouchScreen
|
||||
if isShowDesktopDragHandles
|
||||
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
|
||||
@@ -18,10 +18,25 @@ BlazeComponent.extendComponent({
|
||||
swimlane.rename(newTitle.trim());
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const swimlane = Template.currentData();
|
||||
const status = swimlane.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
swimlane.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-collapse-swimlane'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-swimlane-menu': Popup.open('swimlaneAction'),
|
||||
'click .js-open-add-swimlane-menu': Popup.open('swimlaneAdd'),
|
||||
submit: this.editTitle,
|
||||
|
||||
@@ -1,38 +1,3 @@
|
||||
/*
|
||||
// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
|
||||
.accordion
|
||||
cursor: pointer
|
||||
width: 30px
|
||||
height: 20px
|
||||
border: none
|
||||
outline: none
|
||||
font-size: 18px
|
||||
transition: 0.4s
|
||||
padding-top: 0px
|
||||
margin-top: 0px
|
||||
|
||||
.accordion:after
|
||||
// Unicode triagle right:
|
||||
content: '\25B6'
|
||||
color: #777
|
||||
font-weight: bold
|
||||
float: left
|
||||
|
||||
.active:after
|
||||
// Unicode triangle down:
|
||||
content: '\25BC'
|
||||
|
||||
.panel
|
||||
width: 100%
|
||||
max-height: 0
|
||||
overflow: hidden
|
||||
transition: max-height 0.2s ease-out
|
||||
margin: 0px
|
||||
padding: 0px
|
||||
|
||||
// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
*/
|
||||
@media screen and (min-width: 801px) {
|
||||
.swimlane.ui-sortable {
|
||||
width: max-content;
|
||||
@@ -48,6 +13,28 @@
|
||||
flex-direction: row;
|
||||
overflow: 0;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
bottom: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane.placeholder {
|
||||
background-color: rgba(0,0,0,0.2);
|
||||
border-color: transparent;
|
||||
|
||||
@@ -47,7 +47,7 @@ Blaze.registerHelper('isTouchScreenOrShowDesktopDragHandles', () =>
|
||||
Blaze.registerHelper('moment', (...args) => {
|
||||
args.pop(); // hash
|
||||
const [date, format] = args;
|
||||
return moment(date).format(format);
|
||||
return moment(date).format(format ?? 'LLLL');
|
||||
});
|
||||
|
||||
Blaze.registerHelper('canModifyCard', () =>
|
||||
|
||||
@@ -57,6 +57,9 @@ window.ExportHtml = Popup => {
|
||||
Array.from(
|
||||
document.querySelectorAll('#header-main-bar .board-header-btns'),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(
|
||||
document.querySelectorAll('.js-pop-over, .pop-over'),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(document.querySelectorAll('.list-composer')).forEach(elem =>
|
||||
elem.remove(),
|
||||
);
|
||||
@@ -152,6 +155,50 @@ window.ExportHtml = Popup => {
|
||||
);
|
||||
};
|
||||
|
||||
const getWebFonts = () => {
|
||||
fontUrls = [];
|
||||
|
||||
for (let sheet of document.styleSheets) {
|
||||
// Get the base URL of the stylesheet
|
||||
let baseUrl = sheet.href ? new URL(sheet.href).origin : window.location.origin;
|
||||
|
||||
try {
|
||||
for (let rule of sheet.cssRules) {
|
||||
if (rule.type === CSSRule.FONT_FACE_RULE) {
|
||||
let src = rule.style.getPropertyValue('src');
|
||||
let urlMatch = src.match(/url\(["']?(.+?)["']?\)/);
|
||||
if (urlMatch) {
|
||||
let fontUrl = urlMatch[1];
|
||||
|
||||
// Resolve the URL relative to the stylesheet's base URL
|
||||
let resolvedUrl = new URL(fontUrl, baseUrl);
|
||||
fontUrls.push(resolvedUrl.href); // Using .href to get the absolute URL
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('Access to stylesheet blocked:', e);
|
||||
}
|
||||
}
|
||||
|
||||
return fontUrls;
|
||||
};
|
||||
|
||||
const downloadFonts = async(elements, zip) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(elem);
|
||||
const responseBody = await response.blob();
|
||||
const filename = elem.split('/')
|
||||
.pop()
|
||||
.split('?')
|
||||
.shift()
|
||||
.split('#')
|
||||
.shift();
|
||||
const fileFullPath = `webfonts/${filename}`;
|
||||
zip.file(fileFullPath, responseBody);
|
||||
});
|
||||
}
|
||||
|
||||
const downloadCardCovers = async (elements, zip, boardSlug) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(
|
||||
@@ -194,6 +241,7 @@ window.ExportHtml = Popup => {
|
||||
await downloadStylesheets(getStylesheetList(), zip);
|
||||
await downloadSrcAttached(getSrcAttached(), zip, boardSlug);
|
||||
await downloadCardCovers(getCardCovers(), zip, boardSlug);
|
||||
await downloadFonts(getWebFonts(), zip);
|
||||
|
||||
addBoardHTMLToZip(boardSlug, zip);
|
||||
|
||||
|
||||
@@ -33,6 +33,14 @@ Mousetrap.bind('q', () => {
|
||||
}
|
||||
});
|
||||
|
||||
Mousetrap.bind('a', () => {
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const currentUserId = Meteor.userId();
|
||||
if (currentBoardId && currentUserId) {
|
||||
Filter.assignees.toggle(currentUserId);
|
||||
}
|
||||
});
|
||||
|
||||
Mousetrap.bind('x', () => {
|
||||
if (Filter.isActive()) {
|
||||
Filter.reset();
|
||||
@@ -181,6 +189,10 @@ Template.keyboardShortcuts.helpers({
|
||||
keys: ['q'],
|
||||
action: 'shortcut-filter-my-cards',
|
||||
},
|
||||
{
|
||||
keys: ['a'],
|
||||
action: 'shortcut-filter-my-assigned-cards',
|
||||
},
|
||||
{
|
||||
keys: ['f'],
|
||||
action: 'shortcut-toggle-filterbar',
|
||||
|
||||
+2
-2
@@ -1,5 +1,3 @@
|
||||
version: '2'
|
||||
|
||||
# Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required.
|
||||
#---------------------------------------------------------------------------------------------------------
|
||||
# ==== CREATING USERS AND LOGGING IN TO WEKAN ====
|
||||
@@ -391,6 +389,8 @@ services:
|
||||
#- OAUTH2_CA_CERT=ABCD1234
|
||||
# Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting.
|
||||
#- OAUTH2_ADFS_ENABLED=false
|
||||
# Azure AD B2C. https://github.com/wekan/wekan/issues/5242
|
||||
#- OAUTH2_B2C_ENABLED=false
|
||||
# OAuth2 login style: popup or redirect.
|
||||
#- OAUTH2_LOGIN_STYLE=redirect
|
||||
# Application GUID captured during app registration:
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
## a) Install all Snap updates automatically between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=02:00-04:00
|
||||
```
|
||||
## b) Update once a week at Sunday between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=sun,02:00-04:00
|
||||
```
|
||||
## c) Update last Sunday of the month between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=sun5,02:00-04:00
|
||||
```
|
||||
## [Update until specific day](https://snapcraft.io/docs/keeping-snaps-up-to-date#heading--refresh-hold) and other examples.
|
||||
|
||||
## If required, you can disable all Snap updates
|
||||
at `/etc/hosts` by adding a line:
|
||||
```
|
||||
127.0.0.1 api.snapcraft.io
|
||||
```
|
||||
## No schedule set
|
||||
|
||||
Automatic upgrades happen sometime after Wekan is released, usually quite soon.
|
||||
|
||||
## Manual update immediately
|
||||
|
||||
`sudo snap refresh`
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
Also see [Docker Backup and Restore](https://github.com/wekan/wekan/wiki/Export-Docker-Mongo-Data)
|
||||
|
||||
# MongoDB client based backup
|
||||
|
||||
## Install MongoDB shell 3.2.x
|
||||
|
||||
[MongoDB 3.2.x shell for Ubuntu](https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/)
|
||||
|
||||
## Backup script for MongoDB Data, if running Snap MongoDB at port 27019
|
||||
|
||||
```sh
|
||||
#!/bin/bash
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p backups/$now
|
||||
cd backups/$now
|
||||
mongodump --port 27019
|
||||
# if running on source install, run for example: mongodump --port 27017)
|
||||
cd ..
|
||||
zip -r $now.zip $now
|
||||
cd ../..
|
||||
echo "\nBACKUP DONE."
|
||||
echo "Backup is at directory backups/${now}."
|
||||
echo "Backup is also archived to .zip file backups/${now}.zip"
|
||||
```
|
||||
|
||||
# Manual Backup
|
||||
|
||||
## Stop Wekan and Backup to directory called dump
|
||||
|
||||
```
|
||||
sudo snap stop wekan.wekan
|
||||
|
||||
mongodump --port 27019
|
||||
|
||||
sudo snap start wekan.wekan
|
||||
```
|
||||
## Stop Wekan and Restore
|
||||
|
||||
```
|
||||
sudo snap stop wekan.wekan
|
||||
|
||||
## Only if you get errors about existing indexes, use this instead:
|
||||
## mongorestore -d wekan --drop --noIndexRestore --port 27019
|
||||
mongorestore -d wekan --drop --port 27019
|
||||
|
||||
sudo snap start wekan.wekan
|
||||
```
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
# Snap based backup (less reliable, can disappear with snap remove wekan)
|
||||
|
||||
## Setup backup directory
|
||||
|
||||
Create backup directory and set permissions
|
||||
|
||||
```
|
||||
$ sudo mkdir /var/snap/wekan/common/db-backups
|
||||
$ sudo chmod 777 /var/snap/wekan/common/db-backups
|
||||
```
|
||||
|
||||
## Backup
|
||||
|
||||
As normal user as archive:
|
||||
|
||||
```
|
||||
$ wekan.database-backup
|
||||
```
|
||||
|
||||
Backup is created in directory:
|
||||
|
||||
```
|
||||
/var/snap/wekan/common/db-backups
|
||||
```
|
||||
|
||||
There is optional Backup file is optional parameter `$ wekan.database-backup BACKUPFILENAME`, but probably it does not work.
|
||||
|
||||
## List backups
|
||||
|
||||
You need to first create one backup, otherwise this command shows error.
|
||||
|
||||
To list existing backups in default directory, as normal user:
|
||||
|
||||
```
|
||||
$ wekan.database-list-backups
|
||||
```
|
||||
|
||||
## Restore backup
|
||||
|
||||
As normal user:
|
||||
|
||||
```
|
||||
$ wekan.database-restore FULL-PATH-TO-BACKUP-FILENAME
|
||||
```
|
||||
@@ -0,0 +1,276 @@
|
||||
# NOTE: Using Candidate, that has MongoDB 6, that is newest version
|
||||
|
||||
Required time: If your database size is 500 GB, maybe 4 to 8 hours, or more. So bring enough of pizza, party snacks, limonade etc.
|
||||
|
||||
Warning: If you don't have enough disk space, you could get data loss.
|
||||
|
||||
Warning2: When starting WeKan Candidate, it could temporarily save all attachments to `/var/snap/wekan/common/files/` or other directory below `common`. That's why xet7 is working on trying to create separate migration app that moves attachments to S3, and that WeKan could upload to S3. This upgrade experience could be improved later. It's just that there are some unknown unknows if there would be automatic upgrade, could it handle all upgrade and migration cases.
|
||||
|
||||
If you are have time to try tro update Snap from WeKan Stable to newest WeKan Candidate, to see does update work or not.
|
||||
|
||||
If you have problems, add comment to issue https://github.com/wekan/wekan/issues/4780
|
||||
|
||||
## From WeKan Stable to Candidate
|
||||
|
||||
### Preparation
|
||||
|
||||
#### 1. Please read through all these below steps before starting, if possible.
|
||||
|
||||
#### 2. Check your database size, and do you have enough disk space for upgrade:
|
||||
```
|
||||
sudo du -sh /var/snap/wekan/common
|
||||
|
||||
df -h
|
||||
```
|
||||
For example, if your database size is 500 GB, and disk is nearly full, you need to stop WeKan and move to bigger disk. If disk gets full, there is possibility to MongoDB database corruption. Making mongodump could maybe take 2x of current size, or more.
|
||||
|
||||
Some external disk related steps are at https://github.com/wekan/wekan/wiki/Repair-MongoDB
|
||||
|
||||
#### 3. Problems usually are only, are attachments visible or not. Upgrade steps do not delete any files, if commands below are written correctly.
|
||||
|
||||
Optional steps:
|
||||
|
||||
a) Optionally, you could use [nosqlbooster](https://github.com/wekan/wekan/wiki/Backup#using-nosqlbooster-closed-source-mongodb-gui-with-wekan-snap-to-edit-mongodb-database) to save attachments to files, and export JSON to textfiles, before trying to update. There could also be files at `/var/snap/wekan/common/files` or other subdirectories. When saving attachments, note that there could be many files with same filename.
|
||||
|
||||
b) Optinally, you can also save [all database content to JSON](https://github.com/wekan/wekan/wiki/Export-from-Wekan-Sandstorm-grain-.zip-file#11b-dump-database-to-json-text-files), but if your database is about 500 GB then it could be too much disk space required, because attachments are at base64 encoded text in JSON files. It's better ot save attachments with [nosqlbooster](https://github.com/wekan/wekan/wiki/Backup#using-nosqlbooster-closed-source-mongodb-gui-with-wekan-snap-to-edit-mongodb-database).
|
||||
|
||||
#### 4. ssh to your server
|
||||
```
|
||||
ssh wekanserver
|
||||
```
|
||||
#### 5. Save snap settings and set it as executeable
|
||||
```
|
||||
sudo snap get wekan > snap-settings.sh
|
||||
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
#### 6. Edit `snap-settings.sh` to look like this, with nano or similar
|
||||
```
|
||||
sudo snap set wekan root-url='https://wekan.example.com'
|
||||
sudo snap set wekan port='80'
|
||||
```
|
||||
At nano, Save: Ctrl-o Enter
|
||||
|
||||
At nano. Exit: Ctrl-x
|
||||
|
||||
#### 7. Download newest MongoDB tools for your distro version that will work with MongoDB 5.x, but do not install it yet
|
||||
|
||||
https://www.mongodb.com/try/download/database-tools
|
||||
|
||||
For example, for Ubuntu 22.04, [mongodb-database-tools-ubuntu2204-x86_64-100.6.1.deb](https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-arm64-100.6.1.deb)
|
||||
|
||||
#### 8. Remove old versions of MongoDB tools etc, if you have those
|
||||
|
||||
List them:
|
||||
```
|
||||
dpkg -l | grep mongo
|
||||
```
|
||||
If that shows that you have old mongodb server also, check do you really use it, what is the size of database server files?
|
||||
```
|
||||
sudo du -sh /var/lib/mongodb
|
||||
```
|
||||
Do you have these files, or similar, that show where else mongodb raw database directory could be?
|
||||
```
|
||||
/etc/mongod.conf
|
||||
/etc/mongod/mongod.conf
|
||||
```
|
||||
Try to connect to it, and see if there is anything?
|
||||
```
|
||||
mongo
|
||||
```
|
||||
If it does not connect, maybe start MongoDB database, for example some of these commands:
|
||||
```
|
||||
sudo systemctl enable mongod
|
||||
sudo systemctl start mongod
|
||||
|
||||
sudo systemctl enable mongodb
|
||||
sudo systemctl start mongod
|
||||
|
||||
sudo /etc/init.d/mongod start
|
||||
```
|
||||
Try then again connect, and view what is there. In this example, if there is wekan database listed with `show dbs`:
|
||||
```
|
||||
mongo
|
||||
|
||||
show dbs
|
||||
|
||||
use wekan
|
||||
|
||||
show collections
|
||||
|
||||
db.users.count()
|
||||
|
||||
db.users.find()
|
||||
```
|
||||
Also look is there `mongodb.list` packages repo?
|
||||
```
|
||||
sudo ls /etc/apt/sources.list.d/
|
||||
```
|
||||
If you have all of mongodb-org, try to remove all of them, with all related files:
|
||||
```
|
||||
sudo apt-get --purge remove mongo*
|
||||
```
|
||||
Delete mongodb repo:
|
||||
```
|
||||
sudo ls /etc/apt/sources.list.d/mongo*
|
||||
|
||||
sudo apt update
|
||||
|
||||
sudo apt clean
|
||||
|
||||
sudo apt -y autoclean
|
||||
|
||||
sudo apt -y autoremove
|
||||
```
|
||||
|
||||
### Upgrade
|
||||
|
||||
#### 9. Stop wekan app
|
||||
```
|
||||
sudo snap stop wekan.wekan
|
||||
```
|
||||
#### 10. Use WeKan Stable Snap mongodump version for dumping database
|
||||
```
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
|
||||
mongodump --port 27019
|
||||
```
|
||||
#### 11. Move common directory contents. There are raw database files and maybe some attachments.
|
||||
```
|
||||
sudo snap stop wekan
|
||||
|
||||
sudo mkdir common
|
||||
|
||||
sudo mv /var/snap/wekan/common/* common/
|
||||
|
||||
sudo rm -rf /var/snap/wekan/common/*
|
||||
```
|
||||
#### 12. Change from Stable to Candidate
|
||||
```
|
||||
sudo snap refresh wekan --channel=latest/candidate
|
||||
```
|
||||
#### 13. Exit ssh and connect again, to not use old mongodump version anymore
|
||||
```
|
||||
exit
|
||||
|
||||
ssh wekanserver
|
||||
```
|
||||
#### 14. Install mongodb tools for your distro version (from [step 7](#7-download-newest-mongodb-tools-for-your-distro-version-that-will-work-with-mongodb-5x-but-do-not-install-it-yet) above)
|
||||
```
|
||||
sudo dpkg -i mongodb-database-tools-ubuntu2204-x86_64-100.6.1.deb
|
||||
```
|
||||
If there is any errors, please copy all text from install process to comment to issue https://github.com/wekan/wekan/issues/4780
|
||||
|
||||
When installing some package, if some dependendencies are missing, they can usually be installed with some of these commands, and installing continued with::
|
||||
```
|
||||
sudo apt-get -f install
|
||||
|
||||
sudo dpkg --configure -a
|
||||
```
|
||||
If you get this kind of error, it means you have existing version of MongoDB Tools still installed, you should remove all those like at step 7 above:
|
||||
```
|
||||
Unpacking mongodb-database-tools (100.6.1) ...
|
||||
dpkg: error processing archive mongodb-database-tools-ubuntu2004-x86_64-100.6.1.deb (--install):
|
||||
trying to overwrite '/usr/bin/bsondump', which is also in package mongo-tools 3.6.3-0ubuntu1
|
||||
```
|
||||
Sure there are options to force install this, for example this way, but not recommended:
|
||||
```
|
||||
sudo rm /usr/bin/bsondump
|
||||
|
||||
sudo dpkg -i ...
|
||||
```
|
||||
Or other not recommended way, forcing overwrite:
|
||||
```
|
||||
sudo dpkg -i --force-overwrite mongodb-database-tools-ubuntu2004-x86_64-100.6.1.deb
|
||||
```
|
||||
But better would be to use that [step 7](#7-download-newest-mongodb-tools-for-your-distro-version-that-will-work-with-mongodb-5x-but-do-not-install-it-yet) above to remove all old mongodb packages and repo, and then install MongoDB tools.
|
||||
|
||||
#### 15. Restore
|
||||
```
|
||||
sudo snap stop wekan
|
||||
|
||||
sudo snap start wekan.mongodb
|
||||
|
||||
mongorestore --drop --port 27019 --noIndexRestore
|
||||
```
|
||||
#### 16. Add back settings
|
||||
|
||||
Recommended is to use [Caddy 2](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config) instead of Caddy1 that is included in WeKan Snap currently at 2022-12-21. Caddy 2 maybe will be included to WeKan Snap later.
|
||||
|
||||
See if in your `snap-settings.sh` is this kind of command, are you using Caddy1 ?
|
||||
```
|
||||
sudo snap set wekan caddy-enabled='true'
|
||||
```
|
||||
If you use Caddy1, and have any domain settings in your `common/Caddyfile`, copy it back:
|
||||
```
|
||||
sudo cp common/Caddyfile /var/snap/wekan/common/
|
||||
```
|
||||
|
||||
At [step 6](#6-edit-snap-settingssh-to-look-like-this-with-nano-or-similar) above, you did create script that adds back snap settings. Run it to restore those settings:
|
||||
```
|
||||
./snap-settings.sh
|
||||
```
|
||||
You could also copy that file to common directory, if you like, or just keep it in your current directory:
|
||||
```
|
||||
sudo cp snap-settings.sh /var/snap/wekan/common/
|
||||
```
|
||||
#### 17. Start WeKan
|
||||
```
|
||||
sudo snap start wekan
|
||||
```
|
||||
#### 18. Test are WeKan attachments visible
|
||||
|
||||
#### 19. If you are using WeKan Snap Caddy1, if it does not work, change to Caddy2 https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
|
||||
#### 20. Backup and cleanup
|
||||
|
||||
Create archive of old files, and transer it to your local laptop, save somewhere safe:
|
||||
```
|
||||
ssh wekanserver
|
||||
|
||||
sudo su
|
||||
|
||||
7z a old-wekan.7z snap-settings.sh common dump
|
||||
|
||||
exit
|
||||
|
||||
scp wekanserver:/root/old-wekan.7z .
|
||||
```
|
||||
And then delete old files from server. Do not delete `snap-settings.sh`.
|
||||
```
|
||||
ssh wekanserver
|
||||
|
||||
rm -rf common dump
|
||||
```
|
||||
Also, keep [Daily Backups](https://github.com/wekan/wekan/wiki/Backup)
|
||||
|
||||
|
||||
## Oops it did not work. From WeKan Candidate back to Stable
|
||||
|
||||
```
|
||||
sudo snap stop wekan
|
||||
|
||||
sudo rm -rf /var/snap/wekan/common/*
|
||||
|
||||
sudo snap refresh wekan --channel=latest/stable
|
||||
|
||||
sudo snap stop wekan
|
||||
|
||||
sudo rm -rf /var/snap/wekan/common/*
|
||||
|
||||
sudo mv common/* /var/snap/wekan/common/
|
||||
|
||||
sudo snap start wekan
|
||||
|
||||
./snap-settings.sh
|
||||
```
|
||||
|
||||
If you have problems, add comment to issue https://github.com/wekan/wekan/issues/4780
|
||||
|
||||
## From WeKan Gantt GPL to WeKan Candidate
|
||||
|
||||
- This is discontinued, Gantt features will be later added to WeKan MIT version.
|
||||
- Gantt version files are instead at `/var/snap/wekan-gantt-gpl/`
|
||||
- Gantt snap name is wekan-gantt-gpl
|
||||
@@ -0,0 +1,249 @@
|
||||
## CentOS 7 and RHEL7 and newer
|
||||
|
||||
Alternatives:
|
||||
|
||||
- Snap install like below. Automatic updates. Some time ago there were problems with [Snap on CentOS 7](https://github.com/wekan/wekan-snap/issues/103#issuecomment-571223099), that can result in updating not working properly, but that is a long time ago, and Snap version is currently 2020-04-29 installed at about 400 servers worldwide, according to Snap statistics that show only wordwide and per-country stats, not any more specific info. Please keep [daily backups](https://github.com/wekan/wekan/wiki/Backup).
|
||||
- Docker or Bash/SystemD install from https://wekan.github.io
|
||||
|
||||
***
|
||||
|
||||
[Wekan snap bug reports and feature requests](https://github.com/wekan/wekan-snap/issues)
|
||||
|
||||
# Distro specific info how to install Snap on 64bit Linux
|
||||
|
||||
https://snapcraft.io
|
||||
|
||||
- CentOS 7, RHEL7 and newer, instructions below
|
||||
|
||||
# Install Wekan
|
||||
|
||||
### 1) Use root
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
|
||||
### 2) Install snap
|
||||
|
||||
2019-11-12 If instead of Caddy you use Nginx in front of Wekan on CentOS 7, you should
|
||||
[disable selinux to prevent Nginx permission denied error](https://github.com/wekan/wekan/issues/2792).
|
||||
|
||||
2018-11-05 Also see [new snapd on EPEL](https://forum.snapcraft.io/t/snapd-updates-in-fedora-epel-for-enterprise-linux/8310).
|
||||
|
||||
Source: [Experimental CentOS7 snap](https://copr.fedorainfracloud.org/coprs/ngompa/snapcore-el7/) and [Forum post](https://forum.snapcraft.io/t/install-snapd-on-centos/1495/21)
|
||||
|
||||
```
|
||||
yum makecache fast
|
||||
|
||||
yum install yum-plugin-copr epel-release
|
||||
|
||||
yum copr enable ngompa/snapcore-el7
|
||||
|
||||
yum install snapd
|
||||
|
||||
systemctl enable --now snapd.socket
|
||||
```
|
||||
|
||||
### 3) Install Wekan. Set URL like (subdomain.)example.com(/suburl)
|
||||
```
|
||||
snap install wekan
|
||||
|
||||
snap set wekan root-url='https://boards.example.com'
|
||||
```
|
||||
|
||||
[MORE ROOT-URL EXAMPLES](https://github.com/wekan/wekan/wiki/Settings)
|
||||
|
||||
### 4) Set port where Wekan runs, for example 80 if http, or local port 3001, if running behing proxy like Caddy
|
||||
```
|
||||
snap set wekan port='3001'
|
||||
|
||||
systemctl restart snap.wekan.wekan
|
||||
```
|
||||
|
||||
### 5) Install all Snap updates automatically between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=02:00-04:00
|
||||
```
|
||||
|
||||
Automatic upgrades happen sometime after Wekan is released, or at scheduled time, or with `sudo snap refresh`
|
||||
|
||||
### 6) Email and Other Settings
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://user:pass@mailserver.example.com:453'
|
||||
sudo snap set wekan mail-from='Wekan Boards <support@example.com>'
|
||||
```
|
||||
|
||||
[Troubleshooting Email](https://github.com/wekan/wekan/wiki/Troubleshooting-Mail)
|
||||
|
||||
## LDAP
|
||||
|
||||
See [Supported Settings Keys](Supported-settings-keys#ldap)
|
||||
|
||||
## [Matomo Web Analytics integration](Supported-settings-keys#matomo-web-analytics-integration)
|
||||
|
||||
See [Supported Settings Keys](Supported-settings-keys#matomo-web-analytics-integration)
|
||||
|
||||
## [Rocket.Chat providing OAuth2 login to Wekan](https://github.com/wekan/wekan/wiki/OAuth2)
|
||||
|
||||
Also, if you have Rocket.Chat using LDAP/SAML/Google/etc for logging into Rocket.Chat, then same users can login to Wekan when Rocket.Chat is providing OAuth2 login to Wekan.
|
||||
|
||||
# Optional: Install Caddy - Every Site on HTTPS
|
||||
|
||||
a) Personal non-commercial use only, included
|
||||
|
||||
b) Commercial use: see https://caddyserver.com/products/licenses
|
||||
and [commercial usage issue](https://github.com/wekan/wekan-snap/issues/39),
|
||||
contact Wekan maintainer x@xet7.org about how to enable commercial version
|
||||
of caddy.
|
||||
|
||||
|
||||
### 7) Add domain to Caddy config
|
||||
```
|
||||
nano /var/snap/wekan/common/Caddyfile
|
||||
```
|
||||
|
||||
### 8) Replace first top line of text with (subdomain.)example.com(/suburl), without any beginning of http/https
|
||||
|
||||
Example Caddyfile config.
|
||||
|
||||
"alpn http/1.1" is because Firefox Inspect Console does not support http/2, so [turning it off](https://github.com/wekan/wekan/issues/934) so that Firefox would not show wss websocket errors. Chrome console supports http/2.
|
||||
|
||||
This uses free Let's Encrypt SSL. You can also use [free CloudFlare wildcard SSL or any other SSL cert](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config).
|
||||
```
|
||||
boards.example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
Caddyfile example of static directory listing:
|
||||
```
|
||||
# Files have these permissions:
|
||||
# chown root:root /var/snap/wekan/common/download.example.com
|
||||
download.example.com {
|
||||
root /var/snap/wekan/common/download.example.com
|
||||
browse
|
||||
}
|
||||
```
|
||||
[MORE Caddyfile EXAMPLES](https://github.com/caddyserver/examples)
|
||||
|
||||
### 9) Enable Caddy automatic https
|
||||
```
|
||||
snap set wekan caddy-enabled='true'
|
||||
```
|
||||
## 10) Reboot
|
||||
|
||||
## 11) Disable and enable wekan
|
||||
|
||||
```
|
||||
$ sudo snap disable wekan
|
||||
$ sudo snap enable wekan
|
||||
```
|
||||
If you use the mongodb port for another app, then, change it too:
|
||||
```
|
||||
$ sudo snap set wekan mongodb-port=27019
|
||||
```
|
||||
|
||||
## 12) Add users
|
||||
|
||||
[Add users](https://github.com/wekan/wekan/wiki/Adding-users)
|
||||
|
||||
[Forgot Password](https://github.com/wekan/wekan/wiki/Forgot-Password)
|
||||
|
||||
## MongoDB CLI
|
||||
|
||||
1) Install MongoDB 3.2.x tools, and run on CLI:
|
||||
|
||||
`mongo --port 27019`
|
||||
|
||||
***
|
||||
|
||||
|
||||
# Older install docs
|
||||
|
||||
```
|
||||
$ sudo snap install wekan
|
||||
```
|
||||
|
||||
IMPORTANT: SETUP [URL SETTINGS](#url-settings) BELOW, SO OPENING CARDS ETC WORKS CORRECTLY. More info at [Supported settings keys](Supported-settings-keys).
|
||||
|
||||
**IMPORTANT: Wekan Snap is bleeding edge, so any commits made to the wekan repository are pushed to the snap directly. Decide for yourself if you want to run wekan snap in production**
|
||||
|
||||
Make sure you have connected all interfaces, check more by calling
|
||||
|
||||
```
|
||||
$ snap interfaces
|
||||
```
|
||||
|
||||
Wekan has two services, to check status/restart/stop use systemd commands:
|
||||
|
||||
You can use these service commands:
|
||||
- status
|
||||
- start
|
||||
- stop
|
||||
- restart
|
||||
|
||||
MongoDB service:
|
||||
|
||||
```
|
||||
$ sudo systemctl status snap.wekan.mongodb
|
||||
```
|
||||
|
||||
Wekan service:
|
||||
|
||||
```
|
||||
$ sudo systemctl status snap.wekan.wekan
|
||||
```
|
||||
|
||||
## URL settings
|
||||
|
||||
[Nginx and Snap settings for https://example.com/wekan sub-url](https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config)
|
||||
|
||||
Full URL to your Wekan, for example:
|
||||
|
||||
### Run Wekan on local network on selected port on computer IP address
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='http://192.168.10.100:5000'
|
||||
```
|
||||
|
||||
### Run Wekan only locally on selected port
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='http://localhost:5000'
|
||||
```
|
||||
|
||||
### Nginx or Caddy webserver in front of Wekan
|
||||
|
||||
[Nginx](https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config) or [Caddy](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config) is in front, full URL to real web address URL of Nginx or Caddy.
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='https://example.com'
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='https://example.com/wekan'
|
||||
```
|
||||
|
||||
## Port settings
|
||||
|
||||
Localhost port where Wekan is running. This does not need to be exposed to Internet when running behind Nginx or Caddy.
|
||||
|
||||
```
|
||||
$ sudo snap set wekan port='<your_port>'
|
||||
```
|
||||
|
||||
## Restart Wekan after changes
|
||||
|
||||
```
|
||||
$ sudo systemctl restart snap.wekan.wekan
|
||||
```
|
||||
|
||||
When running without any additional settings, Wekan is at http://localhost:8080
|
||||
@@ -0,0 +1,20 @@
|
||||
Using CentOS 8 Stream.
|
||||
|
||||
1. Install Snap https://snapcraft.io/docs/installing-snap-on-centos
|
||||
|
||||
2. Reboot
|
||||
|
||||
3. With terminal, test latest release candidate, to your server IP address:
|
||||
|
||||
```
|
||||
su
|
||||
snap install wekan --channel=latest/candidate
|
||||
snap set wekan root-url='http://YOUR-IP-ADDRESS'
|
||||
snap set wekan port='80'
|
||||
```
|
||||
|
||||
4. For additional server options, see https://github.com/wekan/wekan/wiki/Settings
|
||||
|
||||
5. For adding users, see https://github.com/wekan/wekan/wiki/Adding-users
|
||||
|
||||
6. For other login option, see right menu at https://github.com/wekan/wekan/wiki
|
||||
@@ -0,0 +1,14 @@
|
||||
Welcome to the wekan-snap documentation wiki!
|
||||
|
||||
## Wekan snap at web
|
||||
|
||||
https://uappexplorer.com/snap/ubuntu/wekan
|
||||
|
||||
## Help command after installing
|
||||
```
|
||||
$ wekan.help
|
||||
```
|
||||
|
||||
**All of commandline help is also in this wiki, categorized to their own wiki pages.**
|
||||
|
||||
See also [Wekan documentation](https://github.com/wekan/wekan/wiki)
|
||||
@@ -0,0 +1,15 @@
|
||||
## Ansible install by Pavel Stratil
|
||||
|
||||
[Info source](https://github.com/wekan/wekan/issues/1106)
|
||||
|
||||
## Original repos, please add feature requests there
|
||||
|
||||
https://github.com/Vaizard/mage-wekan
|
||||
|
||||
https://github.com/vaizard/mage-snapd
|
||||
|
||||
## Wekan's forked version
|
||||
|
||||
https://github.com/wekan/mage-wekan
|
||||
|
||||
https://github.com/wekan/mage-snapd
|
||||
@@ -0,0 +1,261 @@
|
||||
Snap for Linux, install to your own server or laptop. Automatic Updates. Only Standalone Wekan.
|
||||
|
||||
If on Snap Stable automatic update breaks something, [report Wekan for Snap bugs and feature requests here](https://github.com/wekan/wekan-snap/issues), so it can be fixed on some automatic update. If security is critical, keep behind firewall, without any ports open to Internet.
|
||||
|
||||
# Distro specific info how to install Snap on 64bit Linux
|
||||
|
||||
https://snapcraft.io
|
||||
|
||||
- Recommended: Newest 1) Ubuntu 2) Debian based distro
|
||||
- Arch
|
||||
- Fedora
|
||||
- Solus
|
||||
- OpenSUSE
|
||||
- Gentoo
|
||||
- Manjaro
|
||||
- Elementary OS
|
||||
- [CentOS 7, RHEL7 and newer](CentOS-7)
|
||||
- [CentOS 8](CentOS8)
|
||||
|
||||
How ROOT_URL is set:
|
||||
https://github.com/wekan/wekan/wiki/Settings
|
||||
|
||||
Here is how to add users:
|
||||
https://github.com/wekan/wekan/wiki/Adding-users
|
||||
|
||||
How to switch between WeKan and WeKan Gantt GPL:
|
||||
https://github.com/wekan/wekan/issues/2870#issuecomment-721364824
|
||||
|
||||
Newest Snap WeKan does not yet have migration to newest MongoDB. Here is how to try newer WeKan test candidate version, and migrate database manually:
|
||||
https://github.com/wekan/wekan/issues/4505#issuecomment-1158380746
|
||||
|
||||
Below is how to install Snap.
|
||||
|
||||
# Install Wekan
|
||||
|
||||
### 1) Use root
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
|
||||
### 2) Install snap
|
||||
|
||||
a) Debian or Ubuntu
|
||||
```
|
||||
apt install snapd
|
||||
```
|
||||
|
||||
b) Other distros
|
||||
|
||||
See [Snapcraft website](https://snapcraft.io).
|
||||
|
||||
### 3) Install Wekan. Set URL like (subdomain.)example.com(/suburl)
|
||||
```
|
||||
snap install wekan
|
||||
|
||||
snap set wekan root-url='https://wekan.example.com'
|
||||
```
|
||||
|
||||
[MORE ROOT-URL EXAMPLES](https://github.com/wekan/wekan/wiki/Settings)
|
||||
|
||||
### 4) Set port where Wekan runs, for example 80 if http, or local port 3001, if running behing proxy like Caddy
|
||||
```
|
||||
snap set wekan port='3001'
|
||||
|
||||
systemctl restart snap.wekan.wekan
|
||||
```
|
||||
|
||||
### 5) Install all Snap updates automatically between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=02:00-04:00
|
||||
```
|
||||
Update once a week at Sunday between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=sun,02:00-04:00
|
||||
```
|
||||
Update last Sunday of the month between 02:00AM and 04:00AM
|
||||
```
|
||||
snap set core refresh.schedule=sun5,02:00-04:00
|
||||
```
|
||||
[Update until specific day](https://snapcraft.io/docs/keeping-snaps-up-to-date#heading--refresh-hold) and other examples.
|
||||
|
||||
If required, you can disable all Snap updates at `/etc/hosts` by adding a line:
|
||||
```
|
||||
127.0.0.1 api.snapcraft.io
|
||||
```
|
||||
|
||||
Automatic upgrades happen sometime after Wekan is released, or at scheduled time, or with `sudo snap refresh`
|
||||
|
||||
### 6) Email and Other Settings
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://user:pass@mailserver.example.com:453'
|
||||
sudo snap set wekan mail-from='Wekan Boards <support@example.com>'
|
||||
```
|
||||
|
||||
[Troubleshooting Email](https://github.com/wekan/wekan/wiki/Troubleshooting-Mail)
|
||||
|
||||
## LDAP
|
||||
|
||||
See [Supported Settings Keys](Supported-settings-keys#ldap)
|
||||
|
||||
## [Matomo Web Analytics integration](Supported-settings-keys#matomo-web-analytics-integration)
|
||||
|
||||
See [Supported Settings Keys](Supported-settings-keys#matomo-web-analytics-integration)
|
||||
|
||||
## [Rocket.Chat providing OAuth2 login to Wekan](https://github.com/wekan/wekan/wiki/OAuth2)
|
||||
|
||||
Also, if you have Rocket.Chat using LDAP/SAML/Google/etc for logging into Rocket.Chat, then same users can login to Wekan when Rocket.Chat is providing OAuth2 login to Wekan.
|
||||
|
||||
# Optional: Install Caddy - Every Site on HTTPS
|
||||
|
||||
### 7) Add domain to Caddy config
|
||||
```
|
||||
nano /var/snap/wekan/common/Caddyfile
|
||||
```
|
||||
|
||||
### 8) Replace first top line of text with (subdomain.)example.com(/suburl), without any beginning of http/https
|
||||
|
||||
Example Caddyfile config.
|
||||
|
||||
"alpn http/1.1" is because Firefox Inspect Console does not support http/2, so [turning it off](https://github.com/wekan/wekan/issues/934) so that Firefox would not show wss websocket errors. Chrome console supports http/2.
|
||||
|
||||
This uses free Let's Encrypt SSL. You can also use [free CloudFlare wildcard SSL or any other SSL cert](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config).
|
||||
```
|
||||
boards.example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
Caddyfile example of static directory listing:
|
||||
```
|
||||
# Files have these permissions:
|
||||
# chown root:root /var/snap/wekan/common/download.example.com
|
||||
download.example.com {
|
||||
root /var/snap/wekan/common/download.example.com
|
||||
browse
|
||||
}
|
||||
```
|
||||
[MORE Caddyfile EXAMPLES](https://github.com/caddyserver/examples)
|
||||
|
||||
### 9) Enable Caddy automatic https
|
||||
```
|
||||
snap set wekan caddy-enabled='true'
|
||||
```
|
||||
## 10) Reboot
|
||||
|
||||
## 11) Disable and enable wekan
|
||||
|
||||
```
|
||||
$ sudo snap disable wekan
|
||||
$ sudo snap enable wekan
|
||||
```
|
||||
If you use the mongodb port for another app, then, change it too:
|
||||
```
|
||||
$ sudo snap set wekan mongodb-port=27019
|
||||
```
|
||||
|
||||
## 12) Add users
|
||||
|
||||
[Add users](https://github.com/wekan/wekan/wiki/Adding-users)
|
||||
|
||||
[Forgot Password](https://github.com/wekan/wekan/wiki/Forgot-Password)
|
||||
|
||||
## MongoDB CLI
|
||||
|
||||
1) Install MongoDB 3.2.x tools, and run on CLI:
|
||||
|
||||
`mongo --port 27019`
|
||||
|
||||
***
|
||||
|
||||
|
||||
# Older install docs
|
||||
|
||||
```
|
||||
$ sudo snap install wekan
|
||||
```
|
||||
|
||||
IMPORTANT: SETUP [URL SETTINGS](#url-settings) BELOW, SO OPENING CARDS ETC WORKS CORRECTLY. More info at [Supported settings keys](Supported-settings-keys).
|
||||
|
||||
**IMPORTANT: Wekan Snap is bleeding edge, so any commits made to the wekan repository are pushed to the snap directly. Decide for yourself if you want to run wekan snap in production**
|
||||
|
||||
Make sure you have connected all interfaces, check more by calling
|
||||
|
||||
```
|
||||
$ snap interfaces
|
||||
```
|
||||
|
||||
Wekan has two services, to check status/restart/stop use systemd commands:
|
||||
|
||||
You can use these service commands:
|
||||
- status
|
||||
- start
|
||||
- stop
|
||||
- restart
|
||||
|
||||
MongoDB service:
|
||||
|
||||
```
|
||||
$ sudo systemctl status snap.wekan.mongodb
|
||||
```
|
||||
|
||||
Wekan service:
|
||||
|
||||
```
|
||||
$ sudo systemctl status snap.wekan.wekan
|
||||
```
|
||||
|
||||
## URL settings
|
||||
|
||||
[Nginx and Snap settings for https://example.com/wekan sub-url](https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config)
|
||||
|
||||
Full URL to your Wekan, for example:
|
||||
|
||||
### Run Wekan on local network on selected port on computer IP address
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='http://192.168.10.100:5000'
|
||||
```
|
||||
|
||||
### Run Wekan only locally on selected port
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='http://localhost:5000'
|
||||
```
|
||||
|
||||
### Nginx or Caddy webserver in front of Wekan
|
||||
|
||||
[Nginx](https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config) or [Caddy](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config) is in front, full URL to real web address URL of Nginx or Caddy.
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='https://example.com'
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
$ sudo snap set wekan root-url='https://example.com/wekan'
|
||||
```
|
||||
|
||||
## Port settings
|
||||
|
||||
Localhost port where Wekan is running. This does not need to be exposed to Internet when running behind Nginx or Caddy.
|
||||
|
||||
```
|
||||
$ sudo snap set wekan port='<your_port>'
|
||||
```
|
||||
|
||||
## Restart Wekan after changes
|
||||
|
||||
```
|
||||
$ sudo systemctl restart snap.wekan.wekan
|
||||
```
|
||||
|
||||
When running without any additional settings, Wekan is at http://localhost:8080
|
||||
@@ -0,0 +1,31 @@
|
||||
If you have some users logging to your server, that don't have root access, and you want to limit snap to root user only, you can do the following:
|
||||
|
||||
## 1) Set snap refresh schedule, for example
|
||||
|
||||
```
|
||||
sudo snap set core refresh.schedule=02:00-03:00
|
||||
```
|
||||
|
||||
## 2) Set cron to limit permissions to root users after updates
|
||||
|
||||
For example, sudo to root, and edit root cron with nano:
|
||||
|
||||
```
|
||||
sudo su
|
||||
export EDITOR=nano
|
||||
crontab -e
|
||||
```
|
||||
|
||||
and add there that at 03:10 permissions are limited to root again:
|
||||
```
|
||||
10 3 * * * chmod og-rwx /usr/bin/snap
|
||||
10 3 * * * chmod -R og-rwx /var/snap
|
||||
```
|
||||
You can see crontab syntax help at https://crontab.guru
|
||||
|
||||
`snap` is the command, and `/var/snap` is where data is stored.
|
||||
|
||||
## Future snap features for permissions
|
||||
|
||||
For more advanced user permission control in snap, sometime new features will be added:<br />
|
||||
https://forum.snapcraft.io/t/multiple-users-and-groups-in-snaps/1461/3
|
||||
@@ -0,0 +1,54 @@
|
||||
# Installing snapcraft from source
|
||||
|
||||
This is old and already fixed, was only needed when [snap build servers were broken](https://github.com/wekan/wekan-snap/issues/58) and [snapcraft had bug](https://forum.snapcraft.io/t/permission-denied-when-building-with-snapcore-snapcraft/7186/14?u=xet7) that has [fix that was not released to snap channel yet](https://github.com/snapcore/snapcraft/pull/2240). All this is fixed now.
|
||||
|
||||
So I removed snap version, and installed snapcraft from source, and it seems to work for me.
|
||||
|
||||
## Snapcraft source install on Ubuntu 16.04 64bit
|
||||
|
||||
Add to /root/.bashrc:
|
||||
```
|
||||
export PATH="$PATH:/home/user/repos/snapcraft/bin"
|
||||
```
|
||||
## Install dependencies
|
||||
```
|
||||
sudo apt install python3-yaml python3-tabulate python3-pymacaroons \
|
||||
python3-progressbar python3-requests-unixsocket python3-petname \
|
||||
python3-pyelftools python3-click python3-simplejson \
|
||||
python3-requests-toolbelt python3-jsonschema xdelta3
|
||||
```
|
||||
## Install snapcraft
|
||||
```
|
||||
cd ~/repos
|
||||
git clone https://github.com/snapcore/snapcraft.git
|
||||
cd snapcraft
|
||||
sudo python3 setup.py install
|
||||
```
|
||||
## [Workaround bug](https://bugs.launchpad.net/snapcraft/+bug/1656884/comments/1)
|
||||
```
|
||||
sudo ln -s /usr/local/lib/python3.5/dist-packages/snapcraft-2.43-py3.5.egg/share/snapcraft/ /usr/share/snapcraft
|
||||
```
|
||||
## Build package
|
||||
```
|
||||
cd ~/repos/wekan
|
||||
sudo snapcraft
|
||||
```
|
||||
## Install snap package locally to test it
|
||||
```
|
||||
sudo snap install --dangerous wekan_1.*_amd64.snap
|
||||
```
|
||||
## Changing back to stable or edge snap
|
||||
|
||||
https://github.com/wekan/wekan-snap/wiki/Snap-Developer-Docs
|
||||
|
||||
## Login to snapcraft
|
||||
|
||||
If you have access to publishing snaps.
|
||||
|
||||
## Push package to snap store
|
||||
```
|
||||
sudo snapcraft push wekan_1.*_amd64.snap
|
||||
```
|
||||
## Publish at snap store
|
||||
|
||||
https://dashboard.snapcraft.io/dev/snaps/7867
|
||||
@@ -0,0 +1,9 @@
|
||||
## Triggering git import process manually
|
||||
|
||||
https://code.launchpad.net/~wekan-team/wekan/+git/wekan
|
||||
|
||||
## When ready, uploaded to store. Check and release.
|
||||
|
||||
Once you snap is uploaded you should see it here:
|
||||
|
||||
https://dashboard.snapcraft.io/dev/snaps/7867
|
||||
@@ -0,0 +1,466 @@
|
||||
https://github.com/wekan/wekan-snap/wiki/Many-Snaps-on-LXC#lxd-init-cidr
|
||||
|
||||
# NEW WAY: Parallel Snap Installs
|
||||
|
||||
Note: This presumes that your laptop runs newest Ubuntu or Kubuntu, and that server is Ubuntu.
|
||||
|
||||
1) Install Caddy2 https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
|
||||
2) Optional, recommended: Encrypted VM. Idea: Bare Metal Caddy => Proxy to encrypted VM ports => Each customer separate Snap WeKan port. Snap sandbox files at /common, snap code can not access files outside of it's /common directories. Newest WeKan is Snap Candidate. Snap has automatic updates.
|
||||
|
||||
2.1) If your server has additional harddrives, format them:
|
||||
|
||||
```
|
||||
ls /dev
|
||||
mkfs.ext4 /dev/nvme0n1
|
||||
```
|
||||
2.2) Look at that above command text output, what is created disk UUID. Add those to /etc/fstab:
|
||||
```
|
||||
UUID=12345-678-90 /data ext4 errors=remount-ro 0 1
|
||||
```
|
||||
2.3) Create directories for mounting disk, and mount all drives:
|
||||
```
|
||||
sudo su
|
||||
cd /
|
||||
mkdir /data
|
||||
mount -a
|
||||
```
|
||||
2.4) Install to your laptop and bare metal server packages for using remote desktop with KVM:
|
||||
```
|
||||
sudo apt install virt-manager qemu-system
|
||||
```
|
||||
2.5) Check that you can ssh to server with ssh public key as root. For that, create ssh key on your laptop, press enter many times until it's done:
|
||||
```
|
||||
ssh-keygen
|
||||
```
|
||||
2.6) copy laptop .ssh/id_rsa.pub content to server /root/.ssh/authorized_keys .
|
||||
|
||||
2.7) At server disable password login at /etc/ssh/sshd_config , password login enabled false. And `sudo systemctl restart ssh`
|
||||
|
||||
2.8) At your laptop edit .ssh/config , there add your server IP address etc. This server here is named x1.
|
||||
|
||||
```
|
||||
Host x1
|
||||
Hostname 123.123.123.123
|
||||
User root
|
||||
IdentityFile ~/.ssh/id_rsa
|
||||
```
|
||||
|
||||
2.9) Check that you can ssh from laptop to server as root without prompts.
|
||||
|
||||
2.10) Start virt-manager GUI at your laptop:
|
||||
|
||||
- File / Add connection
|
||||
- Hypervisor: QEMU/KVM
|
||||
- [X] Connect to remote host via SSH
|
||||
- Username: root
|
||||
- Machine name: x1
|
||||
- Connect automatically: [X]
|
||||
- Click [Connect]
|
||||
|
||||
2.11) AT SERVER: Create harddrive image: `qemu-img create -f qcow2 web.qcow2 700G`
|
||||
|
||||
2.12) Download newest Kubuntu desktop iso with wget.
|
||||
|
||||
2.13) Install kubuntu with full disk encryption. Modify amount of RAM (here 32 GB), file locations etc. Do not select to allocate encrypted disk image immediately, let image size grow.
|
||||
|
||||
2.14) Create growing disk with max size:
|
||||
```
|
||||
qemu-img create -f qcow2 web.qcow2 700G
|
||||
```
|
||||
2.15) Start install from .iso image. Here RAM -r 32 GB, name web, change disk and iso locations below, vcpu 20 (check your server with nproc, should be less that all):
|
||||
```
|
||||
sudo virt-install -r 32000 -n web --os-type=linux --os-variant=ubuntu16.04 \
|
||||
--disk /data/VMs/web.qcow2,device=disk,format=qcow2 \
|
||||
-c /data/VMs/iso/kubuntu-22.10-desktop-amd64.iso \
|
||||
--vcpus=20 --vnc --noautoconsole
|
||||
```
|
||||
It will appear to your laptop virt-manager GUI.
|
||||
|
||||
If you have shutdown KVM VM, you can start it from virt-manager, or this way without .iso image:
|
||||
```
|
||||
sudo virt-install -r 32000 -n web --boot hd --video=vga --os-type=linux --os-variant=ubuntu16.04 \
|
||||
--disk /data/VMs/web.qcow2,device=disk,format=qcow2 \
|
||||
--vcpus=20 --vnc --noautoconsole
|
||||
```
|
||||
|
||||
3) Use Parallel Snap installs https://snapcraft.io/docs/parallel-installs
|
||||
|
||||
For example:
|
||||
```
|
||||
sudo snap set system experimental.parallel-instances=true
|
||||
```
|
||||
|
||||
4) With newest WeKan Candidate like https://github.com/wekan/wekan-snap/wiki/CentOS8 . Note: Each user has different wekan port and mongodb port.
|
||||
```
|
||||
sudo snap install wekan --channel=latest/candidate
|
||||
sudo snap install wekan wekan_customer1 --channel=latest/candidate
|
||||
sudo snap disable wekan
|
||||
sudo snap set wekan_customer1 caddy-enabled='false'
|
||||
```
|
||||
Check that each WeKan uses candidate:
|
||||
```
|
||||
sudo snap list
|
||||
```
|
||||
If not, change to candidate:
|
||||
```
|
||||
sudo snap refresh wekan_customer1 --channel=latest/candidate
|
||||
```
|
||||
If it complains about old database version (was at stable), stop it, move old files somewhere safe, and start again.
|
||||
WARNING: this deletes
|
||||
```
|
||||
sudo su
|
||||
mkdir old_customer1_common
|
||||
snap stop wekan_customer1
|
||||
mv /var/snap/wekan_customer1/common/* old_customer1_common/
|
||||
snap start wekan_customer1
|
||||
```
|
||||
|
||||
5) Add some settings, for example Google login and [AWS SES email sending](https://github.com/wekan/wekan/wiki/Troubleshooting-Mail#example-aws-ses):
|
||||
|
||||
For each customer, node and mongodb needs to be in different ports, for example:
|
||||
```
|
||||
sudo snap set wekan_customer1 port='5001'
|
||||
sudo snap set wekan_customer1 mongodb-port='25001'
|
||||
sudo snap set wekan_customer2 port='5002'
|
||||
sudo snap set wekan_customer2 mongodb-port='25002'
|
||||
```
|
||||
For customer1:
|
||||
```
|
||||
sudo snap set wekan_customer1 port='5001'
|
||||
sudo snap set wekan_customer1 mongodb-port='25001'
|
||||
sudo snap set wekan_customer1 root-url='https://wekan.customer1.com'
|
||||
sudo snap set wekan_customer1 mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:"SSLv3"}&secureConnection=false'
|
||||
sudo snap set wekan_customer1 mail-from='Wekan Customer1 Support <board@customer1.com>'
|
||||
sudo snap set wekan_customer1 oauth2-auth-endpoint='https://accounts.google.com/o/oauth2/v2/auth'
|
||||
sudo snap set wekan_customer1 oauth2-client-id='YOUR-GOOGLE-LOGIN-CLIENT_ID.apps.googleusercontent.com'
|
||||
sudo snap set wekan_customer1 oauth2-secret='YOUR-GOOGLE-LOGIN-SECRET'
|
||||
sudo snap set wekan_customer1 oauth2-email-map='email'
|
||||
sudo snap set wekan_customer1 oauth2-enabled='true'
|
||||
sudo snap set wekan_customer1 oauth2-fullname-map='name'
|
||||
sudo snap set wekan_customer1 oauth2-id-map='sub'
|
||||
sudo snap set wekan_customer1 oauth2-request-permissions='openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email'
|
||||
sudo snap set wekan_customer1 oauth2-token-endpoint='https://oauth2.googleapis.com/token'
|
||||
sudo snap set wekan_customer1 oauth2-userinfo-endpoint='https://openidconnect.googleapis.com/v1/userinfo'
|
||||
sudo snap set wekan_customer1 oauth2-username-map='nickname'
|
||||
```
|
||||
You can check with [nosqlbooster](https://github.com/wekan/wekan/wiki/Backup#using-nosqlbooster-closed-source-mongodb-gui-with-wekan-snap-to-edit-mongodb-database) that each database has correct data.
|
||||
|
||||
When restoring data, stop that wekan, and restore to that port, when you have subdirectory dump:
|
||||
```
|
||||
sudo snap stop wekan_customer2.wekan
|
||||
mongorestore --drop --port 25002
|
||||
sudo snap start wekan_customer2.wekan
|
||||
```
|
||||
If there is errors, try again without restoring indexes:
|
||||
```
|
||||
mongorestore --drop --noIndexRestore --port 25002
|
||||
```
|
||||
To empty database, use [mongodb shell](https://www.mongodb.com/try/download/shell):
|
||||
```
|
||||
mongosh --port 25002
|
||||
show dbs
|
||||
use wekan
|
||||
db.dropDatabase()
|
||||
```
|
||||
To see is settings written correctly, use:
|
||||
```
|
||||
sudo snap get wekan_customer1
|
||||
sudo snap get wekan_customer2
|
||||
```
|
||||
And that at `Caddyfile` each subdomain is proxied to correct port like 3001 etc.
|
||||
|
||||
And that if there is snap called wekan, it's not in use:
|
||||
```
|
||||
sudo snap disable wekan
|
||||
```
|
||||
or has different port:
|
||||
```
|
||||
sudo snap get wekan
|
||||
sudo snap set wekan port='6001'
|
||||
sudo snap set wekan mongodb-port='28001'
|
||||
```
|
||||
|
||||
6) Example backup script, that backups MongoDB databases. Although, maybe files directories needed to be added too.
|
||||
|
||||
Note: Here customer1 likes to get backup copy of backups, so this copies customer1 backup to separate directory that is synced only to that customer with Syncthing. Via email was asked customer syncthing ID, and added sync.
|
||||
|
||||
Set it as executeable:
|
||||
```
|
||||
chmod +x backup.sh
|
||||
```
|
||||
To run it:
|
||||
```
|
||||
sudo su
|
||||
cd backup
|
||||
./backup.sh
|
||||
```
|
||||
|
||||
Here is backup.sh, using [mongodb tools](https://www.mongodb.com/try/download/database-tools) for mongodump/mongorestore etc:
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
# Backup all MongoDB databases from different ports.
|
||||
# Note: You may need to check also is there files directory,
|
||||
# and also backup that, like /var/snap/wekan/common/files etc
|
||||
|
||||
function backup {
|
||||
cd /home/wekan/backup
|
||||
# >> /home/wekan/backup/backup-log.txt
|
||||
mkdir -p /home/wekan/backup/new/$1
|
||||
cd /home/wekan/backup/new/$1
|
||||
mongodump --port $2
|
||||
sudo snap get wekan_$1 > snap-settings.txt
|
||||
cd ..
|
||||
7z a $(date -u +$1-wekan-backup-%Y-%m-%d_%H.%M_UTC.7z) $1
|
||||
mkdir /home/wekan/$3
|
||||
chown wekan:wekan *.7z
|
||||
mv *.7z /home/wekan/$3/
|
||||
rm -rf $1
|
||||
cd /home/wekan/backup
|
||||
}
|
||||
|
||||
function backupchat {
|
||||
cd /home/wekan/backup >> /home/wekan/backup/backup-log.txt
|
||||
mkdir -p /home/wekan/backup/new/$1 >> /home/wekan/backup/backup-log.txt
|
||||
cd /home/wekan/backup/new/$1 >> /home/wekan/backup/backup-log.txt
|
||||
mongodump >> /home/wekan/backup/backup-log.txt
|
||||
cd ..
|
||||
7z a $(date -u +$1-backup-%Y-%m-%d_%H.%M_UTC.7z) $1
|
||||
mkdir /home/wekan/$3
|
||||
chown wekan:wekan *.7z
|
||||
mv *.7z /home/wekan/$3/
|
||||
rm -rf $1
|
||||
cd /home/wekan/backup
|
||||
}
|
||||
|
||||
# Syntax:
|
||||
# backup customername port backupdir
|
||||
|
||||
function websync {
|
||||
# Backup WeKan Kanban Snaps to different Syncthing sync directories
|
||||
backup "customer1" "25001" "backup-wekan-customer1"
|
||||
backup "customer1" "25001" "websync"
|
||||
backup "customer2" "25002" "websync"
|
||||
backup "customer3" "25003" "websync"
|
||||
backup "customer4" "25004" "websync"
|
||||
backup "customer5" "25005" "websync"
|
||||
# Backup RocketChat Snap
|
||||
backupchat "chat" "27027" "websync"
|
||||
cd ~/websync
|
||||
## backup the backup scripts
|
||||
# 7z a $(date -u +wekan-backup-scripts-%Y-%m-%d_%H.%M_UTC.7z) ~/backup
|
||||
}
|
||||
|
||||
(websync) >> /home/wekan/backup/backup-log.txt 2>&1
|
||||
```
|
||||
|
||||
7. At bare metal server is installed [Caddy2](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config).
|
||||
|
||||
Each customer has set in their nameserver to WeKan hosting server IP address:
|
||||
```
|
||||
A 123.123.123.123
|
||||
```
|
||||
After that, when ping wekan.company1.com shows 123.123.123.123 correctly, it's possible to get
|
||||
automatic Let's Encrypt SSL/TLS cert with Caddy2.
|
||||
|
||||
At encrypted KVM VM type `ip address`, it shows what is KVM VM internal IP address.
|
||||
|
||||
Caddy2 proxies with Let's Encrypt TLS HTTPS to encrypted VM HTTP IP address and port where WeKan (Node.js) is running.
|
||||
|
||||
|
||||
/etc/caddy/Caddyfile . Examples when in /etc/caddy directory as root: `caddy start`, `caddy stop`, `caddy validate`, `caddy --help`
|
||||
```
|
||||
(redirect) {
|
||||
@http {
|
||||
protocol http
|
||||
}
|
||||
redir @http https://{host}{uri}
|
||||
}
|
||||
|
||||
kanban.customer1.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
reverse_proxy 192.168.123.23:5001
|
||||
}
|
||||
|
||||
kanban.customer2.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
reverse_proxy 192.168.123.23:5002
|
||||
}
|
||||
```
|
||||
Other non-kanban examples:
|
||||
```
|
||||
# Static website that uses free CloudFlare TLS certificates
|
||||
company.com {
|
||||
tls {
|
||||
load /data/websites/certificates/company
|
||||
alpn http/1.1
|
||||
}
|
||||
root * /data/websites/company.com
|
||||
file_server
|
||||
}
|
||||
|
||||
# RocketChat
|
||||
chat.company.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
reverse_proxy 192.168.123.23:3000
|
||||
}
|
||||
|
||||
# Browseable files listing static website
|
||||
files.company.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
root * /data/websites/files.company.com
|
||||
file_server browse
|
||||
}
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# OLD WAY: Many Snaps on LXC
|
||||
|
||||
## LXD init CIDR
|
||||
|
||||
IPv4 CIDR: 10.1.1.1/24
|
||||
|
||||
```
|
||||
sudo apt install snapd
|
||||
|
||||
sudo reboot
|
||||
|
||||
sudo snap install lxd
|
||||
|
||||
lxd init
|
||||
|
||||
Would you like to use LXD clustering? (yes/no) [default=no]:
|
||||
Do you want to configure a new storage pool? (yes/no) [default=yes]:
|
||||
Name of the new storage pool [default=default]:
|
||||
Name of the storage backend to use (dir, lvm, btrfs, ceph) [default=btrfs]: dir
|
||||
Would you like to connect to a MAAS server? (yes/no) [default=no]:
|
||||
Would you like to create a new local network bridge? (yes/no) [default=yes]:
|
||||
What should the new bridge be called? [default=lxdbr0]:
|
||||
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.1.1.1/24
|
||||
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
|
||||
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
|
||||
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
|
||||
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
|
||||
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
|
||||
```
|
||||
> The value you have specified is the “network address”, i.e “.0” is the network address of the subnet “10.1.1.0/24”. Instead you need to specify an IP in that network, such as “.1”, e.g. “10.1.1.1/24”
|
||||
|
||||
https://discuss.linuxcontainers.org/t/failed-lxd-init-what-is-cidr/7181/2
|
||||
|
||||
## 1) Main Snap on bare metal
|
||||
|
||||
[Install Wekan Snap](Install) to newest Ubuntu bare metal server. Snaps have automatic updates.
|
||||
|
||||
For example:
|
||||
```
|
||||
sudo apt-get install snapd
|
||||
reboot
|
||||
sudo snap install wekan
|
||||
```
|
||||
For Let's Encrypt SSL, like this to `/var/snap/wekan/common/Caddyfile`. We will be proxying to inside LXD container:
|
||||
```
|
||||
boards.example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
proxy / 10.10.10.231:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
For [CloudFlare SSL](https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config), like this to `/var/snap/wekan/common/Caddyfile`:
|
||||
```
|
||||
http://boards.example.com https://boards.example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certificates
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
proxy / 10.10.10.231:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
## 2) New LXC container
|
||||
So when I start new lxc container:
|
||||
```
|
||||
lxc launch images:ubuntu/20.04 lxccontainername
|
||||
```
|
||||
## 3) Snapd and Wekan
|
||||
Then I go inside container and install snapd:
|
||||
```
|
||||
lxc exec lxccontainername -- /bin/bash
|
||||
apt -y install snapd
|
||||
reboot
|
||||
lxc exec lxccontainername -- /bin/bash
|
||||
snap install wekan
|
||||
snap set wekan root-url='https://boards.example.com'
|
||||
sudo snap set wekan port='3001'
|
||||
sudo snap set wekan mail-from='Wekan Team Boards <info@example.com>'
|
||||
sudo snap set wekan mail-url='smtps://username:password@email-smtp.eu-west-1.amazonaws.com:587'
|
||||
ip address
|
||||
exit
|
||||
```
|
||||
That `ip address` command does show current IP address of container, that you can then add to bare metal `/var/snap/wekan/common/Caddyfile`.
|
||||
|
||||
You can also add more lxc containers to different subdomains and proxy to them in main Caddyfile.
|
||||
|
||||
## 4) Some LXC commands
|
||||
|
||||
### New Ubuntu container
|
||||
```
|
||||
lxc launch images:ubuntu/20.04 lxccontainername
|
||||
```
|
||||
### Inside LXC container
|
||||
```
|
||||
lxc exec lxccontainername -- /bin/bash
|
||||
```
|
||||
### Running command in LXC
|
||||
```
|
||||
lxc exec lxccontainername -- apt install p7zip-full
|
||||
```
|
||||
### Limit RAM available to LXC
|
||||
```
|
||||
lxc config set lxccontainername limits.memory 4GB
|
||||
```
|
||||
### New Debian container
|
||||
```
|
||||
lxc launch images:debian/buster mydebiancontainername
|
||||
```
|
||||
### New CentOS 7 container
|
||||
```
|
||||
lxc launch images:centos/7/amd64 centos
|
||||
```
|
||||
### List containers
|
||||
```
|
||||
lxc list -cns
|
||||
```
|
||||
Result:
|
||||
```
|
||||
+---------------+---------+
|
||||
| NAME | STATE |
|
||||
+---------------+---------+
|
||||
| mycontainer | RUNNING |
|
||||
+---------------+---------+
|
||||
```
|
||||
### Stop and delete container
|
||||
```
|
||||
lxc stop mycontainer
|
||||
lxc delete mycontainer
|
||||
```
|
||||
@@ -0,0 +1,78 @@
|
||||
# Older way to make releases, does not work.
|
||||
|
||||
***
|
||||
|
||||
|
||||
## Triggering git import process manually
|
||||
|
||||
[Info source](https://github.com/wekan/wekan-snap/issues/2#issuecomment-311324364)
|
||||
|
||||
To make build quicker, it's possible to trigger git import process manually in launchpad, so you don't need to wait for next sync.
|
||||
|
||||
https://code.launchpad.net/~wekan-team/wekan/+git/wekan
|
||||
|
||||
|
||||
|
||||
## Launchpad project
|
||||
|
||||
[Info source](https://github.com/wekan/wekan-snap/pull/3#issuecomment-310764751)
|
||||
|
||||
kubiko created launchpad wekan project and wekan team where xet7 is admin in and contributor. xet7 can feel free to add other people on the list.
|
||||
|
||||
Wekan project has wekan-snap repo mirrored from github one:
|
||||
|
||||
https://code.launchpad.net/~wekan-team/wekan/+git/wekan-snap
|
||||
|
||||
Sync happens every ~5 hours
|
||||
|
||||
There is snap package enabled for this repo which has automatic build upon change in repo enabled, you can see there also build queue:
|
||||
|
||||
https://code.launchpad.net/~wekan-team/+snap/wekan-devel
|
||||
|
||||
It has also auto push to store enabled, so once built snap is uploaded to candidate channel.
|
||||
|
||||
Once you snap is uploaded you should see it here:
|
||||
|
||||
https://dashboard.snapcraft.io/dev/snaps/7867
|
||||
|
||||
kubiko got email from launchpad account and added xet7 as collaborator list, so xet7 can control promotion to stable channel once candidate version is tested. There xet7 can see there some other interesting stats about snap adoption.
|
||||
|
||||
For the future once xet7 makes change in wekan-snap build and upload should happen automatically, no need for additional interaction.
|
||||
|
||||
Next thing for kubiko would be to move people from wekan-ondra to wekan, not quite sure how to announce this though….. From stats kubiko did see there are ~320 downloads/installs of version 0.23.
|
||||
|
||||
kubiko also created pull request to wekan repo, which enabled continuous integration from master, typically this would be pushing builds to edge channel, from where xet7 can do testing, or more adventures users can use edge channel to track Wekan master branch….
|
||||
|
||||
## Snapcraft build support from source
|
||||
|
||||
[Info source](https://github.com/wekan/wekan/pull/1091)
|
||||
|
||||
Adding snapcraft build support. This can be used together with launchpad build system for continuous integration.
|
||||
|
||||
Intention is to push snaps build from devel branch to edge channel, which can be installed by calling:
|
||||
|
||||
```
|
||||
$ snap install -edge wekan
|
||||
```
|
||||
|
||||
device will keep automatically updating to revisions as they are released to edge channel
|
||||
|
||||
@xet7 Snap build job is now created, you can see it here:
|
||||
|
||||
https://code.launchpad.net/~wekan-team/+snap/wekan-devel
|
||||
|
||||
It's building from devel branch, fee free to change that if you prefer it to build from different branch.
|
||||
Same as for release apply here, auto builds on change, only resulting snap is pushed to edge channel instead.
|
||||
Also check please version name if you want it to be something different than:
|
||||
|
||||
```
|
||||
0.26-SNAPSHOT
|
||||
```
|
||||
|
||||
## Old links, not in use
|
||||
|
||||
( Old trigger git import https://code.launchpad.net/~wekan-team/wekan/+git/wekan-snap )
|
||||
|
||||
( Old build queue, not in use: https://code.launchpad.net/~wekan-team/+snap/wekan-release )
|
||||
|
||||
( Old build queue, not in use: https://code.launchpad.net/~ondrak/+snap/wekan-devel )
|
||||
@@ -0,0 +1 @@
|
||||
https://github.com/wekan/wekan/wiki/OpenSuse
|
||||
@@ -0,0 +1,14 @@
|
||||
## Share MongoDB to other snaps
|
||||
|
||||
- connect mongodb-slot with plug from corresponding snap(s)
|
||||
- configure corresponding service to use mongodb unix socket in shared directory, socket file name is: mongodb-.sock
|
||||
|
||||
## Sharing MongoDB from other snap to wekan
|
||||
- connect mongodb-plug with slot from snap providing mongodb
|
||||
- disable mongodb in wekan by calling:
|
||||
|
||||
```
|
||||
$ snap set wekan set disable-mongodb='true'
|
||||
```
|
||||
|
||||
- set mongodb-bind-unix-socket to point to serving mongodb. Use relative path inside shared directory, e.g run/mongodb-27017.sock
|
||||
@@ -0,0 +1,125 @@
|
||||
Wekan supports settings key values:
|
||||
|
||||
```
|
||||
$ snap set wekan <key name>='<key value>'
|
||||
|
||||
```
|
||||
## List all possible settings
|
||||
```
|
||||
$ wekan.help | less
|
||||
```
|
||||
|
||||
## List your current snap settings
|
||||
```
|
||||
sudo snap get wekan
|
||||
```
|
||||
## LDAP
|
||||
|
||||
- Settings can be seen with command `wekan.help` and [this config file](https://raw.githubusercontent.com/wekan/wekan/master/snap-src/bin/config).
|
||||
- LDAP repo https://github.com/wekan/wekan-ldap
|
||||
- Bugs and Feature Requests LDAP repo https://github.com/wekan/wekan-ldap/issues
|
||||
|
||||
Example from setting listed at [this config file](https://raw.githubusercontent.com/wekan/wekan/master/snap-src/bin/config):
|
||||
```
|
||||
sudo snap set wekan ldap-enable='true'
|
||||
|
||||
sudo snap set wekan default-authentication-method='ldap'
|
||||
|
||||
sudo snap set wekan ldap-fullname-field='CN'
|
||||
```
|
||||
|
||||
## List of supported keys
|
||||
|
||||
```
|
||||
mongodb-bind-unix-socket: mongodb binding unix socket:
|
||||
Default behaviour will preffer binding over unix socket, to
|
||||
disable unix socket binding set value to 'nill' string
|
||||
To bind to instance of mongodb provided through content
|
||||
interface, set value to relative path to the socket inside
|
||||
'shared' directory.
|
||||
Default value: set to use unix socket binding
|
||||
mongodb-bind-ip: mongodb binding ip address: eg 127.0.0.1 for localhost
|
||||
If not defined default unix socket binding is used instead
|
||||
Default value: ''
|
||||
mongodb-port: mongodb binding port: eg 27017 when using localhost
|
||||
Default value: '27019'
|
||||
mail-url: wekan mail binding
|
||||
Example: 'smtps://user:pass@mailserver.examples.com:453/'
|
||||
Default value: 'smtp://user:pass@mailserver.examples.com:25/'
|
||||
mail-from: wekan's admin mail from name email address
|
||||
For example: 'Boards Support <support@example.com>'
|
||||
Default value: 'wekan-admin@example.com'
|
||||
root-url: wekan's root url, eg http://127.0.0.1, https://example.com,
|
||||
https://wekan.example.com, http://example.com/wekan
|
||||
Default value: 'http://127.0.0.1'
|
||||
port: port wekan is exposed at
|
||||
Default value: '8080'
|
||||
disable-mongodb: Disable mongodb service: use only if binding to
|
||||
database outside of Wekan snap. Valid values: [true,false]
|
||||
Default value: 'false'
|
||||
caddy-enabled: Enable caddy service (caddy - Every Site on HTTPS).
|
||||
see https://caddyserver.com/products/licenses and
|
||||
https://github.com/wekan/wekan-snap/issues/39 ,
|
||||
use personal non-commercial license or
|
||||
contact Wekan maintainer x@xet7.org about enabling
|
||||
commercial license for Caddy.
|
||||
Set to 'true' to enable caddy.
|
||||
caddy settings are handled through
|
||||
/var/snap/wekan/common/Caddyfile
|
||||
Default value: 'false'
|
||||
caddy-bind-port: Port on which caddy will expect proxy, same value
|
||||
will be also set in Caddyfile
|
||||
Default value: '3001'
|
||||
with-api: To enable the API of wekan. If API is disabled,
|
||||
exporting board to JSON does not work.
|
||||
Default value: 'true'
|
||||
cors: Set Access-Control-Allow-Origin header. Example:
|
||||
snap set wekan cors='*'
|
||||
Default value, disabled: ''
|
||||
browser-policy-enabled: Enable browser policy and allow one
|
||||
trusted URL that can have iframe that has
|
||||
Wekan embedded inside.
|
||||
Setting this to false is not recommended,
|
||||
it also disables all other browser policy protections
|
||||
and allows all iframing etc. See wekan/server/policy.js
|
||||
Default value: 'true'
|
||||
trusted-url: When browser policy is enabled, HTML code at this URL
|
||||
can have iframe that embeds Wekan inside.
|
||||
Example: trusted-url='https://example.com'
|
||||
Default value: ''
|
||||
webhooks-attributes: What to send to Outgoing Webhook, or leave out.
|
||||
Example, that includes all that are default:
|
||||
cardId,listId,oldListId,boardId,comment,user,card,commentId .
|
||||
To enable the Webhooks Attributes of Wekan:
|
||||
snap set wekan webhooks-attributes=cardId,listId,oldListId,boardId,comment,user,card,commentId
|
||||
Disable the Webhooks Attributest of Wekan to send all default ones:
|
||||
snap set wekan webhooks-attributes=''
|
||||
```
|
||||
## Rocket.Chat providing OAuth2 login to Wekan
|
||||
|
||||
Also, if you have Rocket.Chat using LDAP/SAML/Google/etc for logging into Rocket.Chat, then same users can login to Wekan when Rocket.Chat is providing OAuth2 login to Wekan.
|
||||
|
||||
[OAuth2 Login Docs](https://github.com/wekan/wekan/wiki/OAuth2)
|
||||
|
||||
## [Matomo web analytics](https://matomo.org) integration
|
||||
Example:
|
||||
```
|
||||
sudo snap set wekan matomo-address='https://matomo.example.com/'
|
||||
sudo snap set wekan matomo-site-id='25'
|
||||
sudo snap set wekan matomo-with-username='true'
|
||||
sudo snap set wekan matomo-do-not-track='false'
|
||||
```
|
||||
Matomo settings keys:
|
||||
```
|
||||
matomo-address: The address of the server where matomo is hosted
|
||||
No value set, using default value: ''
|
||||
matomo-site-id: The value of the site ID given in matomo server for wekan
|
||||
No value set, using default value: ''
|
||||
matomo-do-not-track: The option do not track which enables users to not be tracked by matomo
|
||||
Current value set to: 'true', (default value: 'true')
|
||||
matomo-with-username: The option that allows matomo to retrieve the username
|
||||
Current value set to: 'false', (default value: 'false')
|
||||
```
|
||||
|
||||
|
||||
**When settings are changed, wekan/mongo/caddy services are automatically restarted for changes to take effect.**
|
||||
@@ -0,0 +1,81 @@
|
||||
Please:
|
||||
- Test does WeKan on some non-stable channel work, [add a new issue](https://github.com/wekan/wekan-snap/issues) about can it be added to stable channel.
|
||||
- Check [is there PR about fixing some bug already](https://github.com/wekan/wekan/pulls)
|
||||
- Please report bugs [by adding a new issue](https://github.com/wekan/wekan-snap/issues).
|
||||
- Make backups first, so you are not using your only copy of production data
|
||||
- Have time to test
|
||||
- Have enough disk space. For example, some update migration could write all attachments from database to some subdirectory of `/var/snap/wekan/common` or `/var/snap/wekan-gantt-gpl/common`.
|
||||
- You can try bleeding edge versions of Wekan Snap, that contains cool new features, and could be broken in many ways.
|
||||
- Sometimes Snap builds fail, so then there is no package file to upload to Snap store at all, only successfully built are visible at Snap store. Successfully built does not mean that every feature works.
|
||||
|
||||
[Changing between WeKan and WeKan Gantt GPL](https://github.com/wekan/wekan/issues/2870#issuecomment-721364824)
|
||||
|
||||
## 1) Stop WeKan
|
||||
|
||||
```
|
||||
sudo snap stop wekan
|
||||
```
|
||||
or
|
||||
```
|
||||
sudo snap stop wekan-gantt-gpl
|
||||
```
|
||||
|
||||
## 2) Create Backup
|
||||
|
||||
2.1 Backup settings:
|
||||
|
||||
```
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
```
|
||||
or
|
||||
```
|
||||
sudo snap get wekan-gantt-gpl > snap-settings.txt
|
||||
```
|
||||
|
||||
2.2 https://github.com/wekan/wekan/wiki/Backup
|
||||
|
||||
2.3 Copy files to safe place from /var/snap/wekan/common or /var/snap/wekan-gantt-gpl/common . There could be some board attachments etc.
|
||||
|
||||
## 3) Check what is available at various channels
|
||||
|
||||
https://snapcraft.io/wekan
|
||||
|
||||
https://snapcraft.io/wekan-gantt-gpl
|
||||
|
||||
- Stable: Current working version
|
||||
- Beta: Maybe work, or not
|
||||
- Edge: Newest that did build, no idea does it work or not
|
||||
|
||||
This is how you can try snap beta channel:
|
||||
```
|
||||
sudo snap refresh wekan --beta --amend
|
||||
```
|
||||
This is how to change back to snap stable channel, that most Wekan users have installed:
|
||||
```
|
||||
sudo snap refresh wekan --stable --amend
|
||||
```
|
||||
Wekan stable versions are numbered v1.x
|
||||
|
||||
## 4) Update all Snaps to newest on that channel
|
||||
|
||||
[Check you don't have Snap updates disabled](Automatic-update-schedule#if-required-you-can-disable-all-snap-updates)
|
||||
|
||||
```
|
||||
sudo snap refresh
|
||||
|
||||
```
|
||||
|
||||
## 5) Start WeKan
|
||||
|
||||
```
|
||||
sudo snap stop wekan
|
||||
```
|
||||
or
|
||||
```
|
||||
sudo snap stop wekan-gantt-gpl
|
||||
```
|
||||
|
||||
## Other docs
|
||||
|
||||
* [Adding Snap settings to code](https://github.com/wekan/wekan/wiki/Adding-new-Snap-settings-to-code)
|
||||
* [Wekan Developer Docs](https://github.com/wekan/wekan/wiki/Developer-Documentation)
|
||||
@@ -0,0 +1,65 @@
|
||||
[Info source](https://github.com/wekan/wekan-snap/issues/4#issuecomment-311355296)
|
||||
|
||||
1) All you need to do is
|
||||
|
||||
```
|
||||
$ snap install wekan
|
||||
```
|
||||
|
||||
2) Enable/disable is not needed, it is there for cases when for example you want to stop wekan, but do not want to uninstall it (uninstall will delete also all user data)
|
||||
|
||||
3) Wekan is service, so apart of help, it does not have any "user executables"
|
||||
|
||||
4) You can check status of wekan with:
|
||||
|
||||
```
|
||||
$ sudo systemctl status snap.wekan.*
|
||||
```
|
||||
|
||||
there should be two services, mongodb and wekan running, of either of them is showing error, that would be place to look first. To get detailed look, use
|
||||
|
||||
```
|
||||
$ sudo journalctl -u snap.wekan.*
|
||||
```
|
||||
|
||||
or detailed look of one of services:
|
||||
|
||||
```
|
||||
$ sudo journalctl -u snap.wekan.wekan.service
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
$ snap.wekan.mongodb.service
|
||||
```
|
||||
|
||||
5) Content interface for mongodb (wekan:mongodb-slot, wekan:mongodb-plug) is there only for more complex cases where for reason you want to:
|
||||
|
||||
a) share wekan's mongodb instance with other services, use wekan:mongodb-slot
|
||||
|
||||
b) you want to use mongodb instance from some other service, use wekan:mongodb-plug
|
||||
so connecting wekan:mongodb-plug to wekan:mongodb-slot really makes no sense :)
|
||||
|
||||
As @xet7 suggested, first thing to make sure is that update your machine, so you are running up to date snapd. You can check your version with
|
||||
|
||||
```
|
||||
$ snap version
|
||||
```
|
||||
|
||||
Currently we are on 2.26
|
||||
|
||||
Otherwise shared folders are created under:
|
||||
|
||||
```
|
||||
/var/snap/wekan/current where writable data lives
|
||||
```
|
||||
|
||||
Databases and other settings live under:
|
||||
|
||||
```
|
||||
/var/snap/wekan/common/
|
||||
/snap/wekan/current is read only mount of squashfs wekan's image.
|
||||
```
|
||||
|
||||
[Troubleshooting Email](https://github.com/wekan/wekan/wiki/Troubleshooting-Mail)
|
||||
@@ -0,0 +1,54 @@
|
||||
List what snaps you have installed. Core is part of snap itself.
|
||||
```
|
||||
sudo snap list
|
||||
```
|
||||
List what snap services are running:
|
||||
```
|
||||
sudo snap services
|
||||
```
|
||||
Uninstall Wekan snap and delete all Wekan data. If you have other snaps installed, you can remove them too. Don't remove core, it's part of snap itself.
|
||||
```
|
||||
sudo snap stop wekan
|
||||
|
||||
sudo snap disable wekan
|
||||
|
||||
sudo snap remove wekan
|
||||
```
|
||||
OPTIONAL ALTERNATIVE WAY, NOT REQUIRED: Disable some services of wekan using systemd:
|
||||
```
|
||||
sudo systemctl stop snap.wekan.wekan
|
||||
|
||||
sudo systemctl stop snap.wekan.mongodb
|
||||
|
||||
sudo systemctl stop snap.wekan.caddy
|
||||
|
||||
sudo systemctl disable snap.wekan.wekan
|
||||
|
||||
sudo systemctl disable snap.wekan.mongodb
|
||||
|
||||
sudo systemctl disable snap.wekan.caddy
|
||||
```
|
||||
Uninstall snap at CentOS:
|
||||
```
|
||||
sudo systemctl disable --now snapd.socket
|
||||
|
||||
sudo yum copr disable ngompa/snapcore-el7
|
||||
|
||||
sudo yum remove yum-plugin-copr snapd
|
||||
```
|
||||
Uninstall snap at Debian/Ubuntu/Mint:
|
||||
```
|
||||
sudo systemctl stop snapd
|
||||
|
||||
sudo systemctl disable snapd
|
||||
|
||||
sudo apt --purge remove snapd
|
||||
```
|
||||
Uninstall snap at [Ubuntu 14.04](https://github.com/wekan/wekan-snap/issues/34#issuecomment-378295168):
|
||||
```
|
||||
sudo service snapd stop
|
||||
|
||||
sudo update-rc.d -f snapd remove
|
||||
|
||||
sudo apt-get --purge remove snapd
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
Update all snap packages, like Wekan and others, with commmand:
|
||||
|
||||
```
|
||||
sudo snap refresh
|
||||
```
|
||||
@@ -0,0 +1,22 @@
|
||||
## ADFS 4.0 using OAuth 2 and OpenID
|
||||
|
||||
[Related issue](https://github.com/wekan/wekan/issues/3184)
|
||||
|
||||
There is these settings.
|
||||
|
||||
## Snap
|
||||
```
|
||||
sudo snap set oauth2-enabled='true'
|
||||
sudo snap set oauth2-adfs-enabled='true'
|
||||
```
|
||||
Unset:
|
||||
```
|
||||
sudo snap unset oauth2-enabled
|
||||
sudo snap unset oauth2-adfs-enabled
|
||||
```
|
||||
## Docker and .sh/.bat
|
||||
```
|
||||
OAUTH2_ENABLED=true
|
||||
OAUTH2_ADFS_ENABLED=true
|
||||
```
|
||||
To disable, uncomment or remove that line.
|
||||
@@ -0,0 +1,186 @@
|
||||
[Scaling Meteor](https://medium.freecodecamp.org/scaling-meteor-a-year-on-26ee37588e4b)
|
||||
|
||||
## Production setup at AWS for thousands of users
|
||||
|
||||
* 3-4x m4.large for Node (ECS Cluster)
|
||||
* 3x r4.large for Mongo (1 Primary for read and write, 2 replicas)
|
||||
|
||||
This setup runs very well for thousands of users.
|
||||
|
||||
To improve scalability even more, add [Redis Oplog support](https://github.com/cult-of-coders/redis-oplog), also see related [Redis Oplog discussion forum post](https://forums.meteor.com/t/meteor-scaling-redis-oplog-status-prod-ready/30855/479). At AWS you can use AWS ElastiCache that has Redis support.
|
||||
|
||||
### Mongo URL AND Oplog settings
|
||||
From [comment at issue](https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587):
|
||||
We've fixed our CPU usage problem today with an environment
|
||||
change around Wekan. I wasn't aware during implementation
|
||||
that if you're using more than 1 instance of Wekan
|
||||
(or any MeteorJS based tool) you're supposed to set
|
||||
MONGO_OPLOG_URL as an environment variable.
|
||||
Without setting it, Meteor will perform a pull-and-diff
|
||||
update of it's dataset. With it, Meteor will update from
|
||||
the OPLOG. See here
|
||||
https://blog.meteor.com/tuning-meteor-mongo-livedata-for-scalability-13fe9deb8908
|
||||
|
||||
After setting in [docker-compose.yml](https://github.com/wekan/wekan-mongodb/blob/master/docker-compose.yml):
|
||||
```
|
||||
MONGO_OPLOG_URL=mongodb://<username>:<password>@<mongoDbURL>/local?authSource=admin&replicaSet=rsWekan
|
||||
```
|
||||
the CPU usage for all Wekan instances dropped to an average
|
||||
of less than 10% with only occasional spikes to high usage
|
||||
(I guess when someone is doing a lot of work)
|
||||
```
|
||||
- MONGO_URL=mongodb://wekandb:27017/wekan
|
||||
- MONGO_OPLOG_URL=mongodb://<username>:<password>@<mongoDbURL>/local?authSource=admin&replicaSet=rsWekan
|
||||
```
|
||||
|
||||
If there is other ideas to improve scalability, add info to [existing scalability issue](https://github.com/wekan/wekan-mongodb/issues/2) or [scalability forum post](https://discourse.wekan.io/t/cpu-utilization-problems-with-large-userbase/579/15), there is also mentioned that smart-disconnect is already in Wekan.
|
||||
|
||||
For Enterprises using Wekan xet7 recommends participating in Wekan development, see [Benefits of contributing your features to Upstream Wekan](https://blog.wekan.team/2018/02/benefits-of-contributing-your-features-to-upstream-wekan/index.html), having your own developers working on Wekan daily, and using Commercial Support at https://wekan.team , as Wekan Team [already has access to high performance bare metal servers at CNCF / Packet for running high load testing](https://blog.wekan.team/2018/01/wekan-progress-on-x64-and-arm/index.html). With the benefits you get by using Wekan, it’s [time well spent](https://blog.wekan.team/2018/02/time-well-spent/index.html). Some [DTrace and eBPF info here](https://news.ycombinator.com/item?id=16375938).
|
||||
|
||||
## Single Server Install for small teams
|
||||
|
||||
1) Add AWS Security Group with for example name wekan, and incoming ports 80 and 443 for all. Only add ssh access to your own IP address CIDR like 123.123.123.123/32 so it means one IP address.
|
||||
|
||||
2) Start Ubuntu 17.10 64bit EC2 instance that has at least 2 GB RAM, 30 GB diskspace, probably you need more when you add more customers. Add your SSH public key to instance or let it create new.
|
||||
|
||||
3) Add new Elastic IP address pointing to your EC2 instance. That way IP address stays same, and you can also make snapshot of EC2 instance and start that as new EC2 instance with more RAM and change Elastic IP to point to new EC2 instance with minimal downtime, but prefer times when there is no active changes to Wekan.
|
||||
|
||||
4) Set your subdomain.yourdomain.com address DNS pointing to your Elastic IP address as A record in Route 53, Namecheap or elsewhere where your domain control panel is. It will take max 24h for DNS to propagate globally.
|
||||
|
||||
5) ssh to your server, for example:
|
||||
|
||||
```
|
||||
ssh -i pubkey.pem ubuntu@server-ip-address
|
||||
|
||||
(or: root@)
|
||||
```
|
||||
|
||||
6) Update all packages:
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
sudo apt -y dist-upgrade
|
||||
reboot
|
||||
```
|
||||
|
||||
7) Install Docker CE and docker-compose for ubuntu from www.docker.com , also add user ubuntu to group docker in post-install step.
|
||||
|
||||
8) Install nginx, for example:
|
||||
|
||||
```
|
||||
sudo apt install nginx
|
||||
(or: nginx-full)
|
||||
sudo systemctl start nginx
|
||||
sudo systemctl enable nginx
|
||||
```
|
||||
|
||||
[Example nginx config](Nginx-Webserver-Config)
|
||||
|
||||
Test nginx config with:
|
||||
|
||||
```
|
||||
sudo nginx -t
|
||||
```
|
||||
|
||||
And take config into use with:
|
||||
|
||||
```
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
9) Install certbot from https://certbot.eff.org for Let's Encrypt SSL certs, redirect http to https
|
||||
|
||||
10) For different customers, you use different location /customer1 2 etc block and wekan running behind nginx proxy on different localhost port in same nginx virtualhost subdomain config file.
|
||||
|
||||
11) Get latest wekan release info from https://github.com/wekan/wekan/releases , read docker-compose.yml file from https://github.com/wekan/wekan-mongodb where all settings are explained, so you setup ROOT_URL=https://sub.yourdomain.com/customer1 and for example the 8080:80 for local server port 8080 to go inside docker port 80.
|
||||
|
||||
For example Wekan v0.70, use in docker-compose.yml file:
|
||||
image: quay.io/wekan/wekan:v0.70
|
||||
Only use release version tags, because latest tag can be broken sometimes.
|
||||
|
||||
12) For email, in AWS SES add email address to domain, verify SPF and DKIM with Route53 wizard if you have domain at Route53 as I recommend. At SES create new SMTP credentials and [add them to docker-compose.yml SMTP settings](Troubleshooting-Mail)
|
||||
|
||||
13) Start wekan and mongodb database containers with command:
|
||||
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
So it goes nginx SSL port 443 => proxy to localhost port 8080 or any other => wekan-app port 80 inside docker
|
||||
|
||||
14) For different customers have different docker-compose.yml script in directories named by customer names. You may need to rename docker containers from wekan-app to wekan-customer1 etc, and probably also docker internal network names.
|
||||
|
||||
15) [Backup, restore, and moving data outside/inside docker](Export-Docker-Mongo-Data)
|
||||
|
||||
16) Register as user at https://subdomain.yourdomain.com/customer1/sign-up and login at https://subdomain.yourdomain.com/customer1/sign-in , first user will be admin. Click your username at top right corner / Admin Panel, and there chang settings to invite only.
|
||||
|
||||
## Upgrading Wekan
|
||||
|
||||
1) Go to directory where docker-compose.yml is, as in install step 14) , and create directory for backup
|
||||
|
||||
```
|
||||
cd wekan-customer1
|
||||
mkdir backup-2018-02-03
|
||||
cd backup-2018-02-03
|
||||
```
|
||||
|
||||
2) Make backup of database outside docker in that backup directory, as in install step 15)
|
||||
|
||||
3) Edit docker-compose.yml to have new Wekan release number:
|
||||
|
||||
```
|
||||
image: quay.io/wekan/wekan:v0.71
|
||||
```
|
||||
|
||||
4) Restart Wekan:
|
||||
|
||||
```
|
||||
docker-compose stop
|
||||
docker-compose start
|
||||
```
|
||||
|
||||
5) Login to Wekan and check at Admin Panel that Wekan version is updated.
|
||||
|
||||
6) If version is not updated, you could also need some of these:
|
||||
|
||||
Seeing what Docker containers are running:
|
||||
```
|
||||
docker ps
|
||||
```
|
||||
|
||||
Seeing what Docker images are installed:
|
||||
|
||||
```
|
||||
docker images
|
||||
```
|
||||
|
||||
Stopping containers (or start, if starting containers)
|
||||
|
||||
```
|
||||
docker stop wekan-app
|
||||
docker stop CONTAINER-ID-HERE
|
||||
```
|
||||
|
||||
Removing containers:
|
||||
|
||||
```
|
||||
docker rm wekan-app
|
||||
docker rm CONTAINER-ID-HERE
|
||||
```
|
||||
|
||||
Removing images:
|
||||
|
||||
```
|
||||
docker rmi quay.io/wekan/wekan:latest
|
||||
docker rmi quay.io/wekan/wekan:v0.70
|
||||
```
|
||||
|
||||
Starting new containers from docker-compose.yml file:
|
||||
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
TODO:
|
||||
- allow resend invites https://github.com/wekan/wekan/issues/1320
|
||||
- changing logo everywhere, whitelabeling https://github.com/wekan/wekan/issues/1196
|
||||
@@ -0,0 +1,14 @@
|
||||
## Brute force protection
|
||||
|
||||
For settings, see:
|
||||
- Snap: `wekan.help | grep lockout`
|
||||
- Docker: Search lockout from docker-compose.yml at https://github.com/wekan/wekan
|
||||
|
||||
[Removing lockout from users](https://github.com/wekan/wekan/issues/3306)
|
||||
|
||||
For UCS, it's UCS VM and inside it Docker container. You just ssh your ucs VM like this, with same username password you used when installin UCS and administering UCS apps, su to root:
|
||||
```
|
||||
ssh Administrator@192.168.0.100
|
||||
su
|
||||
```
|
||||
And then use those Docker commands https://github.com/wekan/wekan/issues/3306#issuecomment-712743002
|
||||
@@ -0,0 +1,91 @@
|
||||
# Also see Snap Developer Docs
|
||||
|
||||
[Snap Developer Docs](https://github.com/wekan/wekan-snap/wiki/Snap-Developer-Docs)
|
||||
|
||||
# When adding settings to code you or somebody else wrote
|
||||
|
||||
Add all necessary settings that you find on code.
|
||||
|
||||
After doing all changes, [fix lint errors](Developer-Documentation#preventing-travis-ci-lint-errors-before-submitting-pull-requests) and if possible warnings too. You can silence errors if you really can't find solution.
|
||||
|
||||
Submit pull request to Wekan edge branch https://github.com/wekan/wekan/tree/edge
|
||||
|
||||
# Changes to server code
|
||||
|
||||
To use environment variables in your serverside code, use:
|
||||
```
|
||||
process.env.YOURSETTING
|
||||
```
|
||||
Example: [wekan/server/policy.js](https://github.com/wekan/wekan/blob/edge/server/policy.js)
|
||||
|
||||
# Changes to [config](https://github.com/wekan/wekan/blob/edge/snap-src/bin/config)
|
||||
|
||||
## 1) Add to beginning
|
||||
|
||||
At beginning there is this line:
|
||||
```
|
||||
# list of supported keys
|
||||
keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP ..."
|
||||
```
|
||||
To the end of it, add name of new setting. For example:
|
||||
```
|
||||
keys="... AWESOME_FEATURE_ENABLED"
|
||||
```
|
||||
|
||||
## 2) Add to bottom
|
||||
|
||||
Example 1: Set features not enabled as default.
|
||||
```
|
||||
DESCRIPTION_LDAP_ENABLED="LDAP enabled. Default: false"
|
||||
DEFAULT_LDAP_ENABLED="false"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 2: If setting is different for every server, leave it empty.
|
||||
```
|
||||
DESCRIPTION_OAUTH2_TOKEN_ENDPOINT="OAuth2 token endpoint. Example: /oauth/token"
|
||||
DEFAULT_OAUTH2_TOKEN_ENDPOINT=""
|
||||
KEY_OAUTH2_TOKEN_ENDPOINT="oauth2-token-endpoint"
|
||||
```
|
||||
Example 3: If there is same for every server, set it to general setting.
|
||||
```
|
||||
DESCRIPTION_LDAP_SEARCH_FILTER="LDAP search filter. Default: (&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
DEFAULT_LDAP_SEARCH_FILTER="(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 4: If you don't know example, leave it without example.
|
||||
```
|
||||
DESCRIPTION_TURBO_FILTER="Turbo filter. Default: ''"
|
||||
DEFAULT_TURBO_FILTER=""
|
||||
KEY_TURBO_FILTER="turbo-filter"
|
||||
```
|
||||
|
||||
# Changes to [Snap help](https://github.com/wekan/wekan/blob/edge/snap-src/bin/wekan-help)
|
||||
|
||||
## 1) How to quote examples
|
||||
|
||||
Snap settings need to be lowercase, and inside single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='(&(objectCategory=person)(objectClass=user)(!(cn=andy)))'
|
||||
```
|
||||
The setting inside single quotes is the actual setting.
|
||||
|
||||
Actual settings can include double quotes, spaces, etc, but not single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='"(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"'
|
||||
```
|
||||
|
||||
## 2) What to add as setting to Wekan help
|
||||
|
||||
Example 1:
|
||||
```
|
||||
echo -e "OAuth2 Token Endpoint. Example: /oauth/token"
|
||||
echo -e "To enable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT='/oauth/token'"
|
||||
echo -e "\t-Disable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT=''"
|
||||
echo -e "\n"
|
||||
```
|
||||
So all you add need to be above of this line:
|
||||
```
|
||||
# parse config file for supported settings keys
|
||||
```
|
||||
@@ -0,0 +1,32 @@
|
||||
## Standalone Wekan: Snap, (Docker, Source, VirtualBox)
|
||||
|
||||
1) [Install Wekan Snap](https://github.com/wekan/wekan-snap/wiki/Install)
|
||||
|
||||
2) Go to your Wekan URL like https://example.com/sign-up (your address + /sign-up)
|
||||
|
||||
3) Register your username, email address and password. First registered user will be admin, and next ones normal users. If you want other admins too, you can change their permission to admin at Admin Panel.
|
||||
|
||||
4) **If you get Internal Server Error when creating account, it's because you have not configured email, and you can ignore it. WORKING EMAIL IS NOT REQUIRED. Wekan works without setting up email.**
|
||||
|
||||
If you really want email sending, do for example:
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://user:pass@mailserver.example.com:457/'
|
||||
sudo snap set wekan mail-from='Example Wekan Support <support@example.com>'
|
||||
```
|
||||
For more options see [Troubleshooting Email](Troubleshooting-Mail)
|
||||
|
||||
5) Login to Wekan at https://example.com/sign-in (your address + /sign-in)
|
||||
|
||||
6) Click on top right your username / Admin Panel. You can change permissions, name, email address and password in Admin Panel.
|
||||
|
||||

|
||||
|
||||
7) For registering other users:
|
||||
|
||||
a) Let them self-register, or open webbrowser incongnito window, and register them at https://example.com/sign-up (your address + /sign-up)
|
||||
|
||||
b) If your email works, click Admin Panel / Settings / Registration / [X] Disable self-registration. Then invite new users to selected boards by email address.
|
||||
|
||||
## Deleting Users
|
||||
|
||||
[No delete feature yet](https://github.com/wekan/wekan/issues/1289)
|
||||
@@ -0,0 +1,3 @@
|
||||
[Wekan v5.55 and newer](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v555-2021-08-31-wekan-release)
|
||||
|
||||
<img src="https://wekan.github.io/allow-private-boards-only.png" width="60%" alt="Allow private boards only" />
|
||||
@@ -0,0 +1,55 @@
|
||||
### Running Wekan server at Android
|
||||
|
||||
Requirements:
|
||||
- arm64 or x64 Android with at least 3 GB RAM. Tested with with arm64 OnePlus 3 that has 6 GB RAM.
|
||||
- It is not necessary to root Android.
|
||||
|
||||
## 1) Install AnLinux and Termux from Play Store
|
||||
|
||||
At AnLinux choose:
|
||||
- Ubuntu
|
||||
- XFCE4
|
||||
- Copy those commands to Termux to install Linux.
|
||||
|
||||
## 2) At Termux
|
||||
|
||||
When you get from Termux to Ubuntu bash, you can install Wekan similarly like arm64 or x64:
|
||||
https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
|
||||
Edit start-wekan.sh so you can start Wekan for example:
|
||||
```
|
||||
ROOT_URL=http://localhost:2000
|
||||
PORT=2000
|
||||
```
|
||||
At Android webbrowser like Chrome and Firefox browse to http://localhost:2000
|
||||
|
||||
## 3) WLAN
|
||||
|
||||
If you connect to WLAN, you can get your IP address with command:
|
||||
```
|
||||
ip address
|
||||
```
|
||||
Edit start-wekan.sh so you can start Wekan for example:
|
||||
```
|
||||
ROOT_URL=http://IP-ADDRESS:2000
|
||||
PORT=2000
|
||||
```
|
||||
Then you can use any computer or mobile phone Javascript capable webbrowser at WLAN to use Wekan at http://IP-ADDRESS:2000 like http://192.168.0.100:2000 . [More info about ROOT_URL](Settings).
|
||||
|
||||
## 4) Optional: Mobile Linux Desktop
|
||||
|
||||
Requirements:
|
||||
- 1 WLAN, for example: mobile hotspot, Android device sharing WLAN, hotel WLAN, office WLAN
|
||||
- ChromeCast that is connected to HDMI Input of hotel/office/home TV and WLAN
|
||||
- Bluetooth keyboard
|
||||
- Bluetooth mouse
|
||||
- 1 Android device that has:
|
||||
- Wekan installed according to steps 1-3 above
|
||||
- Android VNC client to local AnLinux Ubuntu desktop
|
||||
- Firefox installed with apt-get to that Ubuntu desktop, browsing Wekan at http://IP-ADDRESS:2000
|
||||
- Using ChromeCast to show Android full screen at TV
|
||||
|
||||
This way, you have:
|
||||
- Big TV display
|
||||
- Full size keyboard and mouse
|
||||
- Full featured Firefox at Ubuntu Desktop using Wekan
|
||||
@@ -0,0 +1,143 @@
|
||||
## 1) Enable Mod_Proxy
|
||||
|
||||
```
|
||||
sudo a2enmod ssl proxy proxy_http proxy_wstunnel proxy_balancer
|
||||
```
|
||||
|
||||
[Apache Mod_Proxy documentation](http://httpd.apache.org/docs/current/mod/mod_proxy.html)
|
||||
|
||||
## 2) Restart Apache
|
||||
|
||||
Systemd:
|
||||
```
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
Init.d:
|
||||
```
|
||||
sudo service apache2 restart
|
||||
```
|
||||
|
||||
## 3) Enable SSL in Apache config
|
||||
```
|
||||
Listen 443
|
||||
|
||||
NameVirtualHost *:443
|
||||
```
|
||||
## 4) Set Apache proxy
|
||||
|
||||
Remember to set `- ROOT_URL=` to the full URL used for your reverse proxy or as `ServerName`.
|
||||
|
||||
### a) Main URL
|
||||
|
||||
SSL with [Certbot](https://certbot.eff.org).
|
||||
|
||||
Config at `/etc/apache2/sites-available/example.com.conf`:
|
||||
|
||||
```ApacheConf
|
||||
<VirtualHost *:443>
|
||||
|
||||
ServerName example.com
|
||||
|
||||
SSLEngine On
|
||||
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
|
||||
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||
ServerSignature Off
|
||||
|
||||
<Location />
|
||||
require all granted
|
||||
</Location>
|
||||
|
||||
ProxyPassMatch "^/(sockjs\/.*\/websocket)$" "ws://127.0.0.1:3001/$1"
|
||||
ProxyPass "/" "http://127.0.0.1:3001/"
|
||||
ProxyPassReverse "/" "http://127.0.0.1:3001/"
|
||||
|
||||
<Proxy *>
|
||||
Options FollowSymLinks MultiViews
|
||||
AllowOverride All
|
||||
Order allow,deny
|
||||
allow from all
|
||||
</Proxy>
|
||||
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
### b) Sub URL
|
||||
Currently, favicon loading does not work with sub-url [wekan/issues/1692](https://github.com/wekan/wekan/issues/1692)
|
||||
|
||||
Config at `/etc/apache2/sites-available/example.com.conf`:
|
||||
|
||||
```ApacheConf
|
||||
<VirtualHost *:443>
|
||||
|
||||
ServerName example.com/wekan
|
||||
|
||||
SSLEngine On
|
||||
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
|
||||
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||
ServerSignature Off
|
||||
|
||||
ProxyPassMatch "^/(sockjs\/.*\/websocket)$" "ws://127.0.0.1:3001/wekan/$1"
|
||||
ProxyPass "/wekan" "http://127.0.0.1:3001/wekan"
|
||||
ProxyPassReverse "/wekan" "http://127.0.0.1:3001/wekan"
|
||||
|
||||
<Proxy *>
|
||||
Options FollowSymLinks MultiViews
|
||||
AllowOverride All
|
||||
Order allow,deny
|
||||
allow from all
|
||||
</Proxy>
|
||||
|
||||
</VirtualHost>
|
||||
```
|
||||
To run as default site:
|
||||
```ApacheConf
|
||||
<VirtualHost _default_:443>
|
||||
```
|
||||
|
||||
## 5) Enable your site
|
||||
|
||||
```
|
||||
sudo a2ensite example.com
|
||||
```
|
||||
Or, add symlink manually:
|
||||
```
|
||||
sudo su
|
||||
|
||||
cd /etc/apache2/sites-enabled
|
||||
|
||||
ln -s ../sites-available/example.com.conf example.com.conf
|
||||
```
|
||||
On some distributions, Apache config is at different path:
|
||||
```
|
||||
cd /etc/httpd/conf.d
|
||||
```
|
||||
|
||||
## 6) Reload Apache
|
||||
|
||||
Systemd:
|
||||
```
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
Init.d:
|
||||
```
|
||||
sudo service apache2 restart
|
||||
```
|
||||
|
||||
## 7) Snap settings
|
||||
|
||||
### a) Main URL
|
||||
```
|
||||
sudo snap set wekan port='3001'
|
||||
|
||||
sudo snap set wekan root-url='https://example.com'
|
||||
```
|
||||
### b) Sub URL
|
||||
```
|
||||
snap set wekan port='3001'
|
||||
|
||||
snap set wekan root-url='https://example.com/wekan'
|
||||
```
|
||||
|
||||
[All snap settings](https://github.com/wekan/wekan-snap/wiki/Supported-settings-keys)
|
||||
@@ -0,0 +1,31 @@
|
||||
These are on Standalone Wekan: Snap/Docker/Source/VirtualBox. Some of these are also at Sandstorm Wekan.
|
||||
|
||||
## Move to Archive: Restore possible
|
||||
|
||||
Board => ☰ => Move Board to Archive
|
||||
|
||||
Swimlane => ☰ => Move Swimlane to Archive
|
||||
|
||||
List => ☰ => Move List to Archive
|
||||
|
||||
Card => ☰ => Move Card to Archive
|
||||
|
||||
## Restore Card/List/Swimlane from Archive
|
||||
|
||||
Board => ☰ => Archive => Cards/Lists/Swimlanes Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
|
||||
## Restore or Delete board
|
||||
|
||||
All Boards => Archive => Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
|
||||
## Deleting - NO UNDO
|
||||
|
||||
Deleting Board: All Boards => Archive => Delete
|
||||
|
||||
Deleting Card: Card => ☰ => More => Delete (at right bottom corner)
|
||||
|
||||
Deleting List: List => ☰ => More => Delete (at right bottom corner)
|
||||
|
||||
Deleting Swimlane:
|
||||
1) Swimlane => ☰ => Move Swimlane to Archive
|
||||
2) Board => ☰ => Archive => Cards/Lists/Swimlanes Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
@@ -0,0 +1,5 @@
|
||||
2022-03-02
|
||||
|
||||
[Added Perl scripts for Asana export to WeKan ®](https://github.com/wekan/wekan/tree/main/asana)
|
||||
|
||||
Thanks to GeekRuthie !
|
||||
@@ -0,0 +1,178 @@
|
||||
### Install for example from:
|
||||
- [Snap](Snap)
|
||||
- [Docker](Docker)
|
||||
|
||||
*Make sure you are running at least **v2.21***
|
||||
|
||||
### Snap install info, tested 2021-07-16
|
||||
|
||||
[About AZURE-NEW-APP-CLIENT-ID and AZURE-NEW-APP-SECRET](https://community.microfocus.com/t5/Identity-Manager-Tips/Creating-the-application-Client-ID-and-Client-Secret-from/ta-p/1776619). The redirect URL is your Wekan root-url+_oauth/oidc like this: https://boards.example.com/_oauth/oidc
|
||||
|
||||
AZURE_DIRECTORY_ID = TENANT-NAME-FOR-YOUR-ORGANIZATION
|
||||
|
||||
### If Azure Active Directory login does not work
|
||||
|
||||
Check that your CLIENT_SECRET = AZURE-NEW-APP-SECRET has not expired. If it has, delete old secret, and add new secret.
|
||||
Add it like this, and also check that your Azure Directory ID is in server URL:
|
||||
|
||||
```
|
||||
sudo snap set wekan oauth2-secret='AZURE-CLIENT-SECRET'
|
||||
|
||||
sudo snap set wekan oauth2-server-url='https://login.microsoftonline.com/AZURE_DIRECTORY_ID'
|
||||
```
|
||||
|
||||
<img src="https://wekan.github.io/azure-app-client-secret.png" width="100%" alt="Azure App Client Secret" />
|
||||
|
||||
|
||||
###
|
||||
|
||||
|
||||
## Note: Mailjet is not available at Azure anymore
|
||||
|
||||
Instead, use O365 at upcoming Wekan v5.38 or newer.
|
||||
|
||||
### Mailjet: getaddrinfo ENOTFOUND
|
||||
|
||||
With Wekan Snap and Mailjet, if you get getaddrinfo ENOTFOUND error when you try to send a test email from within Wekan, it can be something with networking for the snap. Fix can be found in [Ubuntu DNS resolution issue affecting other snap packages](https://github.com/nextcloud/nextcloud-snap/issues/881). Thanks to [peterk for info](https://github.com/wekan/wekan/issues/3184#issuecomment-699669350).
|
||||
|
||||
### Mailjet: mail-from
|
||||
|
||||
When using sending email with Mailjet, set `mail-from` to some real email address so you get info if email bounces back.
|
||||
|
||||
### Snap settings
|
||||
```
|
||||
sudo snap set wekan debug='true'
|
||||
sudo snap set wekan caddy-enabled='true'
|
||||
sudo snap set wekan mail-from='Example Boards <BOARD-ADMIN@example.com>'
|
||||
sudo snap set wekan mail-url='smtps://username:password@in-v3.mailjet.com:465/'
|
||||
sudo snap set wekan oauth2-enabled='true'
|
||||
sudo snap set wekan oauth2-request-permissions='openid'
|
||||
sudo snap set wekan oauth2-client-id='AZURE-NEW-APP-CLIENT-ID'
|
||||
sudo snap set wekan oauth2-secret='AZURE-NEW-APP-SECRET'
|
||||
sudo snap set wekan oauth2-auth-endpoint='/oauth2/v2.0/authorize'
|
||||
sudo snap set wekan oauth2-server-url='https://login.microsoftonline.com/AZURE_DIRECTORY_ID'
|
||||
sudo snap set wekan oauth2-token-endpoint='/oauth2/v2.0/token'
|
||||
sudo snap set wekan oauth2-userinfo-endpoint='https://graph.microsoft.com/oidc/userinfo'
|
||||
sudo snap set wekan oauth2-email-map='email'
|
||||
sudo snap set wekan oauth2-username-map='email'
|
||||
sudo snap set wekan oauth2-fullname-map='name'
|
||||
sudo snap set wekan oauth2-id-map='email'
|
||||
sudo snap set wekan port='3001'
|
||||
sudo snap set wekan richer-card-comment-editor='false'
|
||||
sudo snap set wekan root-url='https://boards.example.com'
|
||||
sudo snap set wekan with-api='true'
|
||||
```
|
||||
|
||||
At Admin Panel / Settings / Email:
|
||||
- SMTP Host: `in-v3.mailjet.com`
|
||||
- SMTP Port: `465`
|
||||
- Username: `MAILJET-USERNAME`
|
||||
- Password: `MAILJET-PASSWORD`
|
||||
- TLS Support: `[_]` (not checked)
|
||||
|
||||
If you use Caddy Let's Encrypt SSL for public server, that requires SSL cert validation from multiple not-listed IP addresses of Let's Encrypt, file `/var/snap/wekan/common/Caddyfile`
|
||||
|
||||
```
|
||||
boards.example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
# If you have static main website in this directory, also add it:
|
||||
example.com {
|
||||
root /var/snap/wekan/common/example.com
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
}
|
||||
```
|
||||
If you have private server that should be only accessible from private IP (limited by Azure firewall settings), and need SSL, you can not use Let's Encrypt free SSL that validates public availability from multiple non-disclosed IP addresses. For this purpose, you can get SSL certificate. Here is example of SSL cert from with SSL.com .
|
||||
|
||||
Join certificates together to .pem file, in order of:
|
||||
1) privatekey of example.com
|
||||
2) wildcard (or one subdomain cert) of example.com
|
||||
3) sub ca
|
||||
4) root ca
|
||||
5) trusted network ca
|
||||
```
|
||||
cat example_com.key >> example.com.pem
|
||||
cat STAR_example_com.crt >> example.com.pem
|
||||
cat SSL_COM_RSA_SSL_SUBCA.crt >> example.com.pem
|
||||
cat SSL_COM_ROOT_CERTIFICATION_AUTHORITY_RSA.crt >> example.com.pem
|
||||
cat CERTUM_TRUSTED_NETWORK_CA.crt >> example.com.pem
|
||||
```
|
||||
Then transfer SSL cert to server:
|
||||
```
|
||||
scp example.com.pem ubuntu@example.com:/home/ubuntu
|
||||
ssh ubuntu@example.com
|
||||
sudo mkdir /var/snap/wekan/common/certs
|
||||
sudo mv example.com.pem /var/snap/wekan/common/certs/
|
||||
sudo chown root:root /var/snap/wekan/common/certs/example.com.pem
|
||||
sudo chmod og-rwx /var/snap/wekan/common/certs/example.com.pem
|
||||
sudo nano /var/snap/wekan/common/Caddyfile
|
||||
```
|
||||
At Caddyfile, add these settings for SSL cert:
|
||||
```
|
||||
# Static main website, if you have that, redirect to SSL
|
||||
http://example.com {
|
||||
redir https://example.com
|
||||
}
|
||||
|
||||
# Wekan redirect to SSL
|
||||
http://boards.example.com {
|
||||
redir https://boards.example.com
|
||||
}
|
||||
|
||||
# Static main website, if you have that in this directory
|
||||
https://example.com {
|
||||
root /var/snap/wekan/common/example.com
|
||||
tls {
|
||||
load /var/snap/wekan/common/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
}
|
||||
|
||||
# Wekan
|
||||
https://boards.example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
Optionally you can would like to [disable all Snap automatic updates](https://github.com/wekan/wekan-snap/wiki/Automatic-update-schedule#if-required-you-can-disable-all-snap-updates) (not recommended, only required by some clients).
|
||||
|
||||
### There are two major steps for configuring Wekan to authenticate to Azure AD via OpenID Connect (OIDC)
|
||||
|
||||
Note: These old docs below don't have all settings listed that above new Snap settings have. Text case and _- is different, for example at Docker there is `OAUTH2_ENABLED=true` when at Snap same setting is `sudo snap set wekan oauth-enabled='true'`
|
||||
|
||||
1. Register the application with Azure. Make sure you capture the application ID as well as generate a secret key.
|
||||
2. Configure the environment variables. This differs slightly by installation type, but make sure you have the following:
|
||||
* OAUTH2_ENABLED = true
|
||||
* OAUTH2_CLIENT_ID = xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx (application GUID captured during app registration)
|
||||
* OAUTH2_SECRET = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (secret key generated during app registration)
|
||||
* OAUTH2_SERVER_URL = https://login.microsoftonline.com/<tenant GUID specific to your organization>
|
||||
* OAUTH2_AUTH_ENDPOINT = /oauth2/v2.0/authorize
|
||||
* OAUTH2_USERINFO_ENDPOINT = https://graph.microsoft.com/oidc/userinfo
|
||||
* OAUTH2_TOKEN_ENDPOINT = /oauth2/v2.0/token
|
||||
* OAUTH2_ID_MAP = email (the claim name you want to map to the unique ID field)
|
||||
* OAUTH2_USERNAME_MAP = email (the claim name you want to map to the username field)
|
||||
* OAUTH2_FULLNAME_MAP = name (the claim name you want to map to the full name field)
|
||||
* OAUTH2_EMAIL_MAP = email (the claim name you want to map to the email field)
|
||||
|
||||
I also recommend setting DEBUG = true until you have a working configuration. It helps.
|
||||
|
||||
You may also find it useful to look at the following configuration information:
|
||||
https://login.microsoftonline.com/**the-tenant-name-for-your-organization**/v2.0/.well-known/openid-configuration
|
||||
|
||||
Some Azure links also at wiki page about moving from Sandstorm to Docker/Snap , and using Docker Swarm:
|
||||
- https://github.com/wekan/wekan/wiki/Export-from-Wekan-Sandstorm-grain-.zip-file#azure-links
|
||||
@@ -0,0 +1,47 @@
|
||||
## Azure AD B2C using OAuth2
|
||||
|
||||
- Original issue: https://github.com/wekan/wekan/issues/5242
|
||||
- B2C feature added: https://github.com/wekan/wekan/commit/93be112a9454c894c1ce3146ed377e6a6aeca64a
|
||||
- Similar like [ADFS](ADFS), but `email` is first of array `userinfo[emails]`
|
||||
|
||||
## Snap
|
||||
|
||||
```
|
||||
sudo snap set wekan oauth2-enabled='true'
|
||||
sudo snap set wekan oauth2-b2c-enabled='true'
|
||||
sudo snap set wekan oauth2-username-map='sub'
|
||||
sudo snap set wekan oauth2-request-permissions='openid email profile'
|
||||
sudo snap set wekan oauth2-client-id='xxxxxxxx'
|
||||
sudo snap set wekan oauth2-secret='xxxxxxx'
|
||||
sudo snap set wekan oauth2-server-url='https://B2C_TENANT_NAME.b2clogin.com/B2C_TENANT_NAME.onmicrosoft.com/B2C_POLICY_NAME'
|
||||
sudo snap set wekan oauth2-auth-endpoint='/oauth2/v2.0/authorize'
|
||||
sudo snap set wekan oauth2-token-endpoint='/oauth2/v2.0/token'
|
||||
sudo snap set wekan oauth2-username-map='sub'
|
||||
sudo snap set wekan oauth2-email-map='email'
|
||||
sudo snap set wekan oauth2-fullname-map='name'
|
||||
sudo snap set wekan oauth2-id-map='sub'
|
||||
```
|
||||
|
||||
## Docker
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/docker-compose.yml
|
||||
|
||||
```
|
||||
- OAUTH2_ENABLED=true
|
||||
- OAUTH2_B2C_ENABLED=true
|
||||
- OAUTH2_USERNAME_MAP=sub
|
||||
- OAUTH2_REQUEST_PERMISSIONS=openid email profile
|
||||
- OAUTH2_CLIENT_ID=xxxxxxxx
|
||||
- OAUTH2_SECRET=xxxxxxx
|
||||
- OAUTH2_SERVER_URL=https://B2C_TENANT_NAME.b2clogin.com/B2C_TENANT_NAME.onmicrosoft.com/B2C_POLICY_NAME
|
||||
- OAUTH2_AUTH_ENDPOINT=/oauth2/v2.0/authorize
|
||||
- OAUTH2_TOKEN_ENDPOINT=/oauth2/v2.0/token
|
||||
- OAUTH2_USERNAME_MAP=sub
|
||||
- OAUTH2_EMAIL_MAP=email
|
||||
- OAUTH2_FULLNAME_MAP=name
|
||||
- OAUTH2_ID_MAP=sub
|
||||
```
|
||||
|
||||
## Others
|
||||
|
||||
Similar like above Docker.
|
||||
@@ -0,0 +1,777 @@
|
||||
[Sandstorm](Sandstorm) - [Sandstorm Backup](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
# Upcoming
|
||||
|
||||
[Transferring to Minio and SQLite](https://github.com/wekan/minio-metadata)
|
||||
|
||||
# Backup Docker
|
||||
|
||||
[Also see: Upgrading Synology with Wekan quay images](https://github.com/wekan/wekan/issues/3874#issuecomment-867526249)
|
||||
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
|
||||
[docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml)
|
||||
|
||||
This presumes your Wekan Docker is currently running with:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
Backup to directory dump:
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker exec wekan-db mongodump -o /data/dump
|
||||
docker cp wekan-db:/data/dump .
|
||||
docker start wekan-app
|
||||
```
|
||||
Copy dump directory to other server or to your backup.
|
||||
|
||||
# Restore Docker
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker cp dump wekan-db:/data/
|
||||
docker exec wekan-db mongorestore --drop --dir=/data/dump
|
||||
docker start wekan-app
|
||||
```
|
||||
# Upgrade Docker Wekan version
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
```bash
|
||||
docker-compose stop
|
||||
docker rm wekan-app
|
||||
```
|
||||
a) For example, if you in docker-compose.yml use `image: wekanteam/wekan` or `image: quay.io/wekan/wekan` for latest development version
|
||||
|
||||
b) Or in docker-compose.yml change version tag, or use version tag like `image: wekanteam/wekan:v5.50` or `image: quay.io/wekan/wekan:v5.50`
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
# Backup Wekan Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan > snap-settings.sh
|
||||
```
|
||||
NOTE for Arch Linux: Use this path instead. [Source](https://github.com/wekan/wekan/issues/3941).
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH-}:/var/lib/snapd/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has commands like:
|
||||
```bash
|
||||
sudo snap set wekan root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Snap
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
# Upgrade Snap manually immediately (usually it updates automatically)
|
||||
|
||||
```bash
|
||||
sudo snap refresh
|
||||
```
|
||||
|
||||
# Backup Wekan Gantt GPLv2 Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan-gantt-gpl > snap-settings.sh
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has command like:
|
||||
```bash
|
||||
sudo snap set wekan-gantt-gpl root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Gantt GPLv2 Snap
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
|
||||
# DBGate, Open Source MongoDB GUI
|
||||
|
||||
https://dbgate.org - https://github.com/dbgate/dbgate
|
||||
|
||||
# Using nosqlbooster closed source MongoDB GUI with Wekan Snap to edit MongoDB database
|
||||
|
||||
https://nosqlbooster.com/downloads
|
||||
|
||||
### At server where Wekan Snap is installed, MongoDB is running at localhost port 27019
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-basic-connection.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
### You can tunnel via SSH to server, using password auth or private key auth dropdown selection
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-ssh-tunnel.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
# Scheduled backups to local or remote server
|
||||
|
||||
For below scheduled backup scripts, no info from above of this wiki page is required. Backup scripts below have the required settings.
|
||||
|
||||
This does backup of [Wekan+RocketChat snap databases](OAuth2) and php website etc.
|
||||
|
||||
If you need to backup some remote server or cloud, you can use scp, or read [rclone docs](https://rclone.org/docs/) about how to configure saving to some other remote server or cloud.
|
||||
|
||||
The following .sh bash scripts are added as root user to your `/root/` directory.
|
||||
|
||||
Backups are created to subdirectories of `/root/backups/`.
|
||||
|
||||
Cron is used to schedule backups, for example once a day.
|
||||
|
||||
1. To add bash scripts, you change to root user with this command, and your sudo or root password.
|
||||
```bash
|
||||
sudo su
|
||||
```
|
||||
2. Use nano editor for editing cron. If you don't have it installed, type:
|
||||
```bash
|
||||
apt install nano
|
||||
```
|
||||
3. Then we set text editor to be nano. Otherwise it probably uses vi, that is harder to use.
|
||||
```bash
|
||||
export EDITOR=nano
|
||||
```
|
||||
4. Now we start editing cron scheduler.
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
For more info how to make cron time, see https://crontab.guru
|
||||
|
||||
In this example, we set backups every day at 04:00, then it runs backup.sh script, and saves output of the backup commands to the bottom of textfile backup.log.txt
|
||||
```bash
|
||||
# m h dom mon dow command
|
||||
0 4 * * * /root/backup.sh >> /root/backup.log.txt 2>&1
|
||||
```
|
||||
- For changing to `/root` directory, type: `cd /root`
|
||||
- for editing backup.sh file, type: `nano backup.sh`
|
||||
- For saving in nano, press Ctrl-o Enter
|
||||
- For exiting nano, press Ctrl-x Enter
|
||||
- Set every .sh file as executeable, for example: `chmod +x backup.sh`
|
||||
|
||||
This is content of `backup.sh` script. It runs all the other backup scripts.
|
||||
If you do not need to backup rocketchat or website, or do not need to use rclone,
|
||||
you don't need to add those command lines at all.
|
||||
```bash
|
||||
cd /root
|
||||
./backup-wekan.sh
|
||||
./backup-rocketchat.sh
|
||||
./backup-website.sh
|
||||
rclone move backups cloudname:backup.example.com
|
||||
```
|
||||
More about rclone:
|
||||
|
||||
/root/rclone-ls-all.sh , shows directory contests at cloud:
|
||||
```bash
|
||||
rclone lsd cloudname:
|
||||
```
|
||||
In this example, cron does run backup scripts as root.
|
||||
This is if you edit cron with command `crontab -e` as root user,
|
||||
so it edits the cron of root user.
|
||||
|
||||
If mongodump command works as normal user for you, you could instead
|
||||
run backups as normal user, by exiting root user with `exit` and
|
||||
then as normal user editing cron with `crontab -e`.
|
||||
You can also list current cron with command `crontab -l`.
|
||||
|
||||
If you like to backup Wekan snap settings with this command, then it
|
||||
only works with sudo at front, or as a root user without sudo at front.
|
||||
```bash
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
```
|
||||
|
||||
This below is backup script for backing up Wekan.
|
||||
|
||||
/root/backup-wekan.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
# Backups will be created below this directory.
|
||||
backupdir="/root/backups/wekan"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Gets current time to variable "now"
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
|
||||
# Creates new backup directory like BACKUPDIR/BACKUPVERSIO-TIMENOW
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
#dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Changes to backup directory
|
||||
cd $backupdir/$version-$now
|
||||
|
||||
# Backup Caddy settings
|
||||
snap get wekan > snap-settings.txt
|
||||
|
||||
# Show text that database backup is in progress
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
|
||||
# Backup to current directory, creates subdirectory called "dump"
|
||||
# with database dump files
|
||||
mongodump --port 27019
|
||||
|
||||
# Change diretory (=cd) to parent directory
|
||||
cd ..
|
||||
|
||||
# Show text "Makes the tar.gz archive file"
|
||||
printf "\nMakes the tar.gz archive file.\n"
|
||||
|
||||
# Creates tar.gz archive file. This works similarly like creating .zip file.
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Delete temporary files that have already been
|
||||
# compressed to above tar.gz file
|
||||
rm -rf $version-$now
|
||||
|
||||
# Shows text "Backup done."
|
||||
printf "\nBackup done.\n"
|
||||
|
||||
# Show where backup archive file is.
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```bash
|
||||
/root/backup-rocketchat.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/rocketchat"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27017
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/root/backup-website.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/example.com"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe file backup is in progress.\n\n"
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
cp -pR /var/snap/wekan/common/example.com $version-$now
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/var/snap/wekan/common/Caddyfile
|
||||
```bash
|
||||
chat.example.com {
|
||||
proxy / localhost:3000 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
https://boards.example.com {
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
example.com {
|
||||
root /var/snap/wekan/common/example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
matomo.example.com {
|
||||
root /var/snap/wekan/common/matomo.example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
# Example CloudFlare free wildcard SSL Origin Certificate, there is example.com.pem at certificates directory with private key at to and cert at bottom.
|
||||
http://example.com https://example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certificates
|
||||
alpn http/1.1
|
||||
}
|
||||
root /var/snap/wekan/common/example.com
|
||||
browse
|
||||
}
|
||||
|
||||
static.example.com {
|
||||
root /var/snap/wekan/common/static.example.com
|
||||
}
|
||||
```
|
||||
|
||||
## Related talk about MongoDB backup
|
||||
|
||||
Related talk, search for "mongodb" this page:
|
||||
https://fosdem.org/2020/schedule/events/
|
||||
|
||||
There is this:
|
||||
|
||||
Percona Backup for MongoDB: Status and Plans
|
||||
|
||||
Open Source solution for consistent backups of multi-shard MongoDB
|
||||
|
||||
- [Slides](https://fosdem.org/2020/schedule/event/perconamongodb/attachments/slides/3768/export/events/attachments/perconamongodb/slides/3768/Percona_Backup_for_MongoDB.pdf)
|
||||
- [Video webm](https://video.fosdem.org/2020/UD2.119/perconamongodb.webm)
|
||||
- [Same Video mp4](https://video.fosdem.org/2020/UD2.119/perconamongodb.mp4)
|
||||
|
||||
## Related Sandstorm issue
|
||||
|
||||
[Creating a backup while the grain is running could cause corruption](https://github.com/sandstorm-io/sandstorm/issues/3186).
|
||||
|
||||
## Combining old and new Wekan version data
|
||||
|
||||
Note: Do mongodump/mongorestore only when Wekan is stopped: wekan.wekan (Snap) or wekan-app (Docker).
|
||||
|
||||
1. From new Wekan export all boards to Wekan JSON.
|
||||
2. Backup new Wekan with mongodump.
|
||||
3. Backup old Wekan with mongodump.
|
||||
4. Restore old Wekan data to new Wekan with mongorestore.
|
||||
5. Restore new Wekan JSON exported boards by importing them.
|
||||
|
||||
## Rescuing board that does not load
|
||||
|
||||
Wekan web UI Import/Export JSON does not have all content currently. To upgrade from old Wekan version, use mongodump/mongorestore to newest Wekan, like described below.
|
||||
|
||||
To import big JSON file, on Linux you can use xclip to copy textfile to clipboard:
|
||||
```bash
|
||||
sudo apt-get install xclip
|
||||
cat board.json | xclip -se c
|
||||
```
|
||||
Then paste to webbrowser Wekan Add Board / Import / From previous export.
|
||||
|
||||
You can [save all MongoDB database content as JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file). Files are base64 encoded in JSON files.
|
||||
|
||||
Export board to Wekan JSON, and import as Wekan JSON can make some part of board to load, but you should check is some data missing.
|
||||
|
||||
With Wekan Snap, you can use [nosqlbooster GUI](https://nosqlbooster.com/downloads) to login through SSH to Wekan server localhost port 27019 and browse data.
|
||||
|
||||
You could use [daff](https://github.com/paulfitz/daff) to compare tables.
|
||||
|
||||
## Using Snap Mongo commands on your bash CLI
|
||||
|
||||
Add to your `~/.bashrc`
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
```
|
||||
Then you can backup:
|
||||
```bash
|
||||
mongodump --port 27019
|
||||
```
|
||||
And restore:
|
||||
```bash
|
||||
mongorestore --drop --port 27019
|
||||
```
|
||||
|
||||
## MongoDB shell on Wekan Snap
|
||||
|
||||
mongoshell.sh
|
||||
```bash
|
||||
#/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
mongo=$"/snap/wekan/$version/bin/mongo"
|
||||
$mongo --port 27019
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v2
|
||||
|
||||
Originally from https://github.com/wekan/wekan-snap/issues/62#issuecomment-470622601
|
||||
|
||||
## Backup
|
||||
|
||||
wekan-backup.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
now=$(date +"%Y%m%d-%H%M%S")
|
||||
parent_dir="/data/backups/wekan"
|
||||
backup_dir="${parent_dir}/${now}"
|
||||
log_file="${parent_dir}/backup-progress.log.${now}"
|
||||
|
||||
error () {
|
||||
printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap 'error "An unexpected error occurred."' ERR
|
||||
|
||||
take_backup () {
|
||||
mkdir -p "${backup_dir}"
|
||||
|
||||
cd "${backup_dir}"
|
||||
|
||||
/snap/wekan/$version/bin/mongodump --quiet --port 27019
|
||||
|
||||
cd ..
|
||||
|
||||
tar -zcf "${now}.tar.gz" "${now}"
|
||||
|
||||
rm -rf "${now}"
|
||||
}
|
||||
|
||||
printf "\n======================================================================="
|
||||
printf "\nWekan Backup"
|
||||
printf "\n======================================================================="
|
||||
printf "\nBackup in progress..."
|
||||
|
||||
take_backup 2> "${log_file}"
|
||||
|
||||
if [[ -s "${log_file}" ]]
|
||||
then
|
||||
printf "\nBackup failure! Check ${log_file} for more information."
|
||||
printf "\n=======================================================================\n\n"
|
||||
else
|
||||
rm "${log_file}"
|
||||
printf "...SUCCESS!\n"
|
||||
printf "Backup created at ${backup_dir}.tar.gz"
|
||||
printf "\n=======================================================================\n\n"
|
||||
fi
|
||||
```
|
||||
wekan-restore.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
file=$1
|
||||
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd "${parentDir}"
|
||||
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
|
||||
tar -zxvf "${file}"
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
restore=$"/snap/wekan/${version}/bin/mongorestore"
|
||||
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --quiet --drop --noIndexRestore -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
$restore --quiet --drop -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
rm -rf "${file}"
|
||||
|
||||
printf "\nRestore done.\n"
|
||||
}
|
||||
|
||||
makesRestore $1
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v1
|
||||
|
||||
## Backup script for MongoDB Data, if running Snap MongoDB at port 27019
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p /var/backups/wekan/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd /var/backups/wekan/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27019
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at /var/backups/wekan/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
|
||||
```
|
||||
|
||||
## Restore script for MongoDB Data, if running Snap MongoDB at port 27019 with a tar.gz archive.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
# Prepares the folder used for the backup.
|
||||
file=$1
|
||||
if [[ "$file" != *tar.gz* ]]
|
||||
then
|
||||
echo "The backup archive must be a tar.gz."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Goes into the parent directory.
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd $parentDir
|
||||
|
||||
# Untar the archive.
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
tar -zxvf $file
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Targets the dump file.
|
||||
restore=$"/snap/wekan/$version/bin/mongorestore"
|
||||
|
||||
# Restores.
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --drop --noIndexRestore wekan --port 27019 $file/dump/wekan
|
||||
$restore --drop wekan --port 27019 $file/dump/wekan
|
||||
printf "\nRestore done.\n"
|
||||
|
||||
# Cleanups
|
||||
rm -rf $file
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root.
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Start.
|
||||
makesRestore $1
|
||||
|
||||
```
|
||||
|
||||
## Docker Backup and Restore
|
||||
|
||||
[Docker Backup and Restore](Export-Docker-Mongo-Data)
|
||||
|
||||
[Wekan Docker Upgrade](https://github.com/wekan/wekan-mongodb#backup-before-upgrading)
|
||||
|
||||
## Snap Backup
|
||||
|
||||
[Snap Backup and Restore](https://github.com/wekan/wekan-snap/wiki/Backup-and-restore)
|
||||
|
||||
[Wekan Snap upgrade](https://github.com/wekan/wekan-snap/wiki/Install#5-install-all-snap-updates-automatically-between-0200am-and-0400am)
|
||||
|
||||
## Sandstorm Backup
|
||||
|
||||
Download Wekan grain with arrow down download button to .zip file. You can restore it later.
|
||||
|
||||
[Export data from Wekan Sandstorm grain .zip file](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
## <a name="cloudron">Cloudron
|
||||
|
||||
If those [Backup](Backup) ways are not easily found at [Cloudron](Cloudron), one way is to install [Redash](https://redash.io/) and then backup this way:
|
||||
|
||||
Redash works with this kind of queries:
|
||||
```json
|
||||
{
|
||||
"collection": "accountSettings",
|
||||
"query": {
|
||||
"type": 1
|
||||
},
|
||||
"fields": {
|
||||
"_id": 1,
|
||||
"booleanValue": 1,
|
||||
"createdAt": 1,
|
||||
"modifiedAt": 1,
|
||||
}
|
||||
}
|
||||
```
|
||||
So:
|
||||
|
||||
1) Create this kind of query:
|
||||
```json
|
||||
{
|
||||
"collection": "boards"
|
||||
}
|
||||
```
|
||||
|
||||
Later when you modify query, you can remove text like boards with double-click-with-mouse and delete-key-at-keyboard (or select characters with mouse and delete-key-at-keyboard), and then click collection/table >> button to insert name of next collection/table.
|
||||
|
||||
2) Click Save
|
||||
|
||||
3) Click Execute. This will cache query for use with REST API.
|
||||
|
||||
4) Click at right top `[...]` => `Show API key`
|
||||
|
||||
It looks like this:
|
||||
|
||||
https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
5) Only when saving first collection/table, Save API key to text file script like this `dl.sh`
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Example: ./dl.sh boards
|
||||
|
||||
export APIKEY=https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
curl -o $1.json $APIKEY
|
||||
```
|
||||
|
||||
6) Run save script like:
|
||||
```bash
|
||||
./dl.sh boards
|
||||
```
|
||||
Note: 1) Save 2) Execute => webbrowser can give this kind of timeout,
|
||||
but downloading with API script still works:
|
||||
|
||||
> wekan
|
||||
> Error running query: failed communicating with server. Please check your Internet connection and try again.
|
||||
|
||||
7) Repeat steps 1-4 and 6 for every collection/table like boards,cards, etc
|
||||
|
||||
8) Remove from downloaded .json files extra query related data, so that it is similar like [any other Wekan database backup JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
9) Insert data to some other Wekan install with nosqlbooster like mentioned at page [Backup](Backup)
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
If you know updates to this, please add new issue about it. Make changes to this page by cloning wiki:
|
||||
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
There edit Browser-compatibility-matrix.md and attach it with .txt extension or in .zip file to https://github.com/wekan/wekan/wiki/issues
|
||||
|
||||
## Webkit based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Safari | iOS Yes | iOS Newest | Newest | iOS, macOS
|
||||
|
||||
## Firefox based
|
||||
|
||||
Any telemetry at any Firefox based browser can be additionally most locked down with arkenfox user JS.
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
[Mypal](https://releases.wekan.team/mypal/) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132), Other 32bit browsers probably not
|
||||
Firefox | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) (based on Ubuntu 16.04) on PinePhone, OnePlus 3, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). Works best with bluetooth or USB mouse and keyboard.
|
||||
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . Tested on [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/). PWA URL is configured here https://github.com/wekan/wekan-openstore/blob/master/wekan.desktop#L3
|
||||
[Waterfox](https://www.waterfox.net) | No | No | Yes | Win/Mac/Linux, more private than Firefox, no tracking
|
||||
[Floorp](https://floorp.app) | No | No | Yes | [Win/Mac/Linux](https://github.com/Floorp-Projects/Floorp/releases), more private than Firefox, [Repo](https://github.com/Floorp-Projects/Floorp)
|
||||
[Mercury](https://thorium.rocks/mercury) | No | No | Yes | [Win/Linux](https://github.com/Alex313031/Mercury/releases), more private than Firefox, [Repo](https://github.com/Alex313031/Mercury)
|
||||
[SeaLion](https://github.com/wicknix/SeaLion) | No | No | Yes | [MacOS 10.7-14.1 x32,x64,ppc,ppc64/Linux x64](https://github.com/wicknix/SeaLion/releases), [Repo](https://github.com/wicknix/SeaLion)
|
||||
|
||||
## Chromium based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Chrome | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Chromium | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Vivaldi | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Opera | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Credge, Chromium Edge | Android Yes | Android | Newest | Win/Mac/Linux/Mobile
|
||||
[Microsoft Store App](https://www.microsoft.com/fi-fi/p/wekan/9p2mrxvd087r#activetab=pivot:overviewtab) | Yes | Yes | Yes | At Microsoft Store of Windows 10/11 desktop, made with [PWABuilder](https://www.pwabuilder.com/). Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), changed app from EdgeHTML to Credge based with Wekan demo & development server https://boards.wekan.team
|
||||
[Android Play Store App](https://play.google.com/store/apps/details?id=team.wekan.boards.twa) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), made with [PWABuilder](https://www.pwabuilder.com/), uses Android Chrome browser with Wekan demo & development server https://boards.wekan.team
|
||||
[Thorium](https://thorium.rocks) | No | Yes | Yes | [Win/Win7/Mac/Linux/Android/RasPi](https://thorium.rocks), speed optimized
|
||||
[Supermium](https://github.com/win32ss/supermium) | No | No | Yes | 32bit: Windows XP, Windows 2003
|
||||
|
||||
## EdgeHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Legacy Edge | No | No | Not | Not compatible with newest WeKan. Worked with Wekan v4.19 and before.
|
||||
|
||||
## MSHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Internet Explorer | No | No | No | No | No
|
||||
|
||||
## Other ways to create Mobile App with Meteor
|
||||
|
||||
https://guide.meteor.com/cordova
|
||||
|
||||
Benefits:
|
||||
- Can be faster, more stored at mobile
|
||||
- Native features integration possibilities
|
||||
|
||||
## Desktop app with Meteor
|
||||
|
||||
https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
|
||||
|
||||
## Optional Payments
|
||||
|
||||
- If there is sometime a need to develop payment feature, that does not exist yet
|
||||
- https://forums.meteor.com/t/need-help-adding-in-app-purchases-to-a-meteor-app-specifically-adding-subscription-support-for-android-play-store/40510
|
||||
- https://www.npmjs.com/package/cordova-plugin-purchase
|
||||
@@ -0,0 +1,7 @@
|
||||
[Discussion](https://github.com/wekan/wekan/discussions/4282)
|
||||
|
||||
WeKan Python Burndown Chart:
|
||||
- [Original](https://github.com/Gelmes/Wekan-Python-Burndown)
|
||||
- [WeKan fork](https://github.com/wekan/Wekan-Python-Burndown)
|
||||
|
||||
[WeKan Burndown Chart Chrome extension](https://chrome.google.com/webstore/detail/burndown-for-wekan/agdbocbobcbelnekjibocbilodjgopgh?)
|
||||
@@ -0,0 +1,13 @@
|
||||
[CAS Issue](https://github.com/wekan/wekan/issues/3204)
|
||||
|
||||
[CAS settings commit](https://github.com/wekan/wekan/commit/214c86cc22f4c721a79ec0a4a4f3bbd90d673f93)
|
||||
|
||||
Please send pull requests if CAS login does not work.
|
||||
|
||||
Wekan clientside code is at `wekan/client/components/main/layouts.*`
|
||||
|
||||
Wekan serverside code is at:
|
||||
- `wekan/server/authentication.js` at bottom
|
||||
- `wekan/packages/*cas*/*`
|
||||
|
||||
Originally before moving to `wekan/packages/*cas*/*` CAS code was at https://github.com/wekan/meteor-accounts-cas
|
||||
@@ -0,0 +1,18 @@
|
||||
Right to click your username / All Boards / Add Board / Import / From CSV/TSV
|
||||
|
||||
[Original Import CSV issue](https://github.com/wekan/wekan/issues/395)
|
||||
|
||||
[CSV import was added at PR 3081](https://github.com/wekan/wekan/pull/3081)
|
||||
|
||||
Here's a copy of the CSV and TSV to test out the functionality:
|
||||
- [board-import.csv](https://wekan.github.io/csv/board-import.csv)
|
||||
- [board-import.tsv](https://wekan.github.io/csv/board-import.tsv)
|
||||
|
||||
Frontend:
|
||||
- [Import CSV code](https://github.com/wekan/wekan/tree/main/client/components/import)
|
||||
|
||||
Backend:
|
||||
- [Import CSV code](https://github.com/wekan/wekan/blob/main/models/csvCreator.js) and [General Import code](https://github.com/wekan/wekan/blob/main/models/import.js)
|
||||
|
||||
Related:
|
||||
- [Related PRs](https://github.com/wekan/wekan/pulls?q=is%3Apr+is%3Aclosed+csv)
|
||||
@@ -0,0 +1,281 @@
|
||||
[Caddy 2 .well-known/assetlinks.json config for WeKan Android Play Store app](../PWA#fullscreen-android-app-with-caddy-and-wekan-server)
|
||||
|
||||
## Caddy 2
|
||||
|
||||
WeKan Snap Candidate for any Snap distros: https://github.com/wekan/wekan/wiki/OpenSuse , disable internal old Caddy 1, when using Caddy 2:
|
||||
```
|
||||
sudo snap set wekan caddy-enabled='false'
|
||||
sudo snap set wekan port='3001'
|
||||
sudo snap set wekan root-url='https://boards.example.com'
|
||||
```
|
||||
More info about root-url at https://github.com/wekan/wekan/wiki/Settings
|
||||
|
||||
Browser needs to have only one language https://github.com/wekan/wekan/issues/4803#issuecomment-1374354425
|
||||
|
||||
Install Caddy 2 stable release: https://caddyserver.com/docs/install#debian-ubuntu-raspbian
|
||||
|
||||
Like this:
|
||||
```
|
||||
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
|
||||
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
|
||||
sudo apt update
|
||||
|
||||
sudo apt -y install caddy
|
||||
```
|
||||
Edit Caddyfile:
|
||||
|
||||
```
|
||||
sudo nano /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
# Redirecting http to https
|
||||
|
||||
(redirect) {
|
||||
@http {
|
||||
protocol http
|
||||
}
|
||||
redir @http https://{host}{uri}
|
||||
}
|
||||
|
||||
# WeKan board, proxy to localhost port, or IP-ADDRESS:PORT
|
||||
boards.example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
|
||||
reverse_proxy 127.0.0.1:3025
|
||||
}
|
||||
|
||||
# Static website
|
||||
example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
root * /var/websites/wekan.team
|
||||
file_server
|
||||
}
|
||||
|
||||
# Files download directory browse website
|
||||
files.example.com {
|
||||
root * /var/websites/ftp.secretchronicles.org/public
|
||||
file_server browse
|
||||
}
|
||||
```
|
||||
|
||||
Caddy commands list:
|
||||
```
|
||||
caddy help
|
||||
```
|
||||
|
||||
|
||||
***
|
||||
|
||||
[Caddy OAuth2 with Let's Encrypt SSL example](OAuth2)
|
||||
|
||||
***
|
||||
|
||||
## CloudFlare free wildcard SSL *start*
|
||||
|
||||
Also works with other SSL certs.
|
||||
|
||||
### 1) Requirements: You have changed nameservers to CloudFlare.
|
||||
|
||||
### 2) Get CloudFlare SSL wildcard Origin Certificate
|
||||
|
||||
Go to CloudFlare login/example.com/Crypto/Origin Certificates.
|
||||
Create and download certs for `*.example.com, example.com`
|
||||
|
||||
### 3) Create directory /var/snap/wekan/common/certs
|
||||
```
|
||||
sudo su
|
||||
cd /var/snap/wekan/common
|
||||
mkdir certs
|
||||
cd certs
|
||||
```
|
||||
### 4) Create cert file
|
||||
Create file: `example.com.pem` with content of CloudFlare Origin Certificates.
|
||||
```
|
||||
nano example.com.pem
|
||||
```
|
||||
There add certs:
|
||||
```
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
-----END PRIVATE KEY-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
-----END CERTIFICATE-----
|
||||
```
|
||||
|
||||
Then Save: Ctrl-o Enter
|
||||
|
||||
Then Exit: Ctrl-x.
|
||||
|
||||
### 5) Set permissions rw-r--r-- to example.com.pem:
|
||||
```
|
||||
chmod 644 example.com.pem
|
||||
```
|
||||
|
||||
### 6) Edit Caddy webserver config
|
||||
```
|
||||
sudo nano /var/snap/wekan/common/Caddyfile
|
||||
```
|
||||
There change config:
|
||||
```
|
||||
http://example.com https://example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
```
|
||||
Save: Ctrl-o Enter
|
||||
|
||||
Exit: Ctrl-x
|
||||
|
||||
Enable Caddy:
|
||||
```
|
||||
sudo snap set wekan caddy-enabled='true'
|
||||
sudo snap set wekan port='3001'
|
||||
sudo snap set wekan root-url='https://example.com'
|
||||
```
|
||||
|
||||
### 7) Enable CloudFlare SSL
|
||||
|
||||
Click CloudFlare login/example.com/DNS.
|
||||
|
||||
Check that status of your domains have orange cloud color, so traffic goes through CloudFlare SSL.
|
||||
|
||||
Click CloudFlare login/example.com/Page Rules.
|
||||
Set for example:
|
||||
```
|
||||
1) http://example.com/*
|
||||
Always Use HTTPS
|
||||
2) http://*.example.com/*
|
||||
Always use HTTPS
|
||||
```
|
||||
Optionally, if you want caching:
|
||||
```
|
||||
3) *example.com/*
|
||||
Cache Level: Cache Everything
|
||||
```
|
||||
## CloudFlare free wildcard SSL *end*
|
||||
|
||||
***
|
||||
|
||||
## Other config stuff
|
||||
|
||||
[List of Let's Encrypt implementations](https://community.letsencrypt.org/t/list-of-client-implementations/2103)
|
||||
|
||||
## Caddy webserver config with logs
|
||||
|
||||
Create directory for caddy, website and logs:
|
||||
```bash
|
||||
mkdir -p ~/caddy/example.com ~/caddy/logs
|
||||
```
|
||||
|
||||
Add this config to ~/caddy/Caddyfile
|
||||
|
||||
There's also some extra examples.
|
||||
|
||||
```bash
|
||||
example.com {
|
||||
root /home/username/caddy/example.com
|
||||
# Static website, markdown or html
|
||||
ext .md .html
|
||||
|
||||
proxy /wekan 127.0.0.1:3000 {
|
||||
websocket
|
||||
}
|
||||
|
||||
log /home/username/caddy/logs/wekan-access.log {
|
||||
rotate {
|
||||
size 100 # Rotate after 100 MB
|
||||
age 7 # Keep log files for 7 days
|
||||
keep 52 # Keep at most 52 log files
|
||||
}
|
||||
}
|
||||
errors {
|
||||
log /home/username/caddy/logs/wekan-error.log {
|
||||
size 100 # Rotate after 100 MB
|
||||
age 7 # Keep log files for 7 days
|
||||
keep 52 # Keep at most 52 log files
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
example.com/files {
|
||||
root /home/username/files
|
||||
# View files in directory, has sorting in browser
|
||||
browse
|
||||
}
|
||||
```
|
||||
|
||||
Install Caddy. Change username to what user you run caddy, like in /home/username , and Let's Encrypt email to your email adderess:
|
||||
|
||||
```bash
|
||||
# Install caddy with some plugins
|
||||
curl https://getcaddy.com | bash -s personal http.ipfilter,http.mailout,http.ratelimit,http.realip
|
||||
```
|
||||
|
||||
# Give permissions to caddy to bind 80 and 443
|
||||
|
||||
```
|
||||
sudo setcap cap_net_bind_service=+ep /usr/local/bin/caddy
|
||||
```
|
||||
|
||||
And this service file for Caddy to /etc/systemd/system/caddy@.service
|
||||
|
||||
```bash
|
||||
; see `man systemd.unit` for configuration details
|
||||
; the man section also explains *specifiers* `%x`
|
||||
|
||||
[Unit]
|
||||
Description=Caddy HTTP/2 web server %I
|
||||
Documentation=https://caddyserver.com/docs
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
Wants=systemd-networkd-wait-online.service
|
||||
|
||||
[Service]
|
||||
; run user and group for caddy
|
||||
User=username
|
||||
Group=username
|
||||
ExecStart=/home/username/caddy/caddy -conf=/home/username/caddy/Caddyfile -agree -email="admin@example.com"
|
||||
Restart=on-failure
|
||||
StartLimitInterval=86400
|
||||
StartLimitBurst=5
|
||||
RestartSec=10
|
||||
ExecReload=/bin/kill -USR1 $MAINPID
|
||||
; limit the number of file descriptors, see `man systemd.exec` for more limit settings
|
||||
LimitNOFILE=1048576
|
||||
LimitNPROC=64
|
||||
; create a private temp folder that is not shared with other processes
|
||||
PrivateTmp=true
|
||||
PrivateDevices=true
|
||||
ProtectSystem=full
|
||||
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
|
||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||
NoNewPrivileges=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Start caddy and enable service:
|
||||
```
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl start caddy@username
|
||||
sudo systemctl enable caddy@username
|
||||
```
|
||||
@@ -0,0 +1,23 @@
|
||||
### Create card
|
||||
|
||||
At Calendar View, on Month when you click a date it will ask you if you want to create a new card and give its name. It then creates at first swimlane and at first list the card with the due date that it got from the date you clicked.
|
||||
|
||||
Video demonstration:
|
||||
|
||||
https://user-images.githubusercontent.com/70445835/184324324-b4bd466e-6873-4eef-8ca5-b6e4d9f95ac5.mp4
|
||||
|
||||
|
||||
- How it works https://github.com/wekan/wekan/issues/2687#issuecomment-1545235649
|
||||
- Fix for Calendar View Create Card https://github.com/wekan/wekan/pull/5019
|
||||
- Calendar view logic https://github.com/wekan/wekan/issues/4511
|
||||
|
||||
## <a name="Time"></a>Time
|
||||
|
||||
* [Due Date](Due-Date)
|
||||
* [Day of week start](Day-of-week-start)
|
||||
|
||||
## What features are missing
|
||||
|
||||
* [Calendar issues](https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aopen+calendar+label%3AFeature%3ACalendar-view)
|
||||
* [Time Tracking](Time-Tracking)
|
||||
* [Gantt Chart](Gantt)
|
||||
@@ -0,0 +1,285 @@
|
||||
## WARNING: PLEASE do not try on your Chromebook below info.
|
||||
|
||||
First, [download all your Google Account data as 4 GB .zip files](https://takeout.google.com/) and burn them to DVD or Blueray disks, where they can not be easily accidentally deleted.
|
||||
|
||||
Because this happened:
|
||||
- Someone else had their Google Drive full.
|
||||
- That someone else did not backup local data from Chromebook.
|
||||
- Installing Linux etc did fill up Chromebook harddisk.
|
||||
- Chromebook got stuck and messed up, and needed to be reinstalled.
|
||||
- That someone else lost some data.
|
||||
|
||||
Below intructions only worked for xet7, because xet7 did have free disk space on Chromebook. There is **NO WARRANTY OF ANY KIND** for any of below info. If your Chomebook breaks, well, thank your backups, and have a nice day!
|
||||
|
||||
## Installing Wekan Snap to Chromebook
|
||||
|
||||
Installing to Asus Chromebook C223NA-GJ0007 11.6" laptop, that was cheapest available at local shop, did cost 199 euro.
|
||||
|
||||
It has:
|
||||
- 4 GB RAM
|
||||
- 32 GB eMMC disk
|
||||
- Intel® Celeron® N3350 CPU
|
||||
- Bluetooth
|
||||
- webcam
|
||||
- WLAN
|
||||
- USB3
|
||||
- 2 x USB-C, both work for charging (I have not tried data transfer yet)
|
||||
- microSD slot
|
||||
- package includes USB-C charger and USB mouse
|
||||
- keys for fullscreen, switch apps, brighness, volume, those do not need any modifier keys like other laptops
|
||||
- playing youtube videos fullscreen works very well
|
||||
- speakers sound can be set to very loud if needed
|
||||
- big enough keys, good keyboard layout
|
||||
- small and lightweight laptop
|
||||
- has Play Store Android apps and Linux apps that can work fullscreen
|
||||
- I did not try yet replacing Chrome OS with full Linux https://galliumos.org that has some drivers Chromebook needs, but according to their [hardware compatibility](https://wiki.galliumos.org/Hardware_Compatibility) this model has Known issues: internal audio, suspend/resume, when using galliumos.
|
||||
|
||||
## 1) Install Linux Beta
|
||||
|
||||
At Chromebook settings, install Linux Beta. It will have Debian 10, that will be changed to Ubuntu 20.10 64bit.
|
||||
|
||||
## 2) Install Ubuntu Container
|
||||
|
||||
[Source](http://intertwingly.net/blog/2020/07/21/Ubuntu-20-04-on-Chromebook)
|
||||
|
||||
Start by entering the Chrome shell (crosh) by pressing CTRL+ALT+T, then enter the default termina VM:
|
||||
```
|
||||
vmc start termina
|
||||
```
|
||||
Delete the default penguin container that had Debian 10:
|
||||
```
|
||||
lxc stop penguin --force
|
||||
lxc rm penguin
|
||||
```
|
||||
Create a new Ubuntu container named penguin:
|
||||
```
|
||||
lxc launch ubuntu:20.10 penguin
|
||||
```
|
||||
Enter the new container (as root):
|
||||
```
|
||||
lxc exec penguin -- bash
|
||||
```
|
||||
## 3) Import public keys
|
||||
|
||||
While Ubuntu 20.10 will install, various apt commands will fail due to an inability to verify GPG keys. This problem is not unique to Crostini, it is seen in other environments, like Raspberry Pis.
|
||||
|
||||
The fix is to import two public keys:
|
||||
```
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC
|
||||
```
|
||||
## 4) Update groups
|
||||
```
|
||||
groups ubuntu >update-groups
|
||||
sed -i 'y/ /,/; s/ubuntu,:,ubuntu,/sudo usermod -aG /; s/$/ \$USER/' update-groups
|
||||
killall -u ubuntu
|
||||
userdel -r ubuntu # ignore warning about mail spool
|
||||
sed -i '/^ubuntu/d' /etc/sudoers.d/90-cloud-init-users
|
||||
```
|
||||
## 5) Install Crostini packages
|
||||
|
||||
Prepare for installing Google's Crostini specific packages. First bring Ubuntu up to date:
|
||||
```
|
||||
apt update
|
||||
apt upgrade -y
|
||||
```
|
||||
Now add the Crostini package repository to apt. This repository provides the Linux integration with Chrome OS (ignore RLIMIT_CORE warning):
|
||||
```
|
||||
echo "deb https://storage.googleapis.com/cros-packages stretch main" > /etc/apt/sources.list.d/cros.list
|
||||
if [ -f /dev/.cros_milestone ]; then sudo sed -i "s?packages?packages/$(cat /dev/.cros_milestone)?" /etc/apt/sources.list.d/cros.list; fi
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1397BC53640DB551
|
||||
apt update
|
||||
```
|
||||
A work-around is needed for a cros-ui-config package installation conflict. First, install binutils to get the ar command:
|
||||
```
|
||||
apt install -y binutils
|
||||
```
|
||||
Then create the cros-ui-config work-around package:
|
||||
```
|
||||
apt download cros-ui-config # ignore any warning messages
|
||||
ar x cros-ui-config_0.12_all.deb data.tar.gz
|
||||
gunzip data.tar.gz
|
||||
tar f data.tar --delete ./etc/gtk-3.0/settings.ini
|
||||
gzip data.tar
|
||||
ar r cros-ui-config_0.12_all.deb data.tar.gz
|
||||
rm -rf data.tar.gz
|
||||
```
|
||||
Now install the Crostini packages and the "work-around" package, ignoring any warning messages. This will take awhile:
|
||||
```
|
||||
apt install -y cros-guest-tools ./cros-ui-config_0.12_all.deb
|
||||
```
|
||||
Delete the "work-around" package:
|
||||
```
|
||||
rm cros-ui-config_0.12_all.deb
|
||||
```
|
||||
Install the adwaita-icon-theme-full package. Without this package, GUI Linux apps may have a very small cursor:
|
||||
```
|
||||
apt install -y adwaita-icon-theme-full
|
||||
```
|
||||
Now, shut down the container:
|
||||
```
|
||||
shutdown -h now
|
||||
```
|
||||
Reboot Chrome OS and start the Terminal application from the launcher. If it fails to start the first time, try again and it should work.
|
||||
|
||||
Rebooting is by clicking desktop right bottom clock / Power icon. After Chromebook has shutdown, short press laptop power button to start Chromebook.
|
||||
|
||||
### 8) Optional, if you install some Snap GUI apps
|
||||
|
||||
These are from same [Source](http://intertwingly.net/blog/2020/07/21/Ubuntu-20-04-on-Chromebook)
|
||||
but xet7 did not test them.
|
||||
|
||||
The fix is to copy the desktop and pixmap files to your .local environment:
|
||||
```
|
||||
mkdir -p ~/.local/share/pixmaps
|
||||
cp /snap/code/current/snap/gui/com.visualstudio.code.png ~/.local/share/pixmaps
|
||||
cp /snap/code/current/snap/gui/code.desktop ~/.local/share/applications
|
||||
```
|
||||
Finally, you will need to change three lines in the code.desktop file in your ~/.local directory.
|
||||
|
||||
First, you will need to change Exec=code to specify the full path, namely Exec=/snap/bin/code.
|
||||
|
||||
Next, in the two places where Icon= is defined, you will need to replace this with the path to the icon that you copied into your .local directory. In my case, the resulting lines look as follows:
|
||||
|
||||
Icon=/home/rubys/.local/share/pixmaps/com.visualstudio.code.png
|
||||
|
||||
Once these changes are made, you should be able to launch the application using the Launcher in the lower left hand corder of the screen, by clicking on the circle, entering code into the search box and then clicking on the Visual Studio Code icon. Once launched, the application will appear in the shelf at the bottom of the screen. Right clicking on this icon will give you the option to pin the application to the shelf.
|
||||
|
||||
It is still a beta, and the installation instructions (above) are still a bit daunting. More importantly, things that used to work can stop working at any time, like, for example, Ubuntu 18.04.
|
||||
|
||||
That being said, it is a full, no-compromise Ubuntu. I've developed and tested code using this setup. I even have installed my full development environment using Puppet.
|
||||
|
||||
The only glitch I do see is occasionally GUI applications don't receive keystrokes. This is generally fixed by switching focus to Chromebook application and then back again. Once the application is able to process keystrokes, it remains able to do so.
|
||||
|
||||
## 6) Install Wekan
|
||||
|
||||
At Ubuntu terminal:
|
||||
```
|
||||
sudo snap install wekan
|
||||
```
|
||||
|
||||
#### a) Use Wekan locally
|
||||
|
||||
At Ubuntu terminal, type:
|
||||
```
|
||||
ip address
|
||||
```
|
||||
It shows container internal IP address. You can set it to use Wekan locally, for example:
|
||||
```
|
||||
sudo snap set wekan root-url='http://100.115.92.200'
|
||||
sudo snap set wekan port='80'
|
||||
```
|
||||
Then Wekan works locally using Ubuntu webbrowser at http://100.115.92.200 , and you can open cards.
|
||||
|
||||
#### b) Use Wekan from other computers at LAN
|
||||
|
||||
Look at your Chromebook wifi settings `(i)`, what is your laptop IP address, and use it with below http address:
|
||||
```
|
||||
sudo snap set wekan root-url='http://192.168.0.2:2000'
|
||||
sudo snap set wekan port='2000'
|
||||
```
|
||||
At Chromebook settings / Linux Beta / > / Port forwarding, forwart port `2000` with nickname like for example `wekan`. This does forward Chromebook port to inside Ubuntu 20.10 64bit LXC container where Wekan is running.
|
||||
|
||||
NOTE: Sometimes reboot stops port forwarding, then it needs to be enabled again at Chromebook settings.
|
||||
|
||||
But problem is, using that LAN IP address does not work from Chromebook's own browser like Chrome or Linux Firefox. So looking at that at the next option:
|
||||
|
||||
#### c) Use hosts file
|
||||
|
||||
At your Chromebook Ubuntu, edit hosts:
|
||||
```
|
||||
sudo nano /etc/hosts
|
||||
```
|
||||
There add:
|
||||
```
|
||||
127.0.0.1 localhost wekan
|
||||
```
|
||||
Then with Ubuntu webbrowser you can browse http://wekan:2000 .
|
||||
|
||||
At other LAN computer, edit hosts:
|
||||
```
|
||||
sudo nano /etc/hosts
|
||||
```
|
||||
There add:
|
||||
```
|
||||
192.168.0.2 wekan
|
||||
```
|
||||
Then you can browse http://wekan:2000 from LAN computers. But mobile phones like Android and iOS can not usually change those settings, and if you don't have a way to setup local network computer names, let's look at next option:
|
||||
|
||||
#### d) Use some subdomain
|
||||
|
||||
If you have some domain, you can set new record `wekan.example.com A 192.168.0.2` . That is internet wide, but resolves to your local IP address on your local network. Then on your LAN mobile phones you can browse to http://wekan.example.com:2000 .
|
||||
|
||||
At Chromebook Ubuntu:
|
||||
```
|
||||
sudo nano /etc/hosts
|
||||
```
|
||||
There add:
|
||||
```
|
||||
127.0.0.1 localhost wekan.example.com
|
||||
```
|
||||
So then you can browse to http://wekan.example.com:2000 from Chromebook Ubuntu Firefox, Chromebook Chrome, other LAN computers and mobile phones.
|
||||
|
||||
#### Mobile app icon
|
||||
|
||||
For iOS and Android, you can [create app PWA icon this way](PWA).
|
||||
|
||||
## 7) Optional: Change Linux desktop apps language and install Firefox
|
||||
|
||||
Here changing to Finnish:
|
||||
```
|
||||
sudo dpkg-reconfigure-locales
|
||||
```
|
||||
There add this language, and set is as default:
|
||||
```
|
||||
fi_FI.UTF8
|
||||
```
|
||||
And install Ubuntu 20.10 version Firefox and translation:
|
||||
```
|
||||
sudo apt install firefox firefox-locale-fi
|
||||
```
|
||||
Shutdown Ubuntu container:
|
||||
```
|
||||
sudo shutdown -h now
|
||||
```
|
||||
Reboot Chromebook by clicking desktop right bottom clock / Power icon. After Chromebook has shutdown, short press laptop power button to start Chromebook.
|
||||
|
||||
## 8) Optional: Install HP DeskJet 2600 multifunction printer/scanner
|
||||
|
||||
This inkjet printer was cheapest available, and does print excellent quality similar to laser color printer.
|
||||
|
||||
You should set your wireless network printer to have Static IP address.
|
||||
|
||||
[Source](https://chromeunboxed.com/how-to-use-your-hp-printer-with-linux-on-chrome-os/)
|
||||
```
|
||||
sudo apt install hplip hplip-gui cups system-config-printer
|
||||
sudo xhost +
|
||||
sudo hp-setup
|
||||
```
|
||||
Check:
|
||||
```
|
||||
[X] Network/Ethernet/Wireless newtork (direct connection or JetDirect)
|
||||
```
|
||||
Click:
|
||||
```
|
||||
> Show Advanced Options:
|
||||
```
|
||||
Check:
|
||||
```
|
||||
[X] Manual Discovery
|
||||
IP Address or network name: [ YOUR-PRINTER-STATIC-IP-HERE, for example 192.168.0.200 ]
|
||||
JetDirect port: [1]
|
||||
```
|
||||
Next, Next, Add Printer.
|
||||
```
|
||||
sudo system-config-printer
|
||||
```
|
||||
Set printer as Default.
|
||||
|
||||
You are also able to Scan images from your multifunction printer with XSane, that was installed with HP printer drivers.
|
||||
|
||||
You can print from Ubuntu Linux apps, like for example Firefox, LibreOffice, Inkscape, etc what you can install with apt.
|
||||
|
||||
## 9) Optional: Gimp
|
||||
|
||||
[Gimp PPA for Ubuntu 20.10 Groovy](https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/gimp). Note: Other versions of Gimp do not have all translations or do not create icons, like default Gimp from Ubuntu 20.10 repos and Snap.
|
||||
@@ -0,0 +1,3 @@
|
||||
[Article from 2016](https://www.cloudfoundry.org/100-day-challenge-082-running-wekan-cloud-foundry/)
|
||||
|
||||
Probably needs update to use [precompiled Wekan release](https://www.cloudfoundry.org/100-day-challenge-082-running-wekan-cloud-foundry/) ?
|
||||
@@ -0,0 +1,19 @@
|
||||
# Cloudron setup
|
||||
|
||||
Status:
|
||||
- [Cloudron now uses upstream Wekan directly](https://github.com/wekan/wekan/issues/3035), so Cloudron users get all Wekan newest features and fixes
|
||||
|
||||
Cloudron is a complete solution for running apps on your server and keeping them up-to-date and secure.
|
||||
|
||||
1. First install Cloudron on your server with 3 simple commands - https://cloudron.io/get.html
|
||||
2. Install Wekan from the Cloudron Store. Once installed, you will get automatic updates for Wekan as and when they get released.
|
||||
|
||||
[](https://cloudron.io/button.html?app=io.wekan.cloudronapp)
|
||||
|
||||
The source code for the package can be found [here](https://git.cloudron.io/cloudron/wekan-app/).
|
||||
|
||||
You can also test the wekan installation on the demo Cloudron instance - https://my.demo.cloudron.io (username: cloudron password: cloudron).
|
||||
|
||||
# Backup
|
||||
|
||||
[Backup Cloudron](Backup#Cloudron)
|
||||
@@ -0,0 +1,50 @@
|
||||
[Original issue](https://github.com/wekan/wekan/issues/4512)
|
||||
|
||||
## Introduction
|
||||
|
||||
Previously WeKan used Stylus, that is similar to CSS. Stylus has some additional features.
|
||||
|
||||
Stylus code was located at `wekan/client/components/*/*.styl`, for example `wekan/client/components/boards/boardsList.styl`.
|
||||
|
||||
## Why
|
||||
|
||||
- `coagmano:stylus` is not maintained anymore
|
||||
- When building meteor bundle, `coagmano:stylus` causes [errors like Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency](https://github.com/Meteor-Community-Packages/meteor-stylus/issues/9) with newest Meteor 2.7.2
|
||||
- Removing `coagmano:stylus` fixed [Mermaid Diagram error: Maximum call stack size exceeded](https://github.com/wekan/wekan/issues/4251) from browserside right click / Inspect / Console. After removing `coagmano:stylus`, that error was not there anymore.
|
||||
|
||||
## Converting Stylus to CSS
|
||||
|
||||
[Source](https://github.com/wekan/wekan/blob/main/releases/stylus-to-css.sh)
|
||||
|
||||
#### 1) Install Stylus
|
||||
```
|
||||
sudo npm -g install stylus
|
||||
```
|
||||
#### 2) Comment out `@import 'nib'` that is not supported syntax in newest plain Stylus, for all .styl files in directory
|
||||
```
|
||||
sed -i "s|@import 'nib'|//@import 'nib'|g" *.styl
|
||||
```
|
||||
That code `@import 'nib'` is using [CSS imports](https://developer.mozilla.org/en-US/docs/Web/CSS/@import) that does [Eric Meyer's CSS reset of styles](https://github.com/stylus/nib/blob/master/lib/nib/reset.styl). xet7 [added that reset to separate CSS file](https://github.com/wekan/wekan/commit/985c2cdbfdb38eb43852f3aa257859bbd3f817b9). While in [original converting Stylus to CSS](https://github.com/wekan/wekan/commit/072778b9aaefd7fcaa7519b1ce1cafc1704d646d) that `@import 'nib'` was in many files, it seems it's enough to have it at [client/components/boards/boardsList.css](https://github.com/wekan/wekan/commit/985c2cdbfdb38eb43852f3aa257859bbd3f817b9#diff-c227ea7dd2df8f46604db81ce7c49902b7e8829266ab79bb1c80077b5ba2b5b0) that is used at all pages of WeKan.
|
||||
|
||||
Alternative to CSS imports would be to add that CSS code to beginning of that CSS file where it is needed.
|
||||
|
||||
Other CSS transpilers may use similar imports.
|
||||
|
||||
Not having all requires CSS can be seen like:
|
||||
- [Some extra bullets](https://github.com/wekan/wekan/issues/4516)
|
||||
- [Some wrong colors](https://github.com/wekan/wekan/issues/4519)
|
||||
|
||||
#### 3) For all files in directory, run command `stylus filename.styl`
|
||||
```
|
||||
ls *.styl | xargs stylus
|
||||
```
|
||||
#### 4) Remove `coagmano:stylus`
|
||||
```
|
||||
meteor remove coagmano:stylus
|
||||
```
|
||||
#### 5) Delete .styl files
|
||||
```
|
||||
cd wekan
|
||||
rm client/components/*/*.styl
|
||||
```
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
## Description
|
||||
|
||||
- Cover image = Image that you see first at not yet opened minicard, book, or magazine.
|
||||
- Minicard = At board, small card, that you have not yet clicked to open card.
|
||||
- Thumbnail Image = Small Picture of Attachment Image, like at Minicard and Card.
|
||||
- At opened card, when you click thumbnail, it opens big picture slideshow.
|
||||
|
||||
## Minicard Cover Image and Count of attachments
|
||||
|
||||
<img src="https://wekan.github.io/cover/cover-and-attachment.png" width="100%" alt="Minicard Cover Image and Count of attachments" />
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
Here is how to build wekan code and add your new theme with code changes and send as pull request:
|
||||
https://github.com/wekan/wekan/wiki/Emoji#how-you-could-add-another-plugin
|
||||
|
||||
Here is how some have sent previous themes to Wekan, what code changes they made:
|
||||
https://github.com/wekan/wekan/pulls?q=is%3Apr+is%3Aclosed+theme
|
||||
|
||||
After you have sent new theme as pull request, you see it as open pull request:
|
||||
https://github.com/wekan/wekan/pulls?q=is%3Apr+theme+is%3Aopen
|
||||
|
||||
And when I have merged it to Wekan, that theme will be in next Wekan release, listed at ChangeLog:
|
||||
https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
|
||||
At Wekan Snap page you see with webpage reload, when new version has been released:
|
||||
https://snapcraft.io/wekan
|
||||
|
||||
Wekan Snap version gets updates automatically soon after new Wekan version has been released, or you can update manually immediately:
|
||||
https://github.com/wekan/wekan-snap/wiki/Automatic-update-schedule
|
||||
|
||||
***
|
||||
|
||||
Also see: [Dark Mode](Dark-Mode)
|
||||
|
||||
All Wekan themes are directly integrated to Wekan. You can add pull request to master branch to add custom theme, you can see from [from this commit](https://github.com/wekan/wekan/commit/34b2168d0dda253dedabbee47031873efa4ae446) required new color/theme name and changes to these files 3 files listed below. In that commit is also changes to other files, you don't need to change those files.
|
||||
- `wekan/client/components/boards/boardColors.styl`
|
||||
- `wekan/models/boards.js`
|
||||
- `wekan/server/migrations.js`
|
||||
|
||||
Alternatives for sending new theme as pull request:
|
||||
- If you would like to have some new theme, please add screenshot mockup to [new Wekan issue](https://github.com/wekan/wekan/issues).
|
||||
- If possible, you can also try to create those CSS changes with [Stylish browser extension](https://userstyles.org/) and add those to new issue too.
|
||||
|
||||
There are currently board color modes/themes, and these full themes:
|
||||
- Dark: modified from below by @lonix1 and more changes by xet7
|
||||
- Relax: Light green background that helps Wekan users to relax in company of Wekan contributor that sent theme CSS.
|
||||
|
||||
Upcoming full themes that will be added by xet7:
|
||||
- Corteza, that will be mostly-white theme, although different than example of white theme below
|
||||
- Octopus, that will have different colors and some Wekan features hidden
|
||||
|
||||

|
||||
|
||||
## Dark theme
|
||||
|
||||
[by @lonix1](https://github.com/wekan/wekan/issues/1149), could look a little like this screenshot mockup:
|
||||
|
||||
<!--
|
||||

|
||||
-->
|
||||
|
||||
lonix1 created some css overrides with Stylish. It's not complete but I'm happy with it. I work in swimlanes mode, so that is what I changed (not list mode or calendar mode).
|
||||
|
||||
Colors:
|
||||
- adds dark mode, I used vscode as a reference
|
||||
|
||||
Other:
|
||||
- hides various useless icons and things
|
||||
- hides "add card", "add swimlane", "add list" links, until hovered (I find these very "noisy")
|
||||
|
||||
```css
|
||||
/* HIDE PERMANENTLY -------------------------------------------------- */
|
||||
|
||||
/* various */
|
||||
.wekan-logo,
|
||||
.close-card-details { display:none; }
|
||||
|
||||
/* header text */
|
||||
#header-quick-access >ul >li:nth-child(1) >a { font-size:0; }
|
||||
#header-quick-access >ul >li:nth-child(1) >a >.fa-home{ font-size:12px; margin:0; }
|
||||
|
||||
/* popup menu titles (boards, swimlanes, lists, cards, labels) */
|
||||
.pop-over >.header { display:none; }
|
||||
|
||||
/* OPTIONAL
|
||||
card fields: received, start, due, end, members, requested, assigned
|
||||
I rarely use these... uncomment if you want to hide them */
|
||||
/*
|
||||
.card-details-item.card-details-item-received,
|
||||
.card-details-item.card-details-item-start,
|
||||
.card-details-item.card-details-item-due,
|
||||
.card-details-item.card-details-item-end,
|
||||
.card-details-item.card-details-item-members,
|
||||
.card-details-item.card-details-item-name { display:none; }
|
||||
.card-details-items:empty { display:none; }
|
||||
*/
|
||||
|
||||
/* HIDE UNTIL HOVER -------------------------------------------------- */
|
||||
|
||||
/* header "+" button */
|
||||
#header-quick-access .fa-plus { display:none; }
|
||||
#header-quick-access:hover .fa-plus { display:inherit; }
|
||||
|
||||
/* "add card" links (use visibility rather than display so items don't jump) */
|
||||
.open-minicard-composer { visibility:hidden; }
|
||||
.list.js-list:hover .open-minicard-composer { visibility:visible; }
|
||||
.list-header-menu { visibility:hidden; }
|
||||
.list.js-list:hover .list-header-menu { visibility:visible; }
|
||||
|
||||
/* "add list/swimlane" links (use visibility rather than display so items don't jump) */
|
||||
.list.js-list-composer >.list-header { visibility:hidden; }
|
||||
.list.js-list-composer:hover >.list-header { visibility:visible; }
|
||||
|
||||
/* DARK MODE -------------------------------------------------- */
|
||||
|
||||
/* headers */
|
||||
#header-quick-access, #header { background-color:rgba(0,0,0,.75) !important; }
|
||||
#header .board-header-btn:hover { background-color:rgba(255,255,255,0.3) !important; }
|
||||
|
||||
/* backgrounds: swimlanes, lists */
|
||||
.swimlane { background-color:rgba(0,0,0,1); }
|
||||
.swimlane >.swimlane-header-wrap,
|
||||
.swimlane >.list.js-list,
|
||||
.swimlane >.list-composer.js-list-composer { background-color:rgba(0,0,0,.9); }
|
||||
|
||||
/* foregrounds: swimlanes, lists */
|
||||
.list >.list-header, .swimlane-header { color:rgba(255,255,255,.7); }
|
||||
|
||||
/* minicards */
|
||||
.minicard { background-color:rgba(255,255,255,.4); }
|
||||
.minicard-wrapper.is-selected .minicard,
|
||||
.minicard:hover,
|
||||
.minicard-composer.js-composer,
|
||||
.open-minicard-composer:hover { background-color:rgba(255,255,255,.8) !important; color:#000; }
|
||||
.minicard, .minicard .badge { color:#fff; }
|
||||
.minicard:hover .badge, .minicard-wrapper.is-selected .badge { color:#000; }
|
||||
|
||||
/* cards */
|
||||
.card-details,
|
||||
.card-details .card-details-header { background-color:#ccc; }
|
||||
|
||||
/* sidebar */
|
||||
.sidebar-tongue, .sidebar-shadow { background-color:#666 !important; }
|
||||
.sidebar-content h3, .sidebar-content .activity-desc { color:rgba(255,255,255,.7) !important; }
|
||||
```
|
||||
|
||||
If anyone improves on this, please share here.
|
||||
|
||||
## White theme
|
||||
|
||||
[pravdomil](https://github.com/wekan/wekan/issues/1690) has created small script for tampermonkey to redesign wekan board.
|
||||
|
||||

|
||||
|
||||
script for tampermonkey
|
||||
```js
|
||||
// ==UserScript==
|
||||
// @name Kanban
|
||||
// @namespace https://pravdomil.com/
|
||||
// @version 0.1
|
||||
// @match https://wekan.indie.host/*
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
;(function() {
|
||||
const el = document.createElement("style")
|
||||
// language=CSS
|
||||
el.textContent = `
|
||||
/* white background */
|
||||
body { background-color: white; }
|
||||
|
||||
/* header bar next to top bar */
|
||||
#header #header-main-bar {
|
||||
position: absolute;
|
||||
right: 70px;
|
||||
left: 300px;
|
||||
top: -3px;
|
||||
padding: 0;
|
||||
height: calc(28px + 3px);
|
||||
}
|
||||
|
||||
/* swimlane white background, no borders, fix ellipsis */
|
||||
.swimlane { background-color: white; }
|
||||
.swimlane-header-wrap { border: 0 !important; }
|
||||
.swimlane-header { text-overflow: initial !important; }
|
||||
|
||||
/* column header only for first row */
|
||||
.swimlane .list-header { margin: 4px 12px 4px; }
|
||||
.swimlane .list-header-name { display: none; }
|
||||
div:nth-child(1 of .swimlane) .list-header { margin: 20px 12px 4px; }
|
||||
div:nth-child(1 of .swimlane) .list-header-name { display: inline; }
|
||||
|
||||
/* cells no borders, fix height, less padding, no add new card */
|
||||
.list { border: 0; background-color: white; flex: 300px 0 0; }
|
||||
.list .list-body { height: 160px; padding: 0 2px; }
|
||||
.list .open-minicard-composer { display: none; }
|
||||
.list .open-list-composer { opacity: 0; transition: opacity .2s; }
|
||||
.list .open-list-composer:hover { opacity: 1; }
|
||||
|
||||
/* card style */
|
||||
.minicard-wrapper { margin-bottom: 2px !important; }
|
||||
.minicard { box-shadow: 0 0 16px rgba(0,0,0,0.15) inset; }
|
||||
|
||||
/* card style for first and last column */
|
||||
.swimlane .list:nth-child(2) .minicard { opacity: .5 !important; }
|
||||
.swimlane .list:nth-last-child(2) .minicard { opacity: .1 !important; }
|
||||
|
||||
/* card details always center, menu items tweaks */
|
||||
.card-details {
|
||||
position: absolute;
|
||||
z-index: 10000 !important;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: calc(50% - 510px / 2);
|
||||
}
|
||||
.pop-over-list .js-labels { display: none }
|
||||
.pop-over-list .js-move-card-to-top { display: none }
|
||||
.pop-over-list .js-move-card-to-bottom { display: none }
|
||||
.pop-over-list .js-archive { color: darkred }
|
||||
|
||||
/* not needed */
|
||||
.wekan-logo, .js-member, .attachments-galery { display: none; }
|
||||
|
||||
`
|
||||
|
||||
document.body.appendChild(el)
|
||||
})()
|
||||
|
||||
```
|
||||
@@ -0,0 +1,29 @@
|
||||
[Custom Fields issue](https://github.com/wekan/wekan/issues/807)
|
||||
|
||||
## To translators, about the word Custom
|
||||
|
||||
See other feature for description of Custom https://github.com/wekan/wekan/wiki/Customize-Translations
|
||||
|
||||
## 1) Click: Board hamburger menu / Custom Fields
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-1.png" width="50%" alt="Custom Field Step 1" />
|
||||
|
||||
## 2) Click: Create Field, add details and Save
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-2.png" width="50%" alt="Custom Field Step 1" />
|
||||
|
||||
## 3) Click: Card Details hamburger menu / Edit custom fields
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-3.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 4) Click: Your Custom Field name to insert it to Card
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-4.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 5) Click: Your selection from your Custom Field
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-5.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 6) Custom Field is shown at Minicard and Card Details
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-6.png" width="100%" alt="Custom Field Step 1" />
|
||||
@@ -0,0 +1,24 @@
|
||||
In Wekan v4.40 and newer:
|
||||
|
||||
- Custom Logo for Login and Top Left Corner.
|
||||
- Optional link when clicking logo.
|
||||
- Settings at Admin Panel / Settings / Layout.
|
||||
|
||||
Added [with this commit](https://github.com/wekan/wekan/commit/a7c3317ed696fad8e211b22afbb3012f3a4f2ddb). As you can see from that commit:
|
||||
- Height 27 px in Top Left Corner Logo. Width auto = automatic.
|
||||
- Width 300 px in Login Logo. Height auto = automatic.
|
||||
|
||||
Image can be for example jpg/png/gif/svg.
|
||||
|
||||
For those sizes, if logo is a little bigger or smaller, it will be zoomed.
|
||||
|
||||
## Storing logo images elsewhere
|
||||
|
||||
Add image like `https://example.com/logo.png`
|
||||
|
||||
## Storing logos in Wekan
|
||||
|
||||
1. Create board and change it from private to public (visible to everyone at Internet)
|
||||
2. Add card
|
||||
3. Add logo images to card as attachment
|
||||
4. Right click on top image and copy image link to Admin Panel/Settings/Layout/Logo image URL
|
||||
@@ -0,0 +1,26 @@
|
||||
In WeKan v7.08 and newer.
|
||||
|
||||
## Description
|
||||
|
||||
WeKan has default translations from English to other languages at https://explore.transifex.com/wekan/wekan/
|
||||
|
||||
With this feature, you can override some default translation string with custom string, your modified new version of translation text, with GUI at Admin Panel, and changes are immediately in use in WeKan.
|
||||
|
||||
## To translators, about the word Custom
|
||||
|
||||
Custom means something modified, that is not the default.
|
||||
For example, WeKan has other feature https://github.com/wekan/wekan/wiki/Custom-Fields ,
|
||||
where is added new custom fields, that are not default.
|
||||
|
||||
## Admin Panel / Translation
|
||||
|
||||
- Language: https://github.com/wekan/wekan/blob/main/imports/i18n/languages.js
|
||||
- Text, source string In English: https://github.com/wekan/wekan/blob/main/imports/i18n/data/en.i18n.json
|
||||
- Translation text: Your new translation custom string
|
||||
|
||||
## Source
|
||||
|
||||
- https://github.com/wekan/wekan/pull/5085
|
||||
- https://github.com/wekan/wekan/issues/5065#issuecomment-1668259510
|
||||
|
||||
<img src="https://wekan.github.io/custom-translation-string.png" width="100%" alt="Translation Custom String" />
|
||||
@@ -0,0 +1,22 @@
|
||||
## Wekan Dark Mode
|
||||
|
||||

|
||||
|
||||
## Other Dark Modes
|
||||
|
||||
### Chrome Desktop Browser
|
||||
- [Dark Mode Extension](https://chrome.google.com/webstore/detail/dark-mode-for-chrome/geooakdjiamlhpechokegobmhdmlgidk) - changes all webpages to dark, including Wekan.
|
||||
- [Decent - Dark Theme](https://chrome.google.com/webstore/detail/decent/bnnjhehfmlfkbdocbphdoagolcknbohp)
|
||||
|
||||
### Firefox Desktop and Mobile Browser
|
||||
- [Dark Mode Webextension](https://addons.mozilla.org/en-US/android/addon/dark-mode-webextension/) - changes all webpages to dark, including Wekan.
|
||||
- There is dark themes, depends what someone likes
|
||||
|
||||
### Thunderbird Email
|
||||
- [TT DeepDark - Dark Theme](https://addons.thunderbird.net/en-US/thunderbird/addon/tt-deepdark/) - after installing click Edit/Preferences/Display/Colors/Font&Colors-Colors Text: Grey Background: Black and also Plain Text Messages Color: Black.
|
||||
|
||||
### Qubes OS Desktop
|
||||
- Start / System Tools / Appearance / Styles: Adwaita-dark
|
||||
|
||||
### Android M
|
||||
- [Dark Phone Theme](https://www.phonearena.com/news/Finally-Android-M-scores-a-new-system-wide-dark-UI-theme_id69814)
|
||||
@@ -0,0 +1,7 @@
|
||||
## 1) Click right top your username
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_1.png" width="40%" alt="Day of Week Start 1" />
|
||||
|
||||
## 2) Click Change Settings => Set day of the week start => Select first day of the week from dropdown menu
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_2.png" width="40%" alt="Day of Week Start 1" />
|
||||
@@ -0,0 +1,10 @@
|
||||
- [Snap](Snap)
|
||||
- [Docker](Docker)
|
||||
- [Source](Source)
|
||||
- [Unofficial debian package](https://github.com/soohwa/wekan-deb/releases) with build and installation instructions [here](https://github.com/soohwa/wekan-deb)
|
||||
|
||||
### Old install scripts
|
||||
|
||||
[Debian Wheezy 64bit & Devuan Jessie 64 bit](https://github.com/wekan/sps)
|
||||
|
||||
[Autoinstall script](https://github.com/wekan/wekan-autoinstall)
|
||||
@@ -0,0 +1,115 @@
|
||||
## Maximum Call Stack Size Exceeded
|
||||
|
||||
https://github.com/wekan/wekan/issues?q=is%3Aissue+maximum+call+stack+is%3Aclosed
|
||||
|
||||
https://stackoverflow.com/questions/75869629/ios-websocket-close-and-error-events-not-firing
|
||||
|
||||
This can happen, when there is too much or incompatible code at browserside, for example at iOS Safari.
|
||||
|
||||
To fix it:
|
||||
|
||||
1. Move ExcelJS from browserside to run at serverside https://github.com/wekan/wekan/pull/3871
|
||||
2. Use Bundle Visualizer to see what is the size of dependencies, and try what can be moved to serverside like at step 1, that bundle visualizer is used in this script https://github.com/wekan/wekan/blob/main/rebuild-wekan.sh
|
||||
```
|
||||
meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 --extra-packages bundle-visualizer --production 2>&1 | tee ../log.txt
|
||||
```
|
||||
3. Make dependencies smaller. For example, use only required files, and do not include all dependencies: https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d . In that commit, package was forked to packages directory, then renamed, and added with `meteor add packagename`, where package name does not have character `:`
|
||||
4. Use Browserstack.com to see errors at browser / inspect / console, or use iOS or other device emulators, to see error messages. Testing at real device is more important, because they could work differently than emulators, emulators sometimes do not emulate all same features. Those error messages have file where error happened, and line number, like `something.js:301` . From there, scroll up a little, look at what function or what package dependency it is where it happened. If possible, try to move that package serverside, like at step 1. Or alternatively, look is it possible to remove or change to some other compatible dependency.
|
||||
5. See what are the dependencies at your Meteor based software, compared to WeKan dependencies that are usually already upgraded to newest Meteor, is there any differences where changing to correct dependencies could help you to upgrade to newest Meteor:
|
||||
- https://github.com/wekan/wekan/blob/main/package.json
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/packages
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/versions
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/release
|
||||
5. If you get some errors, search are those same already fixed in WeKan/Meteor/RocketChat, could you fix them same way:
|
||||
- https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- https://github.com/wekan/wekan/issues
|
||||
- https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/meteor/meteor/issues
|
||||
- https://github.com/meteor/meteor/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues?q=is%3Aissue+is%3Aclosed
|
||||
6. If you have some webserver providing SSL/TLS, check that you have websockets enabled:
|
||||
- https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Apache
|
||||
- OpenLiteSpeed https://github.com/wekan/wekan/issues/3334#issuecomment-723651328
|
||||
- https://github.com/wekan/wekan/wiki/Local-self-signed-TLS
|
||||
- https://github.com/wekan/wekan/wiki/Traefik-and-self-signed-SSL-certs
|
||||
|
||||
## OLD: TODO
|
||||
|
||||
[Quote from advise](https://github.com/meteor/meteor/issues/9796#issuecomment-443520767):
|
||||
|
||||
> Identify the core service your app is providing and make sure it is running independently. Put everything non-critical, including reporting, on some other system.
|
||||
|
||||
[Look at scaling tips here](https://github.com/meteor/meteor/issues/9796#issuecomment-411373831), quote:
|
||||
|
||||
> smeijer commented 25 days ago
|
||||
> Just wanted to let know that I haven't experienced this issue anymore since I've replaced a lot of `meteor publications` with `apollo/graphql requests`.
|
||||
>
|
||||
> The reactivity is thereby lost, but in my case a 30sec poll is also fine. On the places that I do require reactivity, I only `publish` a single `timestamp`. This timestamp is passed through to `apollo`, which triggers a `refetch` when the timestamp is changed.
|
||||
>
|
||||
> The [discussion here](https://forums.meteor.com/t/implementing-livedocument-as-an-alternative-to-livequery-discussion/40152) has also been helpfull to improve performance here and there.
|
||||
|
||||
[Rocket.Chat scaling tips](https://rocket.chat/docs/installation/manual-installation/multiple-instances-to-improve-performance/)
|
||||
|
||||
## Kadira
|
||||
|
||||
- https://github.com/edemaine/kadira-compose
|
||||
- https://github.com/meteor/meteor-apm-agent
|
||||
- https://github.com/kadira-open/kadira-server
|
||||
- https://www.gethappyboards.com/2017/07/rolling-out-your-own-instance-of-kadira/
|
||||
|
||||
## Finding memory leaks
|
||||
|
||||
**[Collect a heap profile and then analyze it](https://github.com/v8/sampling-heap-profiler)**
|
||||
|
||||
[Older article: How to Self Detect a Memory Leak in Node](https://www.nearform.com/blog/self-detect-memory-leak-node/)
|
||||
|
||||
## 100% CPU usage
|
||||
|
||||
1) Increase ulimit system wide to 100 000 in systemd config.
|
||||
|
||||
2) Wekan Javascript code has [increaded fiber poolsize](https://github.com/wekan/wekan/blob/main/server/authentication.js#L5-L9).
|
||||
|
||||
3) There is [on-going 100% CPU usage Meteor issue](https://github.com/meteor/meteor/issues/9796#issuecomment-400079380) and hopefully [fixes to Node.js will land in Node v8.12](https://github.com/nodejs/node/pull/21593#issuecomment-403636667) sometime. Node 8.12 is now released and official version included at Wekan.
|
||||
|
||||
## Scaling to thousands of users
|
||||
|
||||
[Production setup at AWS](AWS)
|
||||
|
||||
## Current versions of dependencies
|
||||
|
||||
[Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile), versions of Meteor.js, Node etc listed at beginning.
|
||||
|
||||
[Included Meteor packages](https://github.com/wekan/wekan/blob/main/.meteor/packages)
|
||||
|
||||
[Included Meteor package versions](https://github.com/wekan/wekan/blob/main/.meteor/versions)
|
||||
|
||||
[Added packages at package.json](https://github.com/wekan/wekan/blob/main/package.json)
|
||||
|
||||
## Build from source
|
||||
|
||||
Wekan:
|
||||
- On any x64 hardware that has Ubuntu 14.04 or Debian 9 or newer installed directly or in VM:
|
||||
[Build from source scripts](https://github.com/wekan/wekan-maintainer/tree/master/virtualbox)
|
||||
|
||||
Wekan for Sandstorm:
|
||||
- Install above Wekan from source
|
||||
- Install [Sandstorm locally](https://sandstorm.io/install) with `curl https://install.sandstorm.io | bash`, select dev install
|
||||
- Install [meteor-spk](https://github.com/sandstorm-io/meteor-spk)
|
||||
- Get 100% CPU issue fibers fixed node, and copy it to spk directory:<br />
|
||||
`wget https://releases.wekan.team/node`<br />
|
||||
`chmod +x node`<br />
|
||||
`mv node ~/projects/meteor-spk/meteor-spk-0.4.0/meteor-spk.deps/bin/`
|
||||
- Add to your /home/username/.bashrc : <br /> `export PATH=$PATH:$HOME/projects/meteor-spk/meteor-spk-0.4.0`
|
||||
- Close and open your terminal, or read settings from .bashrc with<br />`source ~/.bashrc`
|
||||
- `cd wekan && meteor-spk dev`
|
||||
- Then Wekan will be visible at local sandstorm at http://local.sandstorm.io:6080/
|
||||
- Sandstorm commands: `sudo sandstorm`. [Release scripts](https://github.com/wekan/wekan-maintainer/tree/master/releases). Official releases require publishing key that only xet7 has.
|
||||
|
||||
Docker:
|
||||
- `git clone https://github.com/wekan/wekan`
|
||||
- `cd wekan`
|
||||
- Edit docker-compose.yml script ROOT_URL etc like documented at https://github.com/wekan/wekan-mongodb docker-compose.yml script
|
||||
- `docker-compose up -d --build`
|
||||
@@ -0,0 +1,136 @@
|
||||
## WeKan Interview 2023-12-08 starts at 22min 22sec
|
||||
|
||||
https://www.youtube.com/watch?v=ke-mbnZM3zE
|
||||
|
||||
## Screenshot of Meteor WeKan
|
||||
|
||||
<img src="https://wekan.github.io/wekan-dark-mode.png" width="100%" alt="Meteor WeKan screenshot" />
|
||||
|
||||
## Description of Meteor WeKan
|
||||
|
||||
- WeKan Open Source kanban with MIT license.
|
||||
- Translated to 70+ languages https://explore.transifex.com/wekan/wekan/
|
||||
- Used in most countries of the world https://snapcraft.io/wekan
|
||||
- Biggest user have about 30k users, using many pods at Kubernetes
|
||||
- Changelog https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- Commercial Support at https://wekan.team/commercial-support/ . Currently looking who could sponsor more of maintenance and development.
|
||||
|
||||
## How much effort to create Meteor WeKan, in COCOMO model
|
||||
|
||||
- WeKan 134k lines of code: 34 years of effort, 316 contributors https://openhub.net/p/wekan
|
||||
- Meteor.js, 224k lines of code: 59 years of effort, 819 contributors https://openhub.net/p/meteor-js
|
||||
- Since December 2016, WeKan maintainer https://github.com/xet7 :
|
||||
- has added and removed about 4M lines of code https://github.com/wekan/wekan/graphs/contributors
|
||||
- https://openhub.net/accounts/xet7
|
||||
|
||||
## Meteor WeKan Browser support
|
||||
|
||||
- Javascript enabled Desktop and Mobile Safari/Chromium/Firefox based browsers
|
||||
- Apps at Play Store, Windows Microsoft Store, Ubuntu Touch OpenStore https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
- Alternatively, for self-hosted WeKan, create PWA icon https://github.com/wekan/wekan/wiki/PWA
|
||||
- Using WeKan with big touchscreen https://github.com/wekan/wekan/wiki/Touch-Screen-support
|
||||
|
||||
## Meteor WeKan Server
|
||||
|
||||
- Meteor.js 2.x, Node.js 14.x https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4 , MongoDB 6.x
|
||||
- CPU: amd64, arm64, s390x, Source Bundle at https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
- Windows On-Premise: https://github.com/wekan/wekan/wiki/Offline
|
||||
- Mac: Docker, or at https://github.com/wekan/wekan/wiki/Mac
|
||||
- Newest at platforms: Source Bundle, Snap Candidate, Docker, Kubernetes https://wekan.github.io
|
||||
- Platforms that will be updated to be up-to-date: Snap Stable, Sandstorm, UCS https://wekan.github.io
|
||||
|
||||
## Meteor WeKan Features
|
||||
|
||||
- [WeKan Design Principles](https://github.com/wekan/wekan/wiki/Design-Principles)
|
||||
- Realtime UI. When someone makes change, like drag card or add text, everyone will see changes immediately. This is because Meteor listens to MongoDB change stream, and updates UI. For some rare cases, there needs to be reload of page, those need to be fixed.
|
||||
- Whitelabel: Change product name and product image at login screen and board left top corner. Not changing favicon, because there are 100+ favicons for different devices.
|
||||
- Drag Drop at Desktop and Mobile:
|
||||
- Board Icons, Swimlanes, Lists, Cards, Checklists, Checklist Items
|
||||
- Drag handles, per screen https://github.com/wekan/wekan/wiki/Drag-Drop
|
||||
- Some features similar to Trello and Jira. Some features not in Trello and Jira.
|
||||
- IFTTT Rules like Trello Butler https://github.com/wekan/wekan/wiki/IFTTT , translated to all supported languages. Trello Butler is only In English.
|
||||
- Many Assignees like in Jira.
|
||||
- Change background image and Card Cover. Change Theme. Change color of Boards, Swimlane, List, Card, Label.
|
||||
- Markdown at: Board name and description, Swimlane, List, Card title and description, Checklist and Checklist Item, Subtask title, https://github.com/wekan/wekan/wiki/Wekan-Markdown
|
||||
- Emoji https://github.com/wekan/wekan/wiki/Emoji
|
||||
- MathML
|
||||
- Preview card attachment image and PDF
|
||||
- Show Start at End Dates of card at Calendar of Swimlanes/Lists/Calendar dropdown menu
|
||||
- Custom Fields https://github.com/wekan/wekan/wiki/Custom-Fields
|
||||
- Subtasks https://github.com/wekan/wekan/wiki/Subtasks
|
||||
- Planning Poker / Scrum Poker at Card https://github.com/wekan/wekan/wiki/Planning-Poker . No other card games yet ;)
|
||||
- For board actions, like move card etc, Per Board and Global Outgoing and 2-way webhooks to Chat (RocketChat, Slack, Discord etc), NodeRED, or PHP webhook receiver like https://github.com/wekan/webhook
|
||||
- At top right username menu:
|
||||
- Search All Boards, with search options
|
||||
- Public Boards. Board can be set private or public. At Admin Panel is option to disable public boards, so all boards are private.
|
||||
- Change Language
|
||||
- My Cards and Due Cards: Show cards where you are member or assignee, from all boards
|
||||
- At top of current board:
|
||||
- Filter cards, by user etc
|
||||
- Multi-Selection, checkmark and drag many cards at once
|
||||
- Sort current board
|
||||
- Python and PHP based additional features https://github.com/wekan/wekan/wiki/Python
|
||||
- Admin Panel:
|
||||
- Organizations/Teams/People. Impersonate User, logged to database when someone uses that feature.
|
||||
- Customize Translations https://github.com/wekan/wekan/wiki/Customize-Translations
|
||||
|
||||
## Technical details
|
||||
|
||||
- Reactive Cache
|
||||
- mfilser tested speed improvement for half a year, and finally made huge PR to WeKan v7.00 to make all of WeKan use Reactive cache https://github.com/wekan/wekan/pull/5014
|
||||
- Reactive Cache Repo https://github.com/wekan/meteor-reactive-cache , xet7 updated dependencies
|
||||
- Big performance improvements https://github.com/wekan/wekan/issues/5000
|
||||
- Using same style of API for client and serverside
|
||||
- Use more ReactiveCache than MiniMongo
|
||||
- Optimizing and Debugging Meteor, reducing size, links to WeKan dependencies https://github.com/wekan/wekan/wiki/Debugging
|
||||
- Custom OIDC/OAuth2 login
|
||||
- Repo https://github.com/wekan/wekan/tree/main/packages/wekan-oidc
|
||||
- Features:
|
||||
- At Admin Panel, you can change text of login page button `Login with OIDC`
|
||||
- Auth0 https://github.com/wekan/wekan/wiki/OAuth2#auth0 . This did take about half year to implement by xet7, was not available anywhere else for Meteor.
|
||||
- Oracle OIM. https://github.com/wekan/wekan/wiki/Oracle-OIM . For this, customer provided some code. xet7 added fix to make login work even when some login field was missing data, by taking data from other field, all this while xet7 did not have access to customers Oracle OIM, just guessing about what code to add, and it worked.
|
||||
- GitLab https://github.com/wekan/wekan/wiki/OAuth2#gitlab-providing-oauth2-login-to-wekan
|
||||
- RocketChat https://github.com/wekan/wekan/wiki/OAuth2#rocketchat-providing-oauth2-login-to-wekan
|
||||
- Nextcloud https://github.com/wekan/wekan/wiki/Nextcloud
|
||||
- ADFS 4.0 using OAuth2 and OpenID https://github.com/wekan/wekan/wiki/ADFS
|
||||
- Azure https://github.com/wekan/wekan/wiki/Azure
|
||||
- Keycloak https://github.com/wekan/wekan/wiki/Keycloak
|
||||
- Google login https://github.com/wekan/wekan/wiki/Google-login
|
||||
- Custom LDAP
|
||||
- LDAP https://github.com/wekan/wekan/wiki/LDAP
|
||||
- LDAP AD Simple Auth https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth
|
||||
- Default board for users https://github.com/wekan/wekan/pull/5098
|
||||
- Brute Force Accounts Lockout https://github.com/wekan/wekan/wiki/Accounts-Lockout
|
||||
- Markdown, Emoji, MathML, sanitizing https://github.com/wekan/wekan/blob/main/packages/markdown/src/template-integration.js
|
||||
- Many security fixes from Responsible Disclosure https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Upcoming Features
|
||||
|
||||
- CAS https://github.com/wekan/wekan/wiki/CAS
|
||||
- SAML https://github.com/wekan/wekan/wiki/SAML
|
||||
|
||||
## Video
|
||||
|
||||
- Creator of WeKan, mquandalle (Maxime Quandalle) https://www.youtube.com/watch?v=N3iMLwCNOro
|
||||
- https://github.com/wekan/wekan/wiki/FAQ#what-was-wekan-fork--wefork
|
||||
- Maintainer of WeKan since December 2016, xet7 (Lauri Ojansivu), about WeKan Multiverse at EU NGI Dapsi https://www.youtube.com/watch?v=BPPjiZHVeyM . More about Multiverse at https://github.com/wekan/wekan/wiki/WeKan-Multiverse-Roadmap
|
||||
|
||||
## Maybe?
|
||||
|
||||
- https://github.com/frozeman/meteor-persistent-minimongo2
|
||||
|
||||
## Upcoming upgrades to Meteor 3.0
|
||||
|
||||
- This Week in MeteorJS: 22 September 2023 https://www.youtube.com/watch?v=UWVL1xUP9r0
|
||||
- There Jan Dvorak IV https://github.com/StorytellerCZ commented chat: "We should do deep dive into WeKan!"
|
||||
- So here is The Deep Dive!
|
||||
- Questions for upcoming "This Week in MeteorJS", some already mentioned to be upcoming:
|
||||
- How to upgrade dependencies to Meteor 3.0 ? Some answer was to mention Meteor version at package dependency:
|
||||
<img src="https://wekan.github.io/upgrade-meteor3-new.png" width="100%" alt="Meteor 3.0 upgrading dependencies" />
|
||||
- But what if adding dependency adds some more error messages? Probably that depends on error message, like here when
|
||||
trying to upgrade to Meteor 3.0 alpha 15: https://github.com/wekan/wekan/issues/5142
|
||||
- https://forums.meteor.com/t/my-journey-towards-meteor-3-0/60001/23
|
||||
- https://github.com/bratelefant/Meteor-Files
|
||||
- https://github.com/bratelefant/meteor-roles
|
||||
- https://github.com/bratelefant/meteor-multitenancy
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
## 1) Move board to Archive
|
||||
|
||||
<img src="https://wekan.github.io/boards/delete-board-part1.png" width="60%" alt="Move board to Archive" />
|
||||
|
||||
## 2) All Boards => Archive => Delete Board
|
||||
|
||||
<img src="https://wekan.github.io/boards/delete-board-part2.png" width="60%" alt="Delete Board from Archive" />
|
||||
@@ -0,0 +1,23 @@
|
||||
## WeKan Design Principles
|
||||
|
||||
- Prevent messing up something https://github.com/wekan/wekan/wiki/Monkey-Proof-Software
|
||||
- Original WeKan Design, that WeKan currently has: Intuitive, easy to figure out, polished UI/UX, menu options are there where you would expect then to be. Try to fix anything unexpected. New features added there where it makes most sense. And not so many duplicate menus and texts like Trello.
|
||||
- Not the exact design of Trello https://github.com/wekan/wekan/wiki/FAQ#why-does-wekan-look-so-different-now-compared-to--v09 . Also not the exact design of any other software. But note that design of all software changes often, when they are in active development.
|
||||
- Some features like Trello:
|
||||
- Import from Trello
|
||||
- Shortcuts https://github.com/wekan/wekan/issues/1878
|
||||
- IFTTT Rules like Trello Butler https://github.com/wekan/wekan/wiki/IFTTT
|
||||
- Progress bar of checklist
|
||||
- Some features like Jira:
|
||||
- Multiple assignees
|
||||
- Some features not in Trello, like:
|
||||
- FOSS with MIT license
|
||||
- Self-hosting
|
||||
- Swimlanes
|
||||
- All the use cases of WeKan feature/fix contributors
|
||||
- Cross-platform. Support many CPU/OS/Browsers for Desktop and Mobile. Add support for more.
|
||||
- https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
- https://github.com/wekan/wekan/wiki/PWA
|
||||
- https://github.com/wekan/wekan/wiki/Offline
|
||||
- https://github.com/wekan/wekan/wiki/Mac
|
||||
- https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
@@ -0,0 +1,106 @@
|
||||
# Style guide
|
||||
|
||||
We follow the [meteor style guide](https://guide.meteor.com/code-style.html#javascript).
|
||||
|
||||
Please read the meteor style guide before making any significant contribution.
|
||||
|
||||
# Stories about how Wekan works, and developing Wekan
|
||||
|
||||
- https://www.mongodb.com/docs/drivers/node/v3.7/fundamentals/promises/
|
||||
- [Do not use code formatters like Prettier and ESLint](https://github.com/wekan/wekan/pull/4633#issuecomment-1214214591)
|
||||
- [How realtime board updates work](https://github.com/wekan/wekan/issues/3788#issuecomment-834649553)
|
||||
- [Mobile Web interface](https://github.com/wekan/wekan/issues/3566#issuecomment-778700604)
|
||||
- [How to add RTL support](https://github.com/wekan/wekan/issues/3376#issuecomment-766092425)
|
||||
- [How to code Part 1](https://blog.wekan.team/2019/04/howto-code-part-1-learning-to-learn/)
|
||||
- [First time Wekan contributor easily figures out Wekan and develops big features](https://blog.wekan.team/2018/05/wekan-v1-00-released/)
|
||||
- [Benefits of contributing your features to upstream Wekan](https://blog.wekan.team/2018/02/benefits-of-contributing-your-features-to-upstream-wekan/)
|
||||
- [Excellent example how pull requests are improved and integrated, and not needed commits removed](https://github.com/wekan/wekan/pull/1470)
|
||||
- [How to add dependency](https://github.com/wekan/wekan/discussions/5235)
|
||||
- [How to add set default view feature](https://github.com/wekan/wekan/discussions/5233)
|
||||
- [Adding SVG image](https://github.com/wekan/wekan/discussions/5211#discussioncomment-7765365)
|
||||
|
||||
## Building code and submitting pull request
|
||||
|
||||
- [Building code and submitting pull request](emoji#how-you-could-add-another-plugin)
|
||||
- When you start `meteor` command, it watches for changes to files in wekan directory and subdirectories, and if it detects changed code, it starts rebuilding bundle and then reloads webbrowser after that automatically
|
||||
- Also look at meteor changelog mentioned new feature `hot reload` how that could make reloading faster
|
||||
|
||||
## VSCode / VSCodium
|
||||
|
||||
- I use [VSCodium](https://vscodium.com) that has MS tracking code removed
|
||||
- Plugin Prettier for right click format javascript code with prettier
|
||||
- There could be other plugins for Meteor, Jade, Stylus, Dockerfile, etc
|
||||
|
||||
## Finding code
|
||||
|
||||
There is find.sh script that ignores generated directories, finds code in subdirectories, and paginates with less. For example, finding how search cards is implemented:
|
||||
```
|
||||
cd wekan
|
||||
./find.sh js-search
|
||||
```
|
||||
When you run this, you see .jade template files where is search input box, and .js files where is the search code. CSS is in .styl files.
|
||||
|
||||
## Getting Started
|
||||
|
||||
- Currently Wekan development is done mainly at Ubuntu 20.10 64bit, but building Wekan does work on any Debian, Ubuntu, WSL Ubuntu 20.04, [Mac](Mac). Sametime maybe on [Windows](Windows) with `choco install -y meteor` and installing packages it then asks for with `meteor add ...` or `meteor npm install --save ...` and then running meteor again.
|
||||
- Look through old [pull requests](https://github.com/wekan/wekan/pulls)
|
||||
- Read Wekan source code, you can use some git history viewer GUI like gitk
|
||||
- Read [Meteor documentation](https://docs.meteor.com/) for [Meteor version](https://github.com/wekan/wekan/blob/main/.meteor/release) in use, other versions mentioned at [Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile)
|
||||
- Docker up-to-date way: You can clone wekan/wekan repo and update docker-compose.yml file ROOT_URL etc as documented at https://github.com/wekan/wekan-mongodb commented docker-compose.yml file, install docker, and build from source with docker with "docker-compose up -d --build"
|
||||
- Docker not up-to-date way: [Docker environment for Wekan development](https://github.com/wekan/wekan-dev).
|
||||
|
||||
## Pull Request Workflow (Please read before submitting PR's)
|
||||
|
||||
- If package is available on meteor https://atmospherejs.com `meteor add packagename` or https://www.npmjs.com `meteor npm install packagename` then it's enough to add package that way, and there is no need to clone repo in [rebuild-wekan.sh](https://github.com/wekan/wekan-maintainer/tree/master/releases) script.
|
||||
- When doing pull requests, only add additions and changes to English at wekan/i18n/en.i18n.json . Other translations are done at [https://app.transifex.com/wekan/](https://app.transifex.com/wekan/).
|
||||
- If you have fix to some existing pull request, add your fix as comment. Do not post new pull request.
|
||||
- For new features add new pull request, if there is none already.
|
||||
- remove all console.log statements
|
||||
- [Here is how to remove commits from pull request](https://stackoverflow.com/questions/36168839/how-to-remove-commits-from-pull-request)
|
||||
|
||||
## Preventing Travis CI lint errors before submitting pull requests
|
||||
|
||||
- NOTE: Travis is currently broken and always shows warnings and errors like variables not defined or not used, so if your code works, ignore Travis.
|
||||
- Eslint for linting. To prevent Travis CI lint errors, you can test for lint errors by installing `npm install eslint` and running it with `npm run lint` and trying automatic fixing with `eslint --fix filename.js`
|
||||
- There is also probably not-currently-working as of 2018-05-05 [jsbeautifer website](http://jsbeautifier.org) with settings Indent with 2 spaces (topmost dropdown), [X] Space before conditional: "if(x)" / "if (x)", [X] Use JSLint-happy formatting tweaks.
|
||||
|
||||
## Choosing issues to work on
|
||||
|
||||
- You are free to select what feature to work on.
|
||||
- Leave a comment on an issue saying that you're working on it, and give updates as needed.
|
||||
- Work and concentrate on one issue at a time and finish it, before moving to other issue.
|
||||
- Keep list of your contributions on your personal website.
|
||||
- Keep track of time it takes to implement each part of a feature, so you can estimate what time it would take to implement similar feature. After implementing feature, review your estimate was it correct, make improvements to your process and estimates, also keeping enough time allocated in estimate if something is harder to implement. Employers look for coders with proven track record.
|
||||
- You can ask for comments from others, but usually those feature requests are clearly defined how they should work. You can place those Settings options there where it seems most logical for you.
|
||||
|
||||
Main point is to be friendly to those commenting of your code, and incorporate those suggestions that make most sense.
|
||||
|
||||
# Build Pipeline
|
||||
|
||||
- Templates are written in [JADE](https://naltatis.github.io/jade-syntax-docs/) instead of plain HTML. Also see [HTML to JADE converter](http://html2jade.org/).
|
||||
- CSS is written in the [Stylus](http://stylus-lang.com/) precompiler - see [Stylus to CSS converter](https://mikethedj4.github.io/Stylus2CSS/), and
|
||||
- Meteor templates are created as BlazeLayout templates.
|
||||
- Instead of the allow/deny paradigm a lot of the `collections` defined in the project use `mutations` to define what kinds of operations are allowed.
|
||||
|
||||
For further details look for the 'feature summaries' in the Wiki (still in progress) otherwise go through the git history and see how old features were built. Might I suggest the Start and Due date feature [wefork#26](https://github.com/wefork/wekan/pull/26)
|
||||
|
||||
# Translations
|
||||
|
||||
If adding new features, please also support the internationalization features built in. Refer to the [[Translations]] wiki page.
|
||||
|
||||
# Export From Trello
|
||||
|
||||
It's possible to import your existing boards from Trello. Instructions [[here|migrating-from-trello]]
|
||||
|
||||
# Directory Structure Details
|
||||
|
||||
[Directory Structure](Directory-Structure)
|
||||
|
||||
# Chat
|
||||
|
||||
[![Wekan chat][vanila_badge]][vanila_chat]
|
||||
|
||||
|
||||
[rocket_chat]: https://chat.indie.host/channel/wekan
|
||||
[vanila_badge]: https://vanila.io/img/join-chat-button2.png
|
||||
[vanila_chat]: https://community.vanila.io/wekan
|
||||
@@ -0,0 +1,187 @@
|
||||
# Routing
|
||||
|
||||
We're using [FlowRouter](https://github.com/kadirahq/flow-router) client side router inside **[config/router.js](https://github.com/wekan/wekan/tree/main/config/router.js)**.
|
||||
For accounts there is [AccountsTemplates](https://github.com/meteor-useraccounts) configured in **[config/accounts.js](https://github.com/wekan/wekan/tree/main/config/accounts.js)**.
|
||||
|
||||
# Client
|
||||
|
||||
## public
|
||||
|
||||
Files in this directory are served by meteor as-is to the client. It hosts some (fav)icons and fonts.
|
||||
**[wekan-manifest.json](https://github.com/wekan/wekan/tree/main/wekan-manifest.json)**: goes into `link rel="manifest"` in the header of the generated page and is a [Web App Manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest).
|
||||
|
||||
## components
|
||||
|
||||
* **[activities](https://github.com/wekan/wekan/tree/main/client/components/activities)**:
|
||||
* **[activities.jade](https://github.com/wekan/wekan/tree/main/client/components/activities/activities.jade)**: `activities` template for the list of activities placed inside a `sidebar-content`; uses `boardActivities` or `cardActivities` depending on `mode`; <span style="color:red">*XXX: does this mean that sidebar should be visible in board list mode? when does the `board` activity gets shown?*</span>
|
||||
* **[comments.jade](https://github.com/wekan/wekan/tree/main/client/components/activities/comments.jade)**: `commentForm` template used in `card-details-canvas` for adding comments;
|
||||
* **[boards](https://github.com/wekan/wekan/tree/main/client/components/boards)**:
|
||||
* **[boardArchive.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardArchive.jade)**: `archivedBoards` template for the modal dialog showing the list of archived boards that might be restored;
|
||||
* **[boardBody.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardBody.jade)**: top level template for presenting a board is `board` and, based on screen size and current state, it uses either `cardDetails` or `boardBody` templates; `boardBody` is the one including the `sidebar`, each `list`, `cardDetails` for larger screens when a card is selected and the `addListForm` for adding a new list (also defined in this file);
|
||||
* **[boardHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardHeader.jade)**: `boardHeaderBar`, `boardMenuPopup`, `boardVisibilityList`, `boardChangeVisibilityPopup`, `boardChangeWatchPopup`, `boardChangeColorPopup`, `createBoard`, `chooseBoardSource`, `boardChangeTitlePopup`, `archiveBoardPopup`, `outgoingWebhooksPopup`;
|
||||
* **[boardsList.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardsList.jade)**: `boardList` and `boardListHeaderBar` for the list of boards in the initial screen;
|
||||
* **[cards](https://github.com/wekan/wekan/tree/main/client/components/cards)**:
|
||||
* **[attachments.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/attachments.jade)**: `cardAttachmentsPopup`, `previewClipboardImagePopup`, `previewAttachedImagePopup`, `attachmentDeletePopup`, `attachmentsGalery`;
|
||||
* **[cardDate.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardDate.jade)**: `editCardDate` and `dateBadge` templates;
|
||||
* **[cardDetails.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardDetails.jade)**: `boardsAndLists` is the usual layout for a board display with `boardLists` being used in sandstorm where each board is independent;`cardDetails`, `editCardTitleForm`, `cardDetailsActionsPopup`, `moveCardPopup`, `copyCardPopup`,`cardMembersPopup`,`cardMorePopup`, `cardDeletePopup`;
|
||||
* **[cardTime.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardTime.jade)**: `editCardSpentTime` and `timeBadge` templates;
|
||||
* **[checklists.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/checklists.jade)**: `checklists`, `checklistDetail`, `checklistDeleteDialog`, `addChecklistItemForm`, `editChecklistItemForm`, `checklistItems`, `itemDetail`;
|
||||
* **[labels.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/labels.jade)**: `formLabel`, `createLabelPopup`, `editLabelPopup`, `deleteLabelPopup`, `cardLabelsPopup`;
|
||||
* **[minicard.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/minicard.jade)**: has the `minicard` template
|
||||
* **[forms](https://github.com/wekan/wekan/tree/main/client/components/forms)**: **[inlinedform.jade](https://github.com/wekan/wekan/tree/main/client/components/forms/inlinedform.jade)** has the`inlinedForm` template;
|
||||
* **[import](https://github.com/wekan/wekan/tree/main/client/components/import)**:
|
||||
* **[import.jade](https://github.com/wekan/wekan/tree/main/client/components/import/import.jade)**: `importHeaderBar`, `import`, `importTextarea`, `importMapMembers`, `importMapMembersAddPopup` are all templates used for importing Trello (via **[trelloMembersMapper.js](https://github.com/wekan/wekan/tree/main/client/components/import/trelloMembersMapper.js)**) and Wekan (via **[wekanMembersMapper.js](https://github.com/wekan/wekan/tree/main/client/components/import/wekanMembersMapper.js)**) boards;
|
||||
* **[lists](https://github.com/wekan/wekan/tree/main/client/components/lists)**:
|
||||
* **[list.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/list.jade)**: `list` is the simple, main template for lists;
|
||||
* **[listBody.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/listBody.jade)**: `listBody`, `addCardForm`, `autocompleteLabelLine` templates;
|
||||
* **[listHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/listHeader.jade)**: `listHeader`, `editListTitleForm`, `listActionPopup`, `boardLists`, `listMorePopup`, `listDeletePopup`, `setWipLimitPopup`, `wipLimitErrorPopup` templates;
|
||||
* **[main](https://github.com/wekan/wekan/tree/main/client/components/main)**:
|
||||
* **[editor.jade](https://github.com/wekan/wekan/tree/main/client/components/main/editor.jade)**: `editor` and `viewer` templates;
|
||||
* **[header.jade](https://github.com/wekan/wekan/tree/main/client/components/main/header.jade)**: `header` and `offlineWarning` templates; if the user is connected we display a small "quick-access" top bar that list all starred boards with a link to go there (this is inspired by the Reddit "subreddit" bar); the first link goes to the boards page;
|
||||
* **[keyboardShortcuts.jade](https://github.com/wekan/wekan/tree/main/client/components/main/keyboardShortcuts.jade)**: `shortcutsHeaderBar`, `shortcutsModalTitle`, `keyboardShortcuts` - all for the shortcuts that are presented when you press `?`re implemented inhere;
|
||||
* **[layouts.jade](https://github.com/wekan/wekan/tree/main/client/components/main/layouts.jade)**: has the template for head portion of the html page and other general purpose templates: `userFormsLayout`, `defaultLayout`, `notFound`, `message`;
|
||||
* **[popup.tpl.jade](https://github.com/wekan/wekan/tree/main/client/components/main/popup.tpl.jade)**: tpl files only define a single template so there's no need to wrap content in a template tag; the name of the template is the base name of the file (`popup` in this case);
|
||||
* **[spinner.tpl.jade](https://github.com/wekan/wekan/tree/main/client/components/main/spinner.tpl.jade)**: is the template for a "waiting" dialog;
|
||||
* **[settings](https://github.com/wekan/wekan/tree/main/client/components/settings)**:
|
||||
* **[informationBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/informationBody.jade)**: `information`, `statistics` templates;
|
||||
* **[invitationCode.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/invitationCode.jade)**: `invitationCode` template;
|
||||
* **[peopleBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/peopleBody.jade)**: `people`, `peopleGeneral`, `peopleRow`, `editUserPopup`;
|
||||
* **[settingBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/settingBody.jade)**: `setting`, `general`, `email`, `accountSettings`, `announcementSettings`
|
||||
* **[settingHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/settingHeader.jade)**: `settingHeaderBar` template;
|
||||
* **[sidebar](https://github.com/wekan/wekan/tree/main/client/components/sidebar)**:
|
||||
* **[sidebar.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebar.jade)**: `sidebar`, `homeSidebar`, `membersWidget`, `labelsWidget`, `memberPopup`, `removeMemberPopup`, `leaveBoardPopup`, `addMemberPopup`, `changePermissionsPopup`
|
||||
* **[sidebarArchives.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebarArchives.jade)**: `archivesSidebar`
|
||||
* **[sidebarFilters.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebarFilters.jade)**: `filterSidebar`, `multiselectionSidebar`, `disambiguateMultiLabelPopup`, `disambiguateMultiMemberPopup`, `moveSelectionPopup`;
|
||||
* **[users](https://github.com/wekan/wekan/tree/main/client/components/users)**:
|
||||
* **[userAvatar.jade](https://github.com/wekan/wekan/tree/main/client/components/users/userAvatar.jade)**: `userAvatar`, `userAvatarInitials`, `userPopup`, `memberName`, `changeAvatarPopup`, `cardMemberPopup`
|
||||
* **[userHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/users/userHeader.jade)**: `headerUserBar`, `memberMenuPopup`, `editProfilePopup`, `editNotificationPopup`, `changePasswordPopup`, `changeLanguagePopup`, `changeSettingsPopup`;
|
||||
* **[mixins](https://github.com/wekan/wekan/tree/main/client/components/mixins)**: [extends](http://www.meteorpedia.com/read/Infinite_Scrolling) **[infiniteScrolling.js](https://github.com/wekan/wekan/tree/main/client/components/mixins/infiniteScrolling.js)** for card details, sidebar and also extends **[perfectScrollbar.js](https://github.com/wekan/wekan/tree/main/client/components/mixins/perfectScrollbar.js)**;
|
||||
|
||||
## config
|
||||
|
||||
* **[blazeHelpers.js](https://github.com/wekan/wekan/tree/main/client/config/blazeHelpers.js)**: following [Blaze](http://blazejs.org/) helpers are registered here:`currentBoard()`, `currentCard()`, `getUser()` and `concat()`;
|
||||
* **[gecko-fix.js](https://github.com/wekan/wekan/tree/main/client/config/gecko-fix.js)**: removes [deprecated](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch)`watch` and `unwatch` from Firefox prior to version 58;
|
||||
* **[presence.js](https://github.com/wekan/wekan/tree/main/client/config/presence.js)**: custom state function for [Presence](https://github.com/dburles/meteor-presence) that keeps track of current board;
|
||||
* **[reactiveTabs.js](https://github.com/wekan/wekan/tree/main/client/config/reactiveTabs.js)**: [ReactiveTabs](https://github.com/meteortemplates/tabs) are configured to use `basicTabs` template.
|
||||
|
||||
## lib
|
||||
|
||||
* **[accessibility.js](https://github.com/wekan/wekan/tree/main/client/lib/accessibility.js)**: define a set of DOM transformations that are specifically intended for blind screen readers;
|
||||
* **[cssEvents.js](https://github.com/wekan/wekan/tree/main/client/lib/cssEvents.js)**: the `CSSEvents`object has methods that select the name of the event based on the specific transitions and animations;
|
||||
* **[pasteImage.js](https://github.com/wekan/wekan/tree/main/client/lib/pasteImage.js)** and **[dropImage.js](https://github.com/wekan/wekan/tree/main/client/lib/dropImage.js)**: utility for pasting and dropping images on a web app; <span style="color:red">*XXX: add comments; not same style as the rest of the code*</span>
|
||||
* **[emoji-values.js](https://github.com/wekan/wekan/tree/main/client/lib/emoji-values.js)**: sets Emoji.values;
|
||||
* **[escapeActions.js](https://github.com/wekan/wekan/tree/main/client/lib/escapeActions.js)**: defines the behavior (mostly canceling current edit) for escape keyboard key;
|
||||
* **[i18n.js](https://github.com/wekan/wekan/tree/main/client/lib/i18n.js)**: at startup we choose the language for the ui based on user profile or browser language;
|
||||
* **[inlinedform.js](https://github.com/wekan/wekan/tree/main/client/lib/inlinedform.js)**: forms for editing a single field (like adding a card); <span style="color:red">*XXX: comments in code suggest that a form that is not submitted will retain its value to prevent data loss using [unsavedEdits.js](https://github.com/wekan/wekan/tree/main/client/lib/unsavedEdits.js);bug?*</span>; <span style="color:red">*XXX: edit button to save and open*</span>;
|
||||
* **[keyboard.js](https://github.com/wekan/wekan/tree/main/client/lib/keyboard.js)**: the shortcuts that are presented when you press `?`re implemented inhere;
|
||||
* **[mixins.js](https://github.com/wekan/wekan/tree/main/client/lib/mixins.js)**: stub; no `Mixins` at this point; <span style="color:red">*XXX: what does `new class` do? exlint: missing () invoking a constructor*</span>
|
||||
* **[popup.js](https://github.com/wekan/wekan/tree/main/client/lib/popup.js)**: defines `Popup` class for things likes electing a date; <span style="color:red">*XXX: not a Blaze helper?*</span>
|
||||
* **[textComplete.js](https://github.com/wekan/wekan/tree/main/client/lib/textComplete.js)**: extends [jquery-textcomplete](https://yuku-t.com/jquery-textcomplete/) to integrate with the rest of the system (like escape actions, tab and enter key handling); <span style="color:red">*XXX: deprecated?*</span>
|
||||
* **[utils.js](https://github.com/wekan/wekan/tree/main/client/lib/utils.js)**: various methods all over the place (resize, screen size, sort, capitalize, navigate to board and card);
|
||||
* **Blaze helpers**:
|
||||
* **[filter.js](https://github.com/wekan/wekan/tree/main/client/lib/filter.js)**: registers `Filter` [Blaze](http://blazejs.org/) helper to support filtering cards by labels and by members;
|
||||
* **[modal.js](https://github.com/wekan/wekan/tree/main/client/lib/modal.js)**: registers `Modal` [Blaze](http://blazejs.org/) helper to support showing modal windows like the one for archived boards;
|
||||
* **[multiSelection.js](https://github.com/wekan/wekan/tree/main/client/lib/multiSelection.js)**: registers `Modal` [Blaze](http://blazejs.org/) helper to support multiple selection mode;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/client/lib/unsavedEdits.js)**: registers `getUnsavedValue` and `hasUnsavedValue` [Blaze](http://blazejs.org/) helpers to preserve content entered in fields but not saved;
|
||||
|
||||
# Server
|
||||
|
||||
.js files in this directory are not available to the client.
|
||||
|
||||
* **[statistics.js](https://github.com/wekan/wekan/tree/main/server/statistics.js)** implements a Meteor server-only [method](https://guide.meteor.com/methods.html) for general-purpose information such as OS, memory, CPUs, PID of the process and so on.
|
||||
* **[migrations.js](https://github.com/wekan/wekan/tree/main/server/migrations.js)** is where code that update sold databases to new schema is located. Anytime the schema of one of the collection changes in a non-backward compatible way a migration needs to be written in this file.
|
||||
* **[authentication.js](https://github.com/wekan/wekan/tree/main/server/authentication.js)** add the `Authentication`object to Meteor that provides methods for checking access rights.
|
||||
* **[lib/utils.js](https://github.com/wekan/wekan/tree/main/server/lib/utils.js)** defines some checks used by [checklists.js](https://github.com/wekan/wekan/tree/main/models/checklists.js)** model. <span style="color:red">*XXX: these methods are defined in server-only code by are used in models, which are visible by the client (in Checklists.allow)?*</span>
|
||||
* **[notifications](https://github.com/wekan/wekan/tree/main/server/notifications)**
|
||||
* **[notifications.js](https://github.com/wekan/wekan/tree/main/server/notifications/notifications.js)**: defines the `Notifications` object that supports [Activities](models/activities.js) and holds a list of functions to call when its `notify()` method is called along with convenience methods to subscribe, unsubscribe and a way to filter recipients according to user settings for notification;
|
||||
* **[email.js](https://github.com/wekan/wekan/tree/main/server/notifications/email.js)**: makes use of the notification system to send an email to a user;
|
||||
* **[profile.js](https://github.com/wekan/wekan/tree/main/server/notifications/profile.js)**: *stub*; will allow associating notifications with user ids to be consumed by mobile apps;
|
||||
* **[notifications.js](https://github.com/wekan/wekan/tree/main/server/notifications/notifications.js)**: adds the `watch()` Meteor server-only [method](https://guide.meteor.com/methods.html) that may watch boards, lists or cards using [models/watchable.js](https://github.com/wekan/wekan/tree/main/models/watchable.js);
|
||||
* **[outgoing.js](https://github.com/wekan/wekan/tree/main/server/notifications/outgoing.js)**: adds the `outgoingWebhooks()` Meteor server-only [method](https://guide.meteor.com/methods.html) that can call external API <span style="color:red">*XXX: I guess*</span>
|
||||
* **[publications](https://github.com/wekan/wekan/tree/main/server/publications)** defines sets of records that are [published](https://docs.meteor.com/api/pubsub.html#Meteor-publish) by the server and how clients can subscribe to those:
|
||||
* **[accountSettings.js](https://github.com/wekan/wekan/tree/main/server/publications/accountSettings.js)**: [AccountSettings](models/accountSettings.js) collection;
|
||||
* **[activities.js](https://github.com/wekan/wekan/tree/main/server/publications/activities.js)**: [Activities](models/activities.js) collection filtered and paginated;
|
||||
* **[announcements.js](https://github.com/wekan/wekan/tree/main/server/publications/announcements.js)**: [Announcements](models/announcements.js) collection;
|
||||
* **[avatars.js](https://github.com/wekan/wekan/tree/main/server/publications/avatars.js)**: [Avatars](models/avatars.js) collection for current user;
|
||||
* **[boards.js](https://github.com/wekan/wekan/tree/main/server/publications/boards.js)**: [Boards](models/boards.js) collection for current user, archived boards collection and individual board as a [relation](https://atmospherejs.com/cottz/publish-relations);
|
||||
* **[cards.js](https://github.com/wekan/wekan/tree/main/server/publications/cards.js)**: a [Card](https://github.com/wekan/wekan/tree/main/models/cards.js) by its id;
|
||||
* **[fast-render.js](https://github.com/wekan/wekan/tree/main/server/publications/fast-render.js)**: configures [FastRender](https://github.com/kadirahq/fast-render) to use the board data; <span style="color:red">*XXX: FastRender docs say "Make sure you're using Meteor.subscribe and not this.subscribe"*</span>
|
||||
* **[people.js](https://github.com/wekan/wekan/tree/main/server/publications/people.js)**: [Users](models/users.js) collection;
|
||||
* **[settings.js](https://github.com/wekan/wekan/tree/main/server/publications/settings.js)**: [Settings](models/settings.js) collection and, separately, the mail server;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/server/publications/unsavedEdits.js)**: [UnsavedEdits](models/unsavedEdits.js) collection;
|
||||
* **[users.js](https://github.com/wekan/wekan/tree/main/server/publications/users.js)**: provides a "mini-profile" for individual users and a [way](https://docs.meteor.com/api/collections.html#fieldspecifiers) to check if current user is admin.
|
||||
|
||||
# Models
|
||||
|
||||
The files in **[models](https://github.com/wekan/wekan/tree/main/models)** directory mainly define collections; most of them have [aldeed SimpleSchema](https://atmospherejs.com/aldeed/simple-schema) for automatic validation of insert and update of collections. This is also where helpers, mutations, methods, hooks and bootstrap code is to be found. [Server side code](https://docs.meteor.com/api/core.html#Meteor-isServer) also implements json REST API.
|
||||
|
||||
Collections (mostly `Mongo.Collection` except as noted) are defined in:
|
||||
* **[accountSettings.js](https://github.com/wekan/wekan/tree/main/models/accountSettings.js)**;
|
||||
* **[activities.js](https://github.com/wekan/wekan/tree/main/models/activities.js)**: does not have a SimpleSchema;
|
||||
* **[announcements.js](https://github.com/wekan/wekan/tree/main/models/announcements.js)**;
|
||||
* **[attachments.js](https://github.com/wekan/wekan/tree/main/models/attachments.js)**: file-system collection;
|
||||
* **[avatars.js](https://github.com/wekan/wekan/tree/main/models/avatars.js)**: file-system collection;
|
||||
* **[boards.js](https://github.com/wekan/wekan/tree/main/models/boards.js)**;
|
||||
* **[cardComments.js](https://github.com/wekan/wekan/tree/main/models/cardComments.js)**;
|
||||
* **[cards.js](https://github.com/wekan/wekan/tree/main/models/cards.js)**;
|
||||
* **[checklists.js](https://github.com/wekan/wekan/tree/main/models/checklists.js)**;
|
||||
* **[integrations.js](https://github.com/wekan/wekan/tree/main/models/integrations.js)**;
|
||||
* **[invitationCodes.js](https://github.com/wekan/wekan/tree/main/models/invitationCodes.js)**;
|
||||
* **[lists.js](https://github.com/wekan/wekan/tree/main/models/lists.js)**;
|
||||
* **[settings.js](https://github.com/wekan/wekan/tree/main/models/settings.js)**;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/models/unsavedEdits.js)**;
|
||||
* **[users.js](https://github.com/wekan/wekan/tree/main/models/users.js)**: extends the `Meteor.users` collection.
|
||||
|
||||
Other files:
|
||||
* **[watchable.js](https://github.com/wekan/wekan/tree/main/models/watchable.js)**: extends the schema, helpers and mutations of `Boards`, `Lists` and `Cards`.
|
||||
* **[export.js](https://github.com/wekan/wekan/tree/main/models/export.js)**: has some code to support the REST API.
|
||||
* **[import.js](https://github.com/wekan/wekan/tree/main/models/import.js)**: implements `importBoard()` method so that Trello (in **[trelloCreator.js](https://github.com/wekan/wekan/tree/main/models/trelloCreator.js)**) and Wekan (in **[wekanCreator.js](https://github.com/wekan/wekan/tree/main/models/wekanCreator.js)**) boards can be imported. <span style="color:red">*XXX: Solid candidates for a directory of their own.*</span>
|
||||
|
||||
# Tools
|
||||
|
||||
* Git:
|
||||
* **.git**;
|
||||
* **[.gitignore](https://github.com/wekan/wekan/tree/main/.gitignore)**;
|
||||
* Docker:
|
||||
* **[docker-compose.yml](https://github.com/wekan/wekan/tree/main/docker-compose.yml)**: the compose file is a YAML file defining services, networks and volumes;
|
||||
* **[Dockerfile](https://github.com/wekan/wekan/tree/main/Dockerfile)**;
|
||||
* Snap:
|
||||
* **[snapcraft.yaml](https://github.com/wekan/wekan/tree/main/snapcraft.yaml)**: [Snapcraft](https://snapcraft.io/) packages any app for every Linux desktop, server, cloud or device, and deliver updates directly;
|
||||
* **[snap](https://github.com/wekan/wekan/tree/main/snap)**;
|
||||
* **[snap-src](https://github.com/wekan/wekan/tree/main/snap-src)**;
|
||||
* Sandstorm:
|
||||
* **[sandstorm.js](https://github.com/wekan/wekan/tree/main/sandstorm.js)**: [Sandstorm](https://sandstorm.io/) specific code;
|
||||
* **[sandstorm-pkgdef.capnp](https://github.com/wekan/wekan/tree/main/sandstorm-pkgdef.capnp)**: used the meteor-spk tool to generate a sandstorm package;
|
||||
* Node:
|
||||
* **[package.json](https://github.com/wekan/wekan/tree/main/package.json)**;
|
||||
* **node_modules**
|
||||
* **[app.json](https://github.com/wekan/wekan/tree/main/app.json)**: is a manifest format for describing web apps (build requirements, environment variables, addons, and other information);
|
||||
* **[app.env](https://github.com/wekan/wekan/tree/main/app.env)**: environment variables;
|
||||
* Meteor: is a full-stack JavaScript platform for developing modern web and mobile applications.
|
||||
* **[.meteor](https://github.com/wekan/wekan/tree/main/.meteor)**;
|
||||
* Translation:
|
||||
* **[i18n](https://github.com/wekan/wekan/tree/main/i18n)** directory has one .json file for each supported language
|
||||
* **[.tx](https://github.com/wekan/wekan/tree/main/.tx)**: configuration for [Transifex](https://app.transifex.com/wekan/) tool used to manage translation;
|
||||
* Text editors:
|
||||
* **[.vscode](https://github.com/wekan/wekan/tree/main/.vscode)**: [Visual Studio Code Editor](https://code.visualstudio.com/docs/getstarted/settings);
|
||||
* **[.editorconfig](https://github.com/wekan/wekan/tree/main/.editorconfig)**: [EditorConfig](http://EditorConfig.org) provides consistent coding styles between different editors and IDEs;
|
||||
* **[.github](https://github.com/wekan/wekan/tree/main/.github)**: hosts the issues template;
|
||||
* **[.eslintrc.json](https://github.com/wekan/wekan/tree/main/.eslintrc.json)**: [ESLint](https://eslint.org/docs/user-guide/configuring) configuration;
|
||||
* **[.travis.yml](https://github.com/wekan/wekan/tree/main/.travis.yml)**: configuration for [Travis CI](https://travis-ci.org/);
|
||||
* **[scalingo.json](https://github.com/wekan/wekan/tree/main/scalingo.json)**: [Scalingo](https://scalingo.com/) is a deploy solution;
|
||||
* **[fix-download-unicode](https://github.com/wekan/wekan/tree/main/fix-download-unicode)**: `cfs_access-point.txt` from this folder is copied to `bundle/programs/server/packages/cfs_access-point.js` in Docker build and in snapcraft build; this is a monkey patch fix for [downloading files that have unicode in filename](https://github.com/wekan/wekan/issues/784).
|
||||
|
||||
# Info
|
||||
|
||||
* **[meta](https://github.com/wekan/wekan/tree/main/meta)**: binary signatures, project description, icons, screenshots and, oui, a French change-log;
|
||||
* **[CHANGELOG.md](https://github.com/wekan/wekan/tree/main/CHANGELOG.md)**;
|
||||
* **[Contributing.md](https://github.com/wekan/wekan/tree/main/Contributing.md)**;
|
||||
* **[LICENSE](https://github.com/wekan/wekan/tree/main/LICENSE)**;
|
||||
* **[README.md](https://github.com/wekan/wekan/tree/main/README.md)**.
|
||||
|
||||
---
|
||||
|
||||
# Contributions to this page
|
||||
|
||||
This documentation was contributed by [TNick](https://github.com/TNick) and [xet7](https://github.com/xet7) while Wekan was at commit [e2f768c](https://github.com/wekan/wekan/tree/e2f768c6a0f913b7c5f07695dce8cec692037255).
|
||||
Please add new files, fixes, updates, etc directly to this page.
|
||||
@@ -0,0 +1,242 @@
|
||||
## Docker Containers
|
||||
|
||||
- [GitHub](https://github.com/wekan/wekan/pkgs/container/wekan)
|
||||
- [Docker Hub](https://hub.docker.com/r/wekanteam/wekan)
|
||||
- [Quay](https://quay.io/repository/wekan/wekan)
|
||||
|
||||
docker-compose.yml at https://github.com/wekan/wekan
|
||||
|
||||
Edit it to have IP address of your server
|
||||
```
|
||||
export ROOT_URL=http://SERVER-IP-ADDRESS-HERE
|
||||
```
|
||||
Then start WeKan with:
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
SSL/TLS info at https://github.com/wekan/wekan/wiki/Settings
|
||||
|
||||
## Please only use Docker release tags
|
||||
|
||||
## Repair Docker
|
||||
|
||||
[Repair Docker](Repair-Docker)
|
||||
|
||||
## Using only Docker commands
|
||||
|
||||
[](https://quay.io/repository/wekan/wekan)
|
||||
|
||||
[Many tags available](https://quay.io/repository/wekan/wekan?tab=tags)
|
||||
|
||||
## Note: docker-compose.yml works
|
||||
|
||||
There is much more settings at well-documented [docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml), those can also be added to be used below.
|
||||
|
||||
If you don't need to build Wekan, use prebuilt container with docker-compose.yml from https://github.com/wekan/wekan like this:
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
If you like to build from source, clone Wekan repo:
|
||||
```
|
||||
git clone https://github.com/wekan/wekan
|
||||
```
|
||||
Then edit docker-compose.yml with [these lines uncommented](https://github.com/wekan/wekan/blob/main/docker-compose.yml#L132-L142) this way:
|
||||
```
|
||||
#-------------------------------------------------------------------------------------
|
||||
# ==== BUILD wekan-app DOCKER CONTAINER FROM SOURCE, if you uncomment these ====
|
||||
# ==== and use commands: docker-compose up -d --build
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- NODE_VERSION=${NODE_VERSION}
|
||||
- METEOR_RELEASE=${METEOR_RELEASE}
|
||||
- NPM_VERSION=${NPM_VERSION}
|
||||
- ARCHITECTURE=${ARCHITECTURE}
|
||||
- SRC_PATH=${SRC_PATH}
|
||||
- METEOR_EDGE=${METEOR_EDGE}
|
||||
- USE_EDGE=${USE_EDGE}
|
||||
#-------------------------------------------------------------------------------------
|
||||
```
|
||||
Then you can build Wekan with
|
||||
```
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
## Example for latest Wekan, port 2000 to Docker Wekan internal port 8080
|
||||
```
|
||||
docker run -d --restart=always --name wekan-db mongo:5
|
||||
|
||||
docker run -d --restart=always --name wekan --link "wekan-db:db" -e "WITH_API=true" -e "MONGO_URL=mongodb://wekan-db:27017/wekan" -e "ROOT_URL=http://192.168.1.200:2000" -p 2000:8080 wekanteam/wekan:v5.41
|
||||
```
|
||||
Specific release in above URL, not latest:
|
||||
```
|
||||
quay.io/wekan/wekan:v3.37
|
||||
```
|
||||
For latest development version, use without tag:
|
||||
```
|
||||
quay.io/wekan/wekan
|
||||
```
|
||||
|
||||
## DockerBunker: Easy Docker management
|
||||
|
||||
[Managing Docker containers with DockerBunker](https://github.com/chaosbunker/dockerbunker)
|
||||
|
||||
## CaptainDuckDuck
|
||||
|
||||
[Managing Docker containers with CaptainDuckDuck](https://github.com/wekan/wekan/issues/1375#issuecomment-413626075)
|
||||
|
||||
## Backup and Upgrade
|
||||
|
||||
[Import/Export MongoDB data to/from Docker container](Export-Docker-Mongo-Data)
|
||||
|
||||
[Move Docker containers to other computer](Move-Docker-containers-to-other-computer), needs more details
|
||||
|
||||
### Backup before upgrade
|
||||
```
|
||||
docker stop wekan-app
|
||||
docker exec -it wekan-db bash
|
||||
cd /data
|
||||
rm -rf dump
|
||||
mongodump
|
||||
exit
|
||||
docker start wekan-app
|
||||
docker cp wekan-db:/data/dump .
|
||||
```
|
||||
### Upgrade
|
||||
```
|
||||
docker stop wekan-app
|
||||
docker rm wekan-app
|
||||
```
|
||||
Then edit docker-compose.yml to have higher wekan-app image version tag, like `image: wekanteam/wekan:v4.12`. Then:
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
### Images
|
||||
Quay: `image: quay.io/wekan/wekan:v4.07`
|
||||
Docker Hub: `image: wekanteam/wekan:v4.07`
|
||||
|
||||
### Restore
|
||||
```
|
||||
docker stop wekan-app
|
||||
docker exec -it wekan-db bash
|
||||
cd /data
|
||||
rm -rf dump
|
||||
exit
|
||||
docker cp dump wekan-db:/data/
|
||||
docker exec -it wekan-db bash
|
||||
cd /data
|
||||
mongorestore --drop
|
||||
exit
|
||||
docker start wekan-app
|
||||
```
|
||||
## Cleanup
|
||||
|
||||
[Cleanup and delete all Docker data to get Docker Compose working](https://github.com/wekan/wekan/issues/985)
|
||||
|
||||
[Cleanup scripts to remove old data](https://github.com/wekan/wekan-cleanup)
|
||||
|
||||
## Docker Compose
|
||||
|
||||
[Docker Compose: Wekan <=> MongoDB](https://github.com/wekan/wekan-mongodb). REQUIRED: READ AND ADD SETTINGS LIKE ROOT_URL ETC TO docker-compose.yml textfile. It also has info about using same MongoDB database for office and VPN users.
|
||||
|
||||
[Docker Compose: Wekan <=> MongoDB <=> ToroDB => PostgreSQL read-only mirroring](https://github.com/wekan/wekan-postgresql)
|
||||
|
||||
TODO: [Docker Compose: Wekan <=> MongoDB <=> ToroDB => MySQL read-only mirroring](https://github.com/torodb/stampede/issues/203)
|
||||
|
||||
## OpenShift
|
||||
|
||||
[OpenShift](OpenShift)
|
||||
|
||||
## SLES
|
||||
|
||||
[SLES SP1](Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1)
|
||||
|
||||
## Rancher
|
||||
|
||||
[Rancher Rancher Active Proxy](Rancher---Rancher-Active-Proxy---Wekan-MongoDB-Docker)
|
||||
|
||||
## Testing
|
||||
|
||||
[Install for testing](Install-Wekan-Docker-for-testing)
|
||||
|
||||
## Production
|
||||
|
||||
[Production setup for thousands of users with Docker at AWS](AWS)
|
||||
|
||||
[Other way to do production](Install-Wekan-Docker-in-production)
|
||||
|
||||
## External MongoDB auth
|
||||
|
||||
[External MongoDB authentication](https://github.com/wekan/wekan/issues/1375)
|
||||
|
||||
## Admin Panel
|
||||
|
||||
First registered Wekan user will get Admin Panel on new Docker and source based
|
||||
installs. You can also [enable Admin Panel manually](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v0111-rc2-2017-03-05-wekan-prerelease)
|
||||
|
||||
## Docker Hub - sometimes broken
|
||||
|
||||
Currently there are two dockerhub builds for wekan. One at [mquandalle dockerhub](https://hub.docker.com/r/mquandalle/wekan/builds/) and another at [wekanteam dockerhub](https://hub.docker.com/r/wekanteam/wekan/builds/).
|
||||
|
||||
[wekanteam dockerhub](https://hub.docker.com/r/wekanteam/wekan/builds/) is usually broken.
|
||||
|
||||
## Development:
|
||||
|
||||
### `docker run` examples
|
||||
|
||||
- MongoDB:
|
||||
|
||||
```
|
||||
docker run -d --restart=always --name wekan-db mongo:3.2.20
|
||||
```
|
||||
|
||||
- No build step, pull from the [quay](https://quay.io/repository/wekan/wekan?tab=tags) and
|
||||
specify docker variables
|
||||
|
||||
```
|
||||
docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=mongodb://db" -e "ROOT_URL=http://localhost:8080" -p 8080:8080 quay.io/wekan/wekan
|
||||
```
|
||||
|
||||
|
||||
### `docker-compose` examples
|
||||
|
||||
- No build step and pull from [quay](https://quay.io/repository/wekan/wekan?tab=tags)
|
||||
|
||||
```
|
||||
sudo docker-compose up -d --nobuild
|
||||
```
|
||||
|
||||
- Build default
|
||||
```
|
||||
sudo docker-compose up -d --build
|
||||
```
|
||||
|
||||
- Build with newer Node version:
|
||||
```
|
||||
echo 'NODE_VERSION=v8.11.1' >> .env && \
|
||||
sudo docker-compose up -d --build
|
||||
```
|
||||
|
||||
- Build custom image off a release candidate or beta for meteor
|
||||
```
|
||||
echo 'METEOR_EDGE=1.5-beta.17' >> .env && \
|
||||
echo 'USE_EDGE=true' >> .env && \
|
||||
sudo docker-compose up -d --build
|
||||
```
|
||||
|
||||
## Docker env for Wekan dev
|
||||
|
||||
* [Docker environment for Wekan Development](https://github.com/wekan/wekan-dev)
|
||||
|
||||
## Alpine, needs testing
|
||||
|
||||
* [Docker Compose: Alpine Linux and Wekan <=> MongoDB](https://github.com/wekan/wekan-launchpad)
|
||||
|
||||
## Webserver Config
|
||||
|
||||
* [Caddy Webserver Config](Caddy-Webserver-Config)
|
||||
* [Nginx Webserver Config](Nginx-Webserver-Config)
|
||||
* [Apache Webserver Config](Apache)
|
||||
@@ -0,0 +1,6 @@
|
||||
- Website: http://trydome.io
|
||||
- Location: USA
|
||||
- Free trial of WeKan Hosting at https://app.trydome.io/signup?package=wekan
|
||||
- Paid SaaS hosting at propietary backend
|
||||
- Hosted code examples at https://github.com/domeplatform
|
||||
- Developer info at https://www.trydome.io/developer
|
||||
@@ -0,0 +1,41 @@
|
||||
## Roles
|
||||
|
||||
It depends on role of user what drag drop is allowed https://github.com/wekan/wekan/wiki/REST-API-Role
|
||||
|
||||
## Mobile Drag Drop
|
||||
|
||||
1. Click `Drag Handle Enabled/Disabled` button to enable drag handles
|
||||
|
||||
2. Use drag handles to move Board Icons, Swimlanes, MiniCards, Lists, Checklists, Checklist Items.
|
||||
|
||||
3. Use non-drag-handle area to to view other parts of board, by dragging board up/down/left/right, without moving any icons etc.
|
||||
|
||||
<img src="https://wekan.github.io/dragdrop/mobile-drag-drop.png" width="40%" alt="Wekan logo" />
|
||||
|
||||
## 2 or more external screens of desktop or mobile
|
||||
|
||||
For each screen, you can enable or disable drag handles, because that setting is stored in browser localstorage, not to database. https://github.com/wekan/wekan/issues/4715
|
||||
|
||||
Because this feature was added, `Drag Handle Enabled/Disabled` was moved to current place shown in above screenshot. https://github.com/wekan/wekan/issues/4734
|
||||
|
||||
## All Boards page
|
||||
|
||||
Reorder with drag drop:
|
||||
- Board Icons
|
||||
|
||||
## One Board page
|
||||
|
||||
Reorder with drag drop:
|
||||
|
||||
- Swimlanes
|
||||
- Lists
|
||||
- MiniCards. MiniCard is card, that is not click opened to view card contents.
|
||||
- Opened Card: Checklists
|
||||
- Opened Card: Checklist Items
|
||||
|
||||
## Drag code examples
|
||||
|
||||
- Draggable objects
|
||||
- https://www.redblobgames.com/making-of/draggable/
|
||||
- https://news.ycombinator.com/item?id=37703291
|
||||
- Fixed Drag at Ubuntu Touch Morph browser https://github.com/wekan/wekan/commit/af63259f091cb2ade84493a288ea37c53cd37321
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
- received - when a bug or task is found
|
||||
- start - when work is started
|
||||
- due - when it should be done
|
||||
- end - when it's done
|
||||
@@ -0,0 +1,76 @@
|
||||
## About markdown changes
|
||||
|
||||
Wekan v4.29 changes markdown rendering from [marked](https://github.com/markedjs/marked) to [markdown-it](https://github.com/markdown-it/markdown-it).
|
||||
|
||||
## About emoji
|
||||
|
||||
With markdown-it, also [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) plugin has been added, supporting [full list of GitHub emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.json).
|
||||
|
||||
Example emoji code, that you can add for example to card name, card description etc:
|
||||
```
|
||||
:rainbow: :thumbsup: :100:
|
||||
```
|
||||
That shows emojis :rainbow: :thumbsup: :100:
|
||||
|
||||
## About other markdown-it plugins
|
||||
|
||||
For markdown-it, there are also other [syntax extensions](https://github.com/markdown-it/markdown-it#syntax-extensions) where some are listed at that markdown-it page, and [others at npmjs.com](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
|
||||
|
||||
For example, how to get some [mermaid plugin](https://www.npmjs.com/search?q=markdown-it-mermaid) working so that some syntax works for https://mermaid-js.github.io/mermaid/ ?
|
||||
|
||||
## How you could add another plugin
|
||||
|
||||
Using newest Ubuntu amd64:
|
||||
|
||||
### 1. Install git and configure it
|
||||
```
|
||||
sudo apt -y install git
|
||||
git config --global user.name "Yourfirstname Yourlastname"
|
||||
git config --global user.email email-address-you-use-at-github@example.com
|
||||
git config --global push.default simple
|
||||
```
|
||||
|
||||
### 2. Create fork of `https://github.com/wekan/wekan`
|
||||
```
|
||||
git clone git@github.com:YourGithubUsername/wekan.git
|
||||
cd wekan
|
||||
./rebuild-wekan.sh
|
||||
```
|
||||
### 3. Select option 1 to install dependencies, and then Enter.
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
```
|
||||
### 4. Select option 2 to build Wekan, and then Enter
|
||||
|
||||
### 5. Add new plugin package
|
||||
```
|
||||
meteor npm install markdown-it-something --save
|
||||
```
|
||||
### 5. Edit file
|
||||
|
||||
Edit file `wekan/packages/markdown/src-integration.js` and add using that new package, using code example from that new plugin page, or similar like emoji plugin was added.
|
||||
|
||||
### 6. Start meteor in Wekan directory
|
||||
|
||||
For example:
|
||||
```
|
||||
WRITABLE_PATH=.. meteor --port 4000
|
||||
```
|
||||
And then [register and login](Adding-users) at http://localhost:4000
|
||||
|
||||
|
||||
### 7. Test
|
||||
|
||||
Test does that new plugin syntax work, for example in card title, card description etc on other input fields.
|
||||
|
||||
### 8. If it works
|
||||
|
||||
If normal markdown, emoji, and your new added plugin syntax all work, commit your changes:
|
||||
```
|
||||
git add --all
|
||||
git commit -m "Added plugin markdown-it-something."
|
||||
git push
|
||||
```
|
||||
And then at your GitHub for `https://github.com/YOUR-GITHUB-USERNAME/wekan` click `Create pull request`.
|
||||
|
||||
|
||||
Loaded 100 of 401 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user