Skip to content

Commit e945f54

Browse files
authored
Merge branch 'main' into 7001-tab-title
2 parents 8d623af + 6f3fef9 commit e945f54

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1607
-468
lines changed

docs/install/docker/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ Download the latest version of the FlowFuse Docker Compose file and example `.en
129129

130130
```bash
131131
curl -L -o docker-compose.yml https://github.com/FlowFuse/docker-compose/releases/latest/download/docker-compose.yml
132-
curl -o .env https://raw.githubusercontent.com/FlowFuse/docker-compose/refs/heads/main/.env.example
132+
curl -L -o .env https://raw.githubusercontent.com/FlowFuse/docker-compose/refs/heads/main/.env.example
133133
```
134134

135135
### Configure

docs/quick-start/README.md

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ meta:
1717

1818
# Quick Start Guide
1919

20-
This guide provides a streamlined process for setting up and running the FlowFuse platform using Docker and docker-compose.
20+
This guide provides a streamlined process for setting up and running the FlowFuse platform using [Docker](https://docs.docker.com/get-started/) and [Docker Compose](https://docs.docker.com/compose/).
2121

22-
The provided docker-compose file facilitates the deployment of the following services:
22+
The Docker Compose file deploys the following services:
2323
* **FlowFuse Platform**: Includes the core application, MQTT broker, and file server for storage
2424
* **Database:** A pre-configured database for storing platform data
2525
* **Proxy Server:** A pre-configured proxy server for managing HTTP traffic
@@ -28,51 +28,55 @@ For a full installation guide, including how to setup FlowFuse in a production e
2828

2929
## Prerequisites
3030

31-
Before you begin, ensure you have [Docker](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) (in `2.23.1` version or higher) installed on your system (either as a standalone binary or as docker plugin)
31+
Before you begin, ensure you have [Docker](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) (in `2.23.1` version or higher) installed on your system (either as a standalone binary or as a Docker plugin).
3232

33-
## Step 1: Configure Domain
33+
## Step 1: Prepare your domain
3434

35-
### No DNS Server
35+
FlowFuse requires a domain name to work properly — it uses subdomains to run each Node-RED instance separately, so `localhost` won't work here.
3636

37-
If you're just looking to test FlowFuse locally, and do not have a local DNS server, then we recommend [setting up an alternative to DNS](../install/dns-setup.md#no-local-dns-server).
37+
If you own a domain (e.g., `example.com` or `flowfuse.example.com`), create an **A record** pointing to your server's IP address, and another **A record** for the wildcard subdomain (e.g., `*.example.com` or `*.flowfuse.example.com`) pointing to the same address. That's all the setup needed.
3838

39-
### DNS Server
39+
If you don't have a domain yet and just want to try FlowFuse locally, see [setting up an alternative to DNS](../install/dns-setup.md#no-local-dns-server).
4040

41-
Otherwise, before running FlowFuse, you need to configure your fully qualified domain name settings, and will need a domain name that you own and can configure DNS settings for:
41+
## Step 2: Download files
4242

43-
1. Set up an A record for your domain (e.g., `example.com`) to your server's IP address (this works with subdomain as well e.g. `flowfuse.example.com`). FlowFuse will run here.
44-
2. In the same manner, set up a wildcard DNS record (e.g., `*.example.com`, `*.flowfuse.example.com`) to point to your server's IP address. Any Node-RED instances setup by FlowFuse will run here.
43+
```bash
44+
curl -L -o docker-compose.yml https://github.com/FlowFuse/docker-compose/releases/latest/download/docker-compose.yml
45+
curl -L -o .env https://raw.githubusercontent.com/FlowFuse/docker-compose/refs/heads/main/.env.example
46+
```
47+
48+
## Step 3: Provide domain name
4549

46-
This step is crucial for the proper functioning of the application. FlowFuse will not run properly on `localhost` domain.
50+
Edit the downloaded `.env` file with the editor of your choice and update the `DOMAIN` variable with your domain.
4751

48-
## Step 2: Download Compose file
52+
You can use `sed` to update the `DOMAIN` variable in the `.env` file:
4953

5054
```bash
51-
curl -L -o docker-compose.yml https://github.com/FlowFuse/docker-compose/releases/latest/download/docker-compose-quick-start.yml
55+
sed -i.bak 's/^DOMAIN=.*/DOMAIN=example.com/' .env
5256
```
5357

54-
## Step 3: Start the Application
58+
## Step 4: Start the Application
5559

56-
Run the following command to deploy FlowFuse. Replace the `yourdomain.com` with your domain name configured in step 1.:
60+
Run the following command to deploy FlowFuse:
5761

5862
```bash
59-
DOMAIN=example.com docker compose up -d
63+
docker compose up -d
6064
```
6165

62-
This command will download the necessary Docker images, run initial setup and start all the required services in detached mode.
66+
This downloads the necessary Docker images, runs initial setup, and starts all services in detached mode.
6367

64-
## Step 4: Complete the application Setup
68+
## Step 5: Complete the application Setup
6569

66-
Open your web browser and navigate to `http://forge.example.com/setup` . You will be redirected to the setup page where you can create your admin account and set up your instance.
67-
For detailed information about first setup and configuration, please follow [this guide](../install/first-run.md).
70+
Open your web browser and navigate to `http://forge.<your-domain>/setup` (e.g., `http://forge.example.com/setup`). You will be redirected to the setup page where you can create your admin account and set up your instance.
71+
For detailed information about first setup and configuration, follow [this guide](../install/first-run.md).
6872

6973

7074
## Cleanup
7175

72-
To stop and remove the FlowFuse application, run the following command. Replace `yourdomain.com` with your domain name:
76+
To stop and remove the FlowFuse application, run the following command:
7377

7478
```bash
75-
DOMAIN=example.com docker compose down -v
79+
docker compose down -v
7680
```
7781

7882
## Troubleshooting

frontend/src/App.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</div>
88
</main>
99
</template>
10-
<template v-else-if="pending">
10+
<template v-else-if="appLoader">
1111
<main class="ff-bg-dark flex-grow flex flex-col">
1212
<div class="w-full mx-auto flex-grow flex flex-col">
1313
<Loading color="white" />
@@ -78,9 +78,11 @@ import PasswordExpired from './pages/PasswordExpired.vue'
7878
import TermsAndConditions from './pages/TermsAndConditions.vue'
7979
import UnverifiedEmail from './pages/UnverifiedEmail.vue'
8080
81+
import { useAccountAuthStore } from '@/stores/account-auth.js'
8182
import { useContextStore } from '@/stores/context.js'
8283
import { useProductBrokersStore } from '@/stores/product-brokers.js'
8384
import { useUxDrawersStore } from '@/stores/ux-drawers.js'
85+
import { useUxLoadingStore } from '@/stores/ux-loading.js'
8486
8587
export default {
8688
name: 'App',
@@ -100,7 +102,9 @@ export default {
100102
},
101103
computed: {
102104
...mapState(useUxDrawersStore, ['hiddenLeftDrawer']),
103-
...mapVuexState('account', ['pending', 'user', 'team', 'offline', 'settings']),
105+
...mapState(useAccountAuthStore, ['user']),
106+
...mapState(useUxLoadingStore, ['appLoader', 'offline']),
107+
...mapVuexState('account', ['team', 'settings']),
104108
loginRequired () {
105109
return this.$route.meta.requiresLogin !== false
106110
},

frontend/src/api/client.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ client.interceptors.response.use(function (response) {
2020

2121
// This is an error response from our own API (or failure to reach it)
2222
// Lazy require to avoid circular dependency:
23-
// api/client.js → store/index.js → account/index.js → routes.js → page components → api modules → api/client.js
24-
// TODO: remove once the `account` Vuex module is migrated to Pinia — replace with a direct import of the Pinia account store.
23+
// api/client.js → stores/account-auth.js → api/user.js → api/client.js
24+
const { useAccountAuthStore } = require('../stores/account-auth.js')
25+
const { useUxLoadingStore } = require('../stores/ux-loading.js')
2526
const store = require('../store/index.js').default
2627
if (error.code === 'ERR_NETWORK') {
2728
// Backend failed to respond
28-
store.dispatch('account/setOffline', true)
29-
} else if (error.response && error.response.status === 401 && !store.state.account.pending && !store.state.account.loginInflight) {
29+
useUxLoadingStore().setOffline(true)
30+
} else if (error.response && error.response.status === 401 && !useUxLoadingStore().appLoader && !useAccountAuthStore().loginInflight) {
3031
// 401 when !pending && !loginInflight means the session has expired
3132
store.dispatch('account/logout')
3233
} else if (error.response && error.response.status === 500) {

frontend/src/components/PageHeader.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ import NotificationsButton from './NotificationsButton.vue'
119119
import TeamSelection from './TeamSelection.vue'
120120
import GlobalSearch from './global-search/GlobalSearch.vue'
121121
122+
import { useAccountAuthStore } from '@/stores/account-auth.js'
122123
import { useUxDrawersStore } from '@/stores/ux-drawers.js'
123124
import { useUxToursStore } from '@/stores/ux-tours.js'
124125
@@ -130,7 +131,8 @@ export default {
130131
return Roles
131132
},
132133
...mapState(useUxDrawersStore, ['leftDrawer', 'hiddenLeftDrawer']),
133-
...mapVuexState('account', ['user', 'team', 'teams']),
134+
...mapState(useAccountAuthStore, ['user']),
135+
...mapVuexState('account', ['team', 'teams']),
134136
...mapGetters('account', ['notifications', 'hasAvailableTeams', 'defaultUserTeam', 'canCreateTeam', 'isTrialAccount', 'featuresCheck']),
135137
navigationOptions () {
136138
return [

frontend/src/components/TeamTypeSelection.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
</template>
2020

2121
<script>
22-
import { mapGetters, mapState } from 'vuex'
22+
23+
import { mapGetters } from 'vuex'
2324
2425
import teamTypesApi from '../api/teamTypes.js'
2526
@@ -38,7 +39,6 @@ export default {
3839
}
3940
},
4041
computed: {
41-
...mapState('account', ['user']),
4242
...mapGetters('account', ['isBillingEnabled'])
4343
},
4444
async created () {

frontend/src/components/TeamTypeTile.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@
3030
</template>
3131

3232
<script>
33-
import { mapState } from 'vuex'
33+
import { mapState } from 'pinia'
34+
import { mapState as mapVuexState } from 'vuex'
3435
3536
import { useHubspotHelper } from '../composables/Hubspot.js'
3637
38+
import { useAccountAuthStore } from '@/stores/account-auth.js'
39+
3740
export default {
3841
name: 'TeamTypeTile',
3942
props: {
@@ -56,7 +59,8 @@ export default {
5659
return { talkToSalesCalendarModal }
5760
},
5861
computed: {
59-
...mapState('account', ['user', 'teams']),
62+
...mapVuexState('account', ['teams']),
63+
...mapState(useAccountAuthStore, ['user']),
6064
pricing: function () {
6165
const billingDescriptionKey = this.billingInterval === 'year' ? 'yrDescription' : 'description'
6266
const billing = this.teamType.properties?.billing?.[billingDescriptionKey]?.split('/')

frontend/src/components/auth/UpdateExpiredPassword.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,19 @@
4040
</template>
4141

4242
<script>
43-
import { mapState } from 'vuex'
43+
import { mapState } from 'pinia'
4444
4545
import userApi from '../../api/user.js'
4646
import store from '../../store/index.js'
4747
import FormRow from '../FormRow.vue'
4848
49+
import { useAccountAuthStore } from '@/stores/account-auth.js'
50+
4951
export default {
5052
name: 'UpdateExpiredPassword',
51-
computed: mapState('account', ['loginError']),
53+
computed: {
54+
...mapState(useAccountAuthStore, ['loginError'])
55+
},
5256
data () {
5357
return {
5458
input: {

frontend/src/components/banners/LicenseBanner.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
<script>
1818
import { ChevronRightIcon, ExclamationCircleIcon } from '@heroicons/vue/outline'
1919
20-
import { mapState } from 'vuex'
20+
import { mapState } from 'pinia'
21+
import { mapState as mapVuexState } from 'vuex'
22+
23+
import { useAccountAuthStore } from '@/stores/account-auth.js'
2124
2225
export default {
2326
name: 'LicenseBanner',
@@ -26,7 +29,8 @@ export default {
2629
ChevronRightIcon
2730
},
2831
computed: {
29-
...mapState('account', ['settings', 'user']),
32+
...mapVuexState('account', ['settings']),
33+
...mapState(useAccountAuthStore, ['user']),
3034
license () {
3135
return this.settings.license || {}
3236
},

frontend/src/components/drawers/navigation/MainNav.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default {
4343
emits: ['option-selected'],
4444
computed: {
4545
...mapState(useUxNavigationStore, ['mainNav', 'mainNavContext']),
46-
...mapVuexState('account', ['user', 'team', 'features', 'notifications']),
46+
...mapVuexState('account', ['team', 'features', 'notifications']),
4747
...mapGetters('account', ['requiresBilling']),
4848
nearestMetaMenu () {
4949
if (this.$route?.meta?.menu) {

0 commit comments

Comments
 (0)