Product name

This commit is contained in:
Chen-I Lim 2021-01-26 11:13:05 -08:00
parent 87f05911ae
commit 535e313718
6 changed files with 60 additions and 47 deletions

View file

@ -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.

View file

@ -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;
};

View file

@ -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.

View file

@ -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.

View file

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

View file

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