diff --git a/README.md b/README.md index 54016c7ec..f84a33b67 100644 --- a/README.md +++ b/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. diff --git a/mac/Focalboard.xcodeproj/project.pbxproj b/mac/Focalboard.xcodeproj/project.pbxproj index 7cbe1ca28..038bd2275 100644 --- a/mac/Focalboard.xcodeproj/project.pbxproj +++ b/mac/Focalboard.xcodeproj/project.pbxproj @@ -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 = ""; }; 80D6DEC1252E13CD00AEED9E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 80D6DEC3252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 80D6DEC4252E13CD00AEED9E /* Tasks.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Tasks.entitlements; sourceTree = ""; }; + 80D6DEC4252E13CD00AEED9E /* Focalboard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Focalboard.entitlements; sourceTree = ""; }; 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 = ""; }; + 80D6DECD252E13CD00AEED9E /* FocalboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocalboardTests.swift; sourceTree = ""; }; 80D6DECF252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 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 = ""; }; + 80D6DED8252E13CD00AEED9E /* FocalboardUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocalboardUITests.swift; sourceTree = ""; }; 80D6DEDA252E13CD00AEED9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 80D6DEE9252E15D100AEED9E /* resources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = resources; sourceTree = ""; }; 80D6DF17252F9BDE00AEED9E /* AutoSaveWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoSaveWindowController.swift; sourceTree = ""; }; @@ -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; }; diff --git a/mac/FocalboardTests/TasksTests.swift b/mac/FocalboardTests/FocalboardTests.swift similarity index 93% rename from mac/FocalboardTests/TasksTests.swift rename to mac/FocalboardTests/FocalboardTests.swift index 0f0537bb7..baf68e710 100644 --- a/mac/FocalboardTests/TasksTests.swift +++ b/mac/FocalboardTests/FocalboardTests.swift @@ -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. diff --git a/mac/FocalboardUITests/TasksUITests.swift b/mac/FocalboardUITests/FocalboardUITests.swift similarity index 97% rename from mac/FocalboardUITests/TasksUITests.swift rename to mac/FocalboardUITests/FocalboardUITests.swift index 109685411..ee70e3b88 100644 --- a/mac/FocalboardUITests/TasksUITests.swift +++ b/mac/FocalboardUITests/FocalboardUITests.swift @@ -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. diff --git a/website/site/content/download/personal-edition/ubuntu.md b/website/site/content/download/personal-edition/ubuntu.md index fd3fd3fb5..039bffc60 100644 --- a/website/site/content/download/personal-edition/ubuntu.md +++ b/website/site/content/download/personal-edition/ubuntu.md @@ -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):
-CREATE DATABASE tasks;
-CREATE USER tasksuser WITH PASSWORD 'tasksuser-password';
+CREATE DATABASE boards;
+CREATE USER boardsuser WITH PASSWORD 'boardsuser-password';
 \q
 
@@ -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 diff --git a/website/site/content/guide/admin/_index.md b/website/site/content/guide/admin/_index.md index ec7d49353..5ab9ff4bd 100644 --- a/website/site/content/guide/admin/_index.md +++ b/website/site/content/guide/admin/_index.md @@ -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