Product name
This commit is contained in:
parent
87f05911ae
commit
535e313718
6 changed files with 60 additions and 47 deletions
14
README.md
14
README.md
|
@ -1,4 +1,10 @@
|
|||
# mattermost-octo-tasks
|
||||
# Focalboard
|
||||
|
||||
Focalboard is an open source project management app for individuals and teams. It comes in two editions:
|
||||
* **Personal Desktop**: A stand-alone desktop app for your todos and personal projects
|
||||
* **Personal Server**: A self-hosted server for your team to collaborate
|
||||
|
||||
The same server binary powers both editions.
|
||||
|
||||
## Building the server
|
||||
|
||||
|
@ -34,17 +40,17 @@ You can build standalone apps that package the server to run locally against SQL
|
|||
|
||||
* Mac:
|
||||
* `make mac-app`
|
||||
* run `mac/dist/Tasks.app`
|
||||
* run `mac/dist/Focalboard.app`
|
||||
* *Requires: macOS Catalina (10.15), Xcode 12 and a development signing certificate.*
|
||||
* Linux:
|
||||
* Install webgtk dependencies
|
||||
* `sudo apt-get install libgtk-3-dev`
|
||||
* `sudo apt-get install libwebkit2gtk-4.0-dev`
|
||||
* `make linux-app`
|
||||
* run `linux/dist/tasks-app`
|
||||
* run `linux/dist/focalboard-app`
|
||||
* Windows
|
||||
* `make win-app`
|
||||
* run `win/dist/tasks-win.exe`
|
||||
* run `win/dist/focalboard.exe`
|
||||
* *Requires: Windows 10*
|
||||
|
||||
Cross-compilation currently isn't fully supported, so please build on the appropriate platform. Refer to the GitHub Actions workflows (build-mac.yml, build-win.yml, build-ubuntu.yml) for the detailed list of steps on each platform.
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
80D6DEBD252E13CB00AEED9E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DEBC252E13CB00AEED9E /* ViewController.swift */; };
|
||||
80D6DEBF252E13CD00AEED9E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 80D6DEBE252E13CD00AEED9E /* Assets.xcassets */; };
|
||||
80D6DEC2252E13CD00AEED9E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 80D6DEC0252E13CD00AEED9E /* Main.storyboard */; };
|
||||
80D6DECE252E13CD00AEED9E /* TasksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DECD252E13CD00AEED9E /* TasksTests.swift */; };
|
||||
80D6DED9252E13CD00AEED9E /* TasksUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DED8252E13CD00AEED9E /* TasksUITests.swift */; };
|
||||
80D6DECE252E13CD00AEED9E /* FocalboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DECD252E13CD00AEED9E /* FocalboardTests.swift */; };
|
||||
80D6DED9252E13CD00AEED9E /* FocalboardUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DED8252E13CD00AEED9E /* FocalboardUITests.swift */; };
|
||||
80D6DEEA252E15D100AEED9E /* resources in Resources */ = {isa = PBXBuildFile; fileRef = 80D6DEE9252E15D100AEED9E /* resources */; };
|
||||
80D6DF18252F9BDE00AEED9E /* AutoSaveWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DF17252F9BDE00AEED9E /* AutoSaveWindowController.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
@ -23,14 +23,14 @@
|
|||
containerPortal = 80D6DEAF252E13CB00AEED9E /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 80D6DEB6252E13CB00AEED9E;
|
||||
remoteInfo = Tasks;
|
||||
remoteInfo = Focalboard;
|
||||
};
|
||||
80D6DED5252E13CD00AEED9E /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 80D6DEAF252E13CB00AEED9E /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 80D6DEB6252E13CB00AEED9E;
|
||||
remoteInfo = Tasks;
|
||||
remoteInfo = Focalboard;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
|
@ -41,12 +41,12 @@
|
|||
80D6DEBE252E13CD00AEED9E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
80D6DEC1252E13CD00AEED9E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
80D6DEC3252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
80D6DEC4252E13CD00AEED9E /* Tasks.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Tasks.entitlements; sourceTree = "<group>"; };
|
||||
80D6DEC4252E13CD00AEED9E /* Focalboard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Focalboard.entitlements; sourceTree = "<group>"; };
|
||||
80D6DEC9252E13CD00AEED9E /* FocalboardTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FocalboardTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80D6DECD252E13CD00AEED9E /* TasksTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksTests.swift; sourceTree = "<group>"; };
|
||||
80D6DECD252E13CD00AEED9E /* FocalboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocalboardTests.swift; sourceTree = "<group>"; };
|
||||
80D6DECF252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
80D6DED4252E13CD00AEED9E /* FocalboardUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FocalboardUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80D6DED8252E13CD00AEED9E /* TasksUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksUITests.swift; sourceTree = "<group>"; };
|
||||
80D6DED8252E13CD00AEED9E /* FocalboardUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocalboardUITests.swift; sourceTree = "<group>"; };
|
||||
80D6DEDA252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
80D6DEE9252E15D100AEED9E /* resources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = resources; sourceTree = "<group>"; };
|
||||
80D6DF17252F9BDE00AEED9E /* AutoSaveWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoSaveWindowController.swift; sourceTree = "<group>"; };
|
||||
|
@ -108,7 +108,7 @@
|
|||
80D6DEBE252E13CD00AEED9E /* Assets.xcassets */,
|
||||
80D6DEC0252E13CD00AEED9E /* Main.storyboard */,
|
||||
80D6DEC3252E13CD00AEED9E /* Info.plist */,
|
||||
80D6DEC4252E13CD00AEED9E /* Tasks.entitlements */,
|
||||
80D6DEC4252E13CD00AEED9E /* Focalboard.entitlements */,
|
||||
80D6DF1C25324A4F00AEED9E /* Inherit.entitlements */,
|
||||
);
|
||||
path = Focalboard;
|
||||
|
@ -117,7 +117,7 @@
|
|||
80D6DECC252E13CD00AEED9E /* FocalboardTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
80D6DECD252E13CD00AEED9E /* TasksTests.swift */,
|
||||
80D6DECD252E13CD00AEED9E /* FocalboardTests.swift */,
|
||||
80D6DECF252E13CD00AEED9E /* Info.plist */,
|
||||
);
|
||||
path = FocalboardTests;
|
||||
|
@ -126,7 +126,7 @@
|
|||
80D6DED7252E13CD00AEED9E /* FocalboardUITests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
80D6DED8252E13CD00AEED9E /* TasksUITests.swift */,
|
||||
80D6DED8252E13CD00AEED9E /* FocalboardUITests.swift */,
|
||||
80D6DEDA252E13CD00AEED9E /* Info.plist */,
|
||||
);
|
||||
path = FocalboardUITests;
|
||||
|
@ -149,7 +149,7 @@
|
|||
dependencies = (
|
||||
);
|
||||
name = Focalboard;
|
||||
productName = Tasks;
|
||||
productName = Focalboard;
|
||||
productReference = 80D6DEB7252E13CB00AEED9E /* Focalboard.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
|
@ -167,7 +167,7 @@
|
|||
80D6DECB252E13CD00AEED9E /* PBXTargetDependency */,
|
||||
);
|
||||
name = FocalboardTests;
|
||||
productName = TasksTests;
|
||||
productName = FocalboardTests;
|
||||
productReference = 80D6DEC9252E13CD00AEED9E /* FocalboardTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
|
@ -185,7 +185,7 @@
|
|||
80D6DED6252E13CD00AEED9E /* PBXTargetDependency */,
|
||||
);
|
||||
name = FocalboardUITests;
|
||||
productName = TasksUITests;
|
||||
productName = FocalboardUITests;
|
||||
productReference = 80D6DED4252E13CD00AEED9E /* FocalboardUITests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.ui-testing";
|
||||
};
|
||||
|
@ -293,7 +293,7 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
80D6DECE252E13CD00AEED9E /* TasksTests.swift in Sources */,
|
||||
80D6DECE252E13CD00AEED9E /* FocalboardTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -301,7 +301,7 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
80D6DED9252E13CD00AEED9E /* TasksUITests.swift in Sources */,
|
||||
80D6DED9252E13CD00AEED9E /* FocalboardUITests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -499,14 +499,14 @@
|
|||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
INFOPLIST_FILE = TasksTests/Info.plist;
|
||||
INFOPLIST_FILE = FocalboardTests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.TasksTests;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.FocalboardTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Focalboard.app/Contents/MacOS/Focalboard";
|
||||
|
@ -521,14 +521,14 @@
|
|||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
INFOPLIST_FILE = TasksTests/Info.plist;
|
||||
INFOPLIST_FILE = FocalboardTests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.TasksTests;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.FocalboardTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Focalboard.app/Contents/MacOS/Focalboard";
|
||||
|
@ -542,16 +542,16 @@
|
|||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
INFOPLIST_FILE = TasksUITests/Info.plist;
|
||||
INFOPLIST_FILE = FocalboardUITests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.TasksUITests;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.FocalboardUITests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_TARGET_NAME = Tasks;
|
||||
TEST_TARGET_NAME = Focalboard;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
|
@ -562,16 +562,16 @@
|
|||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
INFOPLIST_FILE = TasksUITests/Info.plist;
|
||||
INFOPLIST_FILE = FocalboardUITests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.TasksUITests;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.FocalboardUITests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_TARGET_NAME = Tasks;
|
||||
TEST_TARGET_NAME = Focalboard;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
// See LICENSE.txt for license information.
|
||||
|
||||
import XCTest
|
||||
@testable import Tasks
|
||||
@testable import Focalboard
|
||||
|
||||
class TasksTests: XCTestCase {
|
||||
class FocalboardTests: XCTestCase {
|
||||
|
||||
override func setUpWithError() throws {
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
import XCTest
|
||||
|
||||
class TasksUITests: XCTestCase {
|
||||
class FocalboardUITests: XCTestCase {
|
||||
|
||||
override func setUpWithError() throws {
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
@ -17,11 +17,11 @@ Popular hosted options include:
|
|||
|
||||
## Install Focalboard
|
||||
|
||||
[Download the Ubuntu archive package here](/download), then unpack it to /opt/octo:
|
||||
[Download the Ubuntu archive package here](/download), then unpack it to /opt/focalboard:
|
||||
|
||||
```
|
||||
tar -xvzf octo-linux-amd64.tar.gz
|
||||
sudo mv octo /opt
|
||||
tar -xvzf focalboard-server-linux-amd64.tar.gz
|
||||
sudo mv focalboard /opt
|
||||
```
|
||||
|
||||
## Install NGINX
|
||||
|
@ -41,12 +41,12 @@ You may need to adjust your firewall settings depending on the host, e.g.
|
|||
|
||||
Create a new site config:
|
||||
```
|
||||
sudo nano /etc/nginx/sites-available/tasks
|
||||
sudo nano /etc/nginx/sites-available/focalboard
|
||||
```
|
||||
|
||||
Copy and paste this configuration:
|
||||
```
|
||||
upstream tasks {
|
||||
upstream focalboard {
|
||||
server localhost:8000;
|
||||
keepalive 32;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ upstream tasks {
|
|||
server {
|
||||
listen 80 default_server;
|
||||
|
||||
server_name tasks.example.com;
|
||||
server_name focalboard.example.com;
|
||||
|
||||
location ~ /ws/* {
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
|
@ -73,7 +73,7 @@ server {
|
|||
proxy_connect_timeout 1d;
|
||||
proxy_send_timeout 1d;
|
||||
proxy_read_timeout 1d;
|
||||
proxy_pass http://tasks;
|
||||
proxy_pass http://focalboard;
|
||||
}
|
||||
|
||||
location / {
|
||||
|
@ -92,11 +92,18 @@ server {
|
|||
proxy_cache_use_stale timeout;
|
||||
proxy_cache_lock on;
|
||||
proxy_http_version 1.1;
|
||||
proxy_pass http://tasks;
|
||||
proxy_pass http://focalboard;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Enable the site, test the config, and reload NGINX:
|
||||
```
|
||||
sudo ln -s /etc/nginx/sites-enabled/focalboard /etc/nginx/sites-available/focalboard
|
||||
sudo nginx -t
|
||||
sudo /etc/init.d/nginx reload
|
||||
```
|
||||
|
||||
## Set up TLS on NGINX
|
||||
|
||||
For a production server, it's important to set up TLS to encrypt web traffic. Without this, your login passwords and data are unprotected. Refer to the [NGINX TLS guide](https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/) and [Let's Encrypt guide](https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx) on setting this up.
|
||||
|
@ -117,8 +124,8 @@ psql
|
|||
|
||||
On the psql prompt, run the following commands (**change the user/password** to your own values):
|
||||
<pre>
|
||||
CREATE DATABASE tasks;
|
||||
CREATE USER <b>tasksuser</b> WITH PASSWORD '<b>tasksuser-password</b>';
|
||||
CREATE DATABASE boards;
|
||||
CREATE USER <b>boardsuser</b> WITH PASSWORD '<b>boardsuser-password</b>';
|
||||
\q
|
||||
</pre>
|
||||
|
||||
|
@ -130,12 +137,12 @@ exit
|
|||
Edit the Focalboard config.json:
|
||||
|
||||
```
|
||||
nano /opt/octo/config.json
|
||||
nano /opt/focalboard/config.json
|
||||
```
|
||||
|
||||
Change the dbconfig setting to use the postgres database you created:
|
||||
```
|
||||
"dbconfig": "postgres://tasksuser:tasksuser-password@localhost/octo?sslmode=disable&connect_timeout=10",
|
||||
"dbconfig": "postgres://boardsuser:boardsuser-password@localhost/boards?sslmode=disable&connect_timeout=10",
|
||||
```
|
||||
|
||||
## Configure Focalboard to run as a service
|
||||
|
@ -155,8 +162,8 @@ Description=Focalboard server
|
|||
Type=simple
|
||||
Restart=always
|
||||
RestartSec=5s
|
||||
ExecStart=/opt/octo/bin/octoserver
|
||||
WorkingDirectory=/opt/octo
|
||||
ExecStart=/opt/focalboard/bin/octoserver
|
||||
WorkingDirectory=/opt/focalboard
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
|
|
@ -14,7 +14,7 @@ Personal Server settings are stored in `config.json` and is read when the server
|
|||
| serverRoot | Root URL of the server | "http://localhost:8000"
|
||||
| port | Server port | 8000
|
||||
| dbtype | Type of database. `sqlite3` or `postgres` | "sqlite3"
|
||||
| dbconfig | Database connection string | postgres://user:pass@localhost/tasks?sslmode=disable&connect_timeout=10
|
||||
| dbconfig | Database connection string | postgres://user:pass@localhost/boards?sslmode=disable&connect_timeout=10
|
||||
| webpath | Path to web files | "./webapp/pack"
|
||||
| filespath | Path to uploaded files folder | "./files"
|
||||
| telemetry | Enable health diagnostics telemetry | true
|
||||
|
|
Loading…
Reference in a new issue