Ver código fonte

Update apps, add Your Spotify, Migrate users

Nicolas Meienberger 3 anos atrás
pai
commit
eb986e0015

+ 1 - 1
apps/code-server/docker-compose.yml

@@ -1,7 +1,7 @@
 version: "3.7"
 services:
   code-server:
-    image: lscr.io/linuxserver/code-server:4.4.0
+    image: lscr.io/linuxserver/code-server:4.5.1
     container_name: code-server
     environment:
       - PUID=1000

+ 1 - 1
apps/homarr/docker-compose.yml

@@ -2,7 +2,7 @@ version: "3.7"
 services:
   homarr:
     container_name: homarr
-    image: ghcr.io/ajnart/homarr:latest
+    image: ghcr.io/ajnart/homarr:0.8.0
     restart: unless-stopped
     volumes:
       - ${APP_DATA_DIR}/data/config:/app/data/configs

+ 1 - 1
apps/jackett/docker-compose.yml

@@ -1,7 +1,7 @@
 version: "3.7"
 services:
   jackett:
-    image: lscr.io/linuxserver/jackett:0.20.1171
+    image: lscr.io/linuxserver/jackett:0.20.1342
     container_name: jackett
     environment:
       - PUID=1000

+ 1 - 1
apps/jellyfin/docker-compose.yml

@@ -2,7 +2,7 @@ version: "3.7"
 
 services:
   jellyfin:
-    image: lscr.io/linuxserver/jellyfin:10.8.0
+    image: lscr.io/linuxserver/jellyfin:10.8.1
     container_name: jellyfin
     volumes:
       - ${APP_DATA_DIR}/data/config:/config

+ 1 - 1
apps/n8n/docker-compose.yml

@@ -16,7 +16,7 @@ services:
 
   n8n:
     container_name: n8n
-    image: n8nio/n8n:0.181.2
+    image: n8nio/n8n:0.186.1
     restart: unless-stopped
     ports:
       - ${APP_PORT}:5678

+ 2 - 2
apps/nextcloud/docker-compose.yml

@@ -25,7 +25,7 @@ services:
       - tipi_main_network
 
   cron:
-    image: nextcloud:24.0.1-apache
+    image: nextcloud:24.0.3-apache
     restart: on-failure
     volumes:
       - ${APP_DATA_DIR}/data/nextcloud:/var/www/html
@@ -38,7 +38,7 @@ services:
 
   nextcloud:
     container_name: nextcloud
-    image: nextcloud:24.0.1-apache
+    image: nextcloud:24.0.3-apache
     restart: unless-stopped
     ports:
       - ${APP_PORT}:80

+ 1 - 1
apps/nodered/docker-compose.yml

@@ -3,7 +3,7 @@ version: "3.7"
 services:
   nodered:
     container_name: nodered
-    image: nodered/node-red:2.2.2-12
+    image: nodered/node-red:3.0.0
     restart: unless-stopped
     ports:
       - ${APP_PORT}:1880

+ 11 - 11
apps/pihole/docker-compose.yml

@@ -1,20 +1,20 @@
 version: "3.7"
 
 services:
-  unbound:
-    image: "klutchell/unbound"
-    container_name: unbound
-    restart: unless-stopped
-    volumes:
-      - "${APP_DATA_DIR}/data/unbound:/etc/unbound"
-    networks:
-      tipi_main_network:
-        ipv4_address: 10.21.21.200
+  # unbound:
+  #   image: "klutchell/unbound"
+  #   container_name: unbound
+  #   restart: unless-stopped
+  #   volumes:
+  #     - "${APP_DATA_DIR}/data/unbound:/etc/unbound"
+  #   networks:
+  #     tipi_main_network:
+  #       ipv4_address: 10.21.21.200
 
   pihole:
-    depends_on: [unbound]
+    # depends_on: [unbound]
     container_name: pihole
-    image: pihole/pihole:2022.05
+    image: pihole/pihole:2022.07.1
     restart: unless-stopped
     hostname: pihole
     dns:

+ 1 - 1
apps/plex/docker-compose.yml

@@ -2,7 +2,7 @@ version: "3.7"
 
 services:
   plex:
-    image: lscr.io/linuxserver/plex:1.26.2
+    image: lscr.io/linuxserver/plex:1.27.2
     container_name: plex
     network_mode: host
     environment:

+ 1 - 1
apps/tailscale/docker-compose.yml

@@ -4,7 +4,7 @@ services:
   tailscale:
     container_name: tailscale
     network_mode: "host" # TODO: Find a way to remove this
-    image: tailscale/tailscale:v1.27.12
+    image: tailscale/tailscale:v1.29.10
     privileged: true
     restart: on-failure
     stop_grace_period: 1m

+ 1 - 1
apps/tautulli/docker-compose.yml

@@ -2,7 +2,7 @@ version: "2.1"
 services:
   tautulli:
     container_name: tautulli
-    image: lscr.io/linuxserver/tautulli:2.10.1
+    image: lscr.io/linuxserver/tautulli:2.10.2
     environment:
       - PUID=1000
       - PGID=1000

+ 1 - 1
apps/vaultwarden/docker-compose.yml

@@ -2,7 +2,7 @@ version: '3.7'
 
 services:
   vaultwarden:
-    image: vaultwarden/server:1.25.0
+    image: vaultwarden/server:1.25.1
     container_name: vaultwarden
     restart: unless-stopped
     ports:

+ 1 - 1
apps/wg-easy/docker-compose.yml

@@ -2,7 +2,7 @@ version: "3.7"
 services:
   wg-easy:
     container_name: wg-easy
-    image: weejewel/wg-easy:5
+    image: weejewel/wg-easy:7
     restart: unless-stopped
     volumes:
       - ${APP_DATA_DIR}/data:/etc/wireguard

+ 28 - 0
apps/your-spotify/config.json

@@ -0,0 +1,28 @@
+{
+  "name": "Your Spotify",
+  "available": true,
+  "port": 8103,
+  "id": "your-spotify",
+  "categories": ["music", "utilities"],
+  "description": "Self hosted Spotify tracking dashboard.",
+  "short_desc": "Self hosted Spotify tracking dashboard.",
+  "author": "Yooooomi",
+  "source": "https://github.com/Yooooomi/your_spotify",
+  "image": "/logos/apps/your-spotify.jpg",
+  "form_fields": [
+    {
+      "type": "text",
+      "label": "Spotify public key",
+      "hint": "The public key of your Spotify application",
+      "required": true,
+      "env_variable": "SPOTIFY_PUBLIC"
+    },
+    {
+      "type": "password",
+      "label": "Spotify secret key",
+      "hint": "The secret key of your Spotify application",
+      "required": true,
+      "env_variable": "SPOTIFY_SECRET"
+    }
+  ]
+}

+ 40 - 0
apps/your-spotify/docker-compose.yml

@@ -0,0 +1,40 @@
+version: "3"
+
+services:
+  your-spotify-server:
+    container_name: your-spotify-server
+    image: yooooomi/your_spotify_server
+    restart: always
+    ports:
+      - 32500:8080
+    links:
+      - mongo
+    depends_on:
+      - mongo
+    environment:
+      - API_ENDPOINT=http://localhost:32500 # This MUST be included as a valid URL in the spotify dashboard (see below)
+      - CLIENT_ENDPOINT=http://${INTERNAL_IP}:${APP_PORT}
+      - SPOTIFY_PUBLIC=${SPOTIFY_PUBLIC}
+      - SPOTIFY_SECRET=${SPOTIFY_SECRET}
+      - CORS=all
+    networks:
+      - tipi_main_network
+
+  your-spotify-db:
+    container_name: your-spotify-db
+    image: mongo:4.4.8
+    volumes:
+      - ${APP_DATA_DIR}/data/db:/data/db
+    networks:
+      - tipi_main_network
+
+  your-spotify:
+    container_name: your-spotify
+    image: yooooomi/your_spotify_client
+    restart: always
+    ports:
+      - ${APP_PORT}:3000
+    environment:
+      - API_ENDPOINT=http://${INTERNAL_IP}:32500
+    networks:
+      - tipi_main_network

+ 19 - 0
apps/your-spotify/metadata/description.md

@@ -0,0 +1,19 @@
+## Your Spotify
+
+YourSpotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.
+
+![Screenshots](https://user-images.githubusercontent.com/17204739/154752226-c2215a51-e20e-4ade-ac63-42c5abb25240.png)
+
+### Creating the Spotify Application
+
+For **YourSpotify** to work you need to provide a Spotify application **public** AND **secret** to the server environment.
+To do so, you need to create a **Spotify application** [here](https://developer.spotify.com/dashboard/applications).
+
+1. Click on **Create a client ID**.
+2. Fill out all the informations.
+3. Copy the **public** and the **secret** key respectively.
+4. Add an authorized redirect URI corresponding to your **server** location on the internet adding the suffix **/oauth/spotify/callback**.
+   1. use the `EDIT SETTINGS` button on the top right corner of the page.
+   2. add your URI under the `Redirect URIs` section.
+   - i.e: `http://localhost:8080/oauth/spotify/callback` or `http://home.mydomain.com/your_spotify_backend/oauth/spotify/callback`
+   3. Do not forget to hit the save button at the bottom of the popup.

BIN
packages/dashboard/public/logos/apps/your-spotify.jpg


+ 1 - 0
packages/dashboard/src/core/constants.ts

@@ -12,4 +12,5 @@ export const APP_CATEGORIES = [
   { name: 'Featured', id: AppCategoriesEnum.Featured, icon: 'FaStar' },
   { name: 'Books', id: AppCategoriesEnum.Books, icon: 'FaBook' },
   { name: 'Data', id: AppCategoriesEnum.Data, icon: 'FaDatabase' },
+  { name: 'Music', id: AppCategoriesEnum.Music, icon: 'FaMusic' },
 ];

+ 253 - 296
packages/dashboard/src/generated/graphql.tsx

@@ -38,11 +38,12 @@ export enum AppCategoriesEnum {
   Development = 'DEVELOPMENT',
   Featured = 'FEATURED',
   Media = 'MEDIA',
+  Music = 'MUSIC',
   Network = 'NETWORK',
   Photography = 'PHOTOGRAPHY',
   Security = 'SECURITY',
   Social = 'SOCIAL',
-  Utilities = 'UTILITIES',
+  Utilities = 'UTILITIES'
 }
 
 export type AppInfo = {
@@ -75,7 +76,7 @@ export enum AppStatusEnum {
   Starting = 'STARTING',
   Stopped = 'STOPPED',
   Stopping = 'STOPPING',
-  Uninstalling = 'UNINSTALLING',
+  Uninstalling = 'UNINSTALLING'
 }
 
 export type Cpu = {
@@ -98,7 +99,7 @@ export enum FieldTypesEnum {
   Number = 'number',
   Password = 'password',
   Text = 'text',
-  Url = 'url',
+  Url = 'url'
 }
 
 export type FormField = {
@@ -130,30 +131,37 @@ export type Mutation = {
   updateAppConfig: App;
 };
 
+
 export type MutationInstallAppArgs = {
   input: AppInputType;
 };
 
+
 export type MutationLoginArgs = {
   input: UsernamePasswordInput;
 };
 
+
 export type MutationRegisterArgs = {
   input: UsernamePasswordInput;
 };
 
+
 export type MutationStartAppArgs = {
   id: Scalars['String'];
 };
 
+
 export type MutationStopAppArgs = {
   id: Scalars['String'];
 };
 
+
 export type MutationUninstallAppArgs = {
   id: Scalars['String'];
 };
 
+
 export type MutationUpdateAppConfigArgs = {
   input: AppInputType;
 };
@@ -169,6 +177,7 @@ export type Query = {
   version: VersionResponse;
 };
 
+
 export type QueryGetAppArgs = {
   id: Scalars['String'];
 };
@@ -208,155 +217,103 @@ export type InstallAppMutationVariables = Exact<{
   input: AppInputType;
 }>;
 
-export type InstallAppMutation = { __typename?: 'Mutation'; installApp: { __typename: 'App'; id: string; status: AppStatusEnum } };
+
+export type InstallAppMutation = { __typename?: 'Mutation', installApp: { __typename: 'App', id: string, status: AppStatusEnum } };
 
 export type LoginMutationVariables = Exact<{
   input: UsernamePasswordInput;
 }>;
 
-export type LoginMutation = { __typename?: 'Mutation'; login: { __typename?: 'UserResponse'; user?: { __typename?: 'User'; id: string } | null } };
 
-export type LogoutMutationVariables = Exact<{ [key: string]: never }>;
+export type LoginMutation = { __typename?: 'Mutation', login: { __typename?: 'UserResponse', user?: { __typename?: 'User', id: string } | null } };
+
+export type LogoutMutationVariables = Exact<{ [key: string]: never; }>;
 
-export type LogoutMutation = { __typename?: 'Mutation'; logout: boolean };
+
+export type LogoutMutation = { __typename?: 'Mutation', logout: boolean };
 
 export type RegisterMutationVariables = Exact<{
   input: UsernamePasswordInput;
 }>;
 
-export type RegisterMutation = { __typename?: 'Mutation'; register: { __typename?: 'UserResponse'; user?: { __typename?: 'User'; id: string } | null } };
+
+export type RegisterMutation = { __typename?: 'Mutation', register: { __typename?: 'UserResponse', user?: { __typename?: 'User', id: string } | null } };
 
 export type StartAppMutationVariables = Exact<{
   id: Scalars['String'];
 }>;
 
-export type StartAppMutation = { __typename?: 'Mutation'; startApp: { __typename: 'App'; id: string; status: AppStatusEnum } };
+
+export type StartAppMutation = { __typename?: 'Mutation', startApp: { __typename: 'App', id: string, status: AppStatusEnum } };
 
 export type StopAppMutationVariables = Exact<{
   id: Scalars['String'];
 }>;
 
-export type StopAppMutation = { __typename?: 'Mutation'; stopApp: { __typename: 'App'; id: string; status: AppStatusEnum } };
+
+export type StopAppMutation = { __typename?: 'Mutation', stopApp: { __typename: 'App', id: string, status: AppStatusEnum } };
 
 export type UninstallAppMutationVariables = Exact<{
   id: Scalars['String'];
 }>;
 
-export type UninstallAppMutation = { __typename?: 'Mutation'; uninstallApp: { __typename: 'App'; id: string; status: AppStatusEnum } };
+
+export type UninstallAppMutation = { __typename?: 'Mutation', uninstallApp: { __typename: 'App', id: string, status: AppStatusEnum } };
 
 export type UpdateAppConfigMutationVariables = Exact<{
   input: AppInputType;
 }>;
 
-export type UpdateAppConfigMutation = { __typename?: 'Mutation'; updateAppConfig: { __typename: 'App'; id: string; status: AppStatusEnum } };
+
+export type UpdateAppConfigMutation = { __typename?: 'Mutation', updateAppConfig: { __typename: 'App', id: string, status: AppStatusEnum } };
 
 export type GetAppQueryVariables = Exact<{
   appId: Scalars['String'];
 }>;
 
-export type GetAppQuery = {
-  __typename?: 'Query';
-  getApp: {
-    __typename?: 'App';
-    id: string;
-    status: AppStatusEnum;
-    config: any;
-    info: {
-      __typename?: 'AppInfo';
-      id: string;
-      port: number;
-      name: string;
-      description: string;
-      available: boolean;
-      version?: string | null;
-      image: string;
-      short_desc: string;
-      author: string;
-      source: string;
-      categories: Array<AppCategoriesEnum>;
-      url_suffix?: string | null;
-      form_fields: Array<{
-        __typename?: 'FormField';
-        type: FieldTypesEnum;
-        label: string;
-        max?: number | null;
-        min?: number | null;
-        hint?: string | null;
-        required?: boolean | null;
-        env_variable: string;
-      }>;
-    };
-  };
-};
 
-export type InstalledAppsQueryVariables = Exact<{ [key: string]: never }>;
+export type GetAppQuery = { __typename?: 'Query', getApp: { __typename?: 'App', id: string, status: AppStatusEnum, config: any, info: { __typename?: 'AppInfo', id: string, port: number, name: string, description: string, available: boolean, version?: string | null, image: string, short_desc: string, author: string, source: string, categories: Array<AppCategoriesEnum>, url_suffix?: string | null, form_fields: Array<{ __typename?: 'FormField', type: FieldTypesEnum, label: string, max?: number | null, min?: number | null, hint?: string | null, required?: boolean | null, env_variable: string }> } } };
 
-export type InstalledAppsQuery = {
-  __typename?: 'Query';
-  installedApps: Array<{
-    __typename?: 'App';
-    id: string;
-    status: AppStatusEnum;
-    config: any;
-    info: { __typename?: 'AppInfo'; id: string; name: string; description: string; image: string; short_desc: string };
-  }>;
-};
+export type InstalledAppsQueryVariables = Exact<{ [key: string]: never; }>;
 
-export type ConfiguredQueryVariables = Exact<{ [key: string]: never }>;
 
-export type ConfiguredQuery = { __typename?: 'Query'; isConfigured: boolean };
+export type InstalledAppsQuery = { __typename?: 'Query', installedApps: Array<{ __typename?: 'App', id: string, status: AppStatusEnum, config: any, info: { __typename?: 'AppInfo', id: string, name: string, description: string, image: string, short_desc: string } }> };
 
-export type ListAppsQueryVariables = Exact<{ [key: string]: never }>;
+export type ConfiguredQueryVariables = Exact<{ [key: string]: never; }>;
 
-export type ListAppsQuery = {
-  __typename?: 'Query';
-  listAppsInfo: {
-    __typename?: 'ListAppsResonse';
-    total: number;
-    apps: Array<{
-      __typename?: 'AppInfo';
-      id: string;
-      available: boolean;
-      image: string;
-      port: number;
-      name: string;
-      version?: string | null;
-      short_desc: string;
-      author: string;
-      categories: Array<AppCategoriesEnum>;
-    }>;
-  };
-};
 
-export type MeQueryVariables = Exact<{ [key: string]: never }>;
+export type ConfiguredQuery = { __typename?: 'Query', isConfigured: boolean };
 
-export type MeQuery = { __typename?: 'Query'; me?: { __typename?: 'User'; id: string } | null };
+export type ListAppsQueryVariables = Exact<{ [key: string]: never; }>;
 
-export type SystemInfoQueryVariables = Exact<{ [key: string]: never }>;
 
-export type SystemInfoQuery = {
-  __typename?: 'Query';
-  systemInfo?: {
-    __typename?: 'SystemInfoResponse';
-    cpu: { __typename?: 'Cpu'; load: number };
-    disk: { __typename?: 'DiskMemory'; available: number; used: number; total: number };
-    memory: { __typename?: 'DiskMemory'; available: number; used: number; total: number };
-  } | null;
-};
+export type ListAppsQuery = { __typename?: 'Query', listAppsInfo: { __typename?: 'ListAppsResonse', total: number, apps: Array<{ __typename?: 'AppInfo', id: string, available: boolean, image: string, port: number, name: string, version?: string | null, short_desc: string, author: string, categories: Array<AppCategoriesEnum> }> } };
+
+export type MeQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type MeQuery = { __typename?: 'Query', me?: { __typename?: 'User', id: string } | null };
+
+export type SystemInfoQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type SystemInfoQuery = { __typename?: 'Query', systemInfo?: { __typename?: 'SystemInfoResponse', cpu: { __typename?: 'Cpu', load: number }, disk: { __typename?: 'DiskMemory', available: number, used: number, total: number }, memory: { __typename?: 'DiskMemory', available: number, used: number, total: number } } | null };
+
+export type VersionQueryVariables = Exact<{ [key: string]: never; }>;
 
-export type VersionQueryVariables = Exact<{ [key: string]: never }>;
 
-export type VersionQuery = { __typename?: 'Query'; version: { __typename?: 'VersionResponse'; current: string; latest?: string | null } };
+export type VersionQuery = { __typename?: 'Query', version: { __typename?: 'VersionResponse', current: string, latest?: string | null } };
+
 
 export const InstallAppDocument = gql`
-  mutation InstallApp($input: AppInputType!) {
-    installApp(input: $input) {
-      id
-      status
-      __typename
-    }
+    mutation InstallApp($input: AppInputType!) {
+  installApp(input: $input) {
+    id
+    status
+    __typename
   }
-`;
+}
+    `;
 export type InstallAppMutationFn = Apollo.MutationFunction<InstallAppMutation, InstallAppMutationVariables>;
 
 /**
@@ -377,21 +334,21 @@ export type InstallAppMutationFn = Apollo.MutationFunction<InstallAppMutation, I
  * });
  */
 export function useInstallAppMutation(baseOptions?: Apollo.MutationHookOptions<InstallAppMutation, InstallAppMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<InstallAppMutation, InstallAppMutationVariables>(InstallAppDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<InstallAppMutation, InstallAppMutationVariables>(InstallAppDocument, options);
+      }
 export type InstallAppMutationHookResult = ReturnType<typeof useInstallAppMutation>;
 export type InstallAppMutationResult = Apollo.MutationResult<InstallAppMutation>;
 export type InstallAppMutationOptions = Apollo.BaseMutationOptions<InstallAppMutation, InstallAppMutationVariables>;
 export const LoginDocument = gql`
-  mutation Login($input: UsernamePasswordInput!) {
-    login(input: $input) {
-      user {
-        id
-      }
+    mutation Login($input: UsernamePasswordInput!) {
+  login(input: $input) {
+    user {
+      id
     }
   }
-`;
+}
+    `;
 export type LoginMutationFn = Apollo.MutationFunction<LoginMutation, LoginMutationVariables>;
 
 /**
@@ -412,17 +369,17 @@ export type LoginMutationFn = Apollo.MutationFunction<LoginMutation, LoginMutati
  * });
  */
 export function useLoginMutation(baseOptions?: Apollo.MutationHookOptions<LoginMutation, LoginMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<LoginMutation, LoginMutationVariables>(LoginDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<LoginMutation, LoginMutationVariables>(LoginDocument, options);
+      }
 export type LoginMutationHookResult = ReturnType<typeof useLoginMutation>;
 export type LoginMutationResult = Apollo.MutationResult<LoginMutation>;
 export type LoginMutationOptions = Apollo.BaseMutationOptions<LoginMutation, LoginMutationVariables>;
 export const LogoutDocument = gql`
-  mutation Logout {
-    logout
-  }
-`;
+    mutation Logout {
+  logout
+}
+    `;
 export type LogoutMutationFn = Apollo.MutationFunction<LogoutMutation, LogoutMutationVariables>;
 
 /**
@@ -442,21 +399,21 @@ export type LogoutMutationFn = Apollo.MutationFunction<LogoutMutation, LogoutMut
  * });
  */
 export function useLogoutMutation(baseOptions?: Apollo.MutationHookOptions<LogoutMutation, LogoutMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<LogoutMutation, LogoutMutationVariables>(LogoutDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<LogoutMutation, LogoutMutationVariables>(LogoutDocument, options);
+      }
 export type LogoutMutationHookResult = ReturnType<typeof useLogoutMutation>;
 export type LogoutMutationResult = Apollo.MutationResult<LogoutMutation>;
 export type LogoutMutationOptions = Apollo.BaseMutationOptions<LogoutMutation, LogoutMutationVariables>;
 export const RegisterDocument = gql`
-  mutation Register($input: UsernamePasswordInput!) {
-    register(input: $input) {
-      user {
-        id
-      }
+    mutation Register($input: UsernamePasswordInput!) {
+  register(input: $input) {
+    user {
+      id
     }
   }
-`;
+}
+    `;
 export type RegisterMutationFn = Apollo.MutationFunction<RegisterMutation, RegisterMutationVariables>;
 
 /**
@@ -477,21 +434,21 @@ export type RegisterMutationFn = Apollo.MutationFunction<RegisterMutation, Regis
  * });
  */
 export function useRegisterMutation(baseOptions?: Apollo.MutationHookOptions<RegisterMutation, RegisterMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<RegisterMutation, RegisterMutationVariables>(RegisterDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<RegisterMutation, RegisterMutationVariables>(RegisterDocument, options);
+      }
 export type RegisterMutationHookResult = ReturnType<typeof useRegisterMutation>;
 export type RegisterMutationResult = Apollo.MutationResult<RegisterMutation>;
 export type RegisterMutationOptions = Apollo.BaseMutationOptions<RegisterMutation, RegisterMutationVariables>;
 export const StartAppDocument = gql`
-  mutation StartApp($id: String!) {
-    startApp(id: $id) {
-      id
-      status
-      __typename
-    }
+    mutation StartApp($id: String!) {
+  startApp(id: $id) {
+    id
+    status
+    __typename
   }
-`;
+}
+    `;
 export type StartAppMutationFn = Apollo.MutationFunction<StartAppMutation, StartAppMutationVariables>;
 
 /**
@@ -512,21 +469,21 @@ export type StartAppMutationFn = Apollo.MutationFunction<StartAppMutation, Start
  * });
  */
 export function useStartAppMutation(baseOptions?: Apollo.MutationHookOptions<StartAppMutation, StartAppMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<StartAppMutation, StartAppMutationVariables>(StartAppDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<StartAppMutation, StartAppMutationVariables>(StartAppDocument, options);
+      }
 export type StartAppMutationHookResult = ReturnType<typeof useStartAppMutation>;
 export type StartAppMutationResult = Apollo.MutationResult<StartAppMutation>;
 export type StartAppMutationOptions = Apollo.BaseMutationOptions<StartAppMutation, StartAppMutationVariables>;
 export const StopAppDocument = gql`
-  mutation StopApp($id: String!) {
-    stopApp(id: $id) {
-      id
-      status
-      __typename
-    }
+    mutation StopApp($id: String!) {
+  stopApp(id: $id) {
+    id
+    status
+    __typename
   }
-`;
+}
+    `;
 export type StopAppMutationFn = Apollo.MutationFunction<StopAppMutation, StopAppMutationVariables>;
 
 /**
@@ -547,21 +504,21 @@ export type StopAppMutationFn = Apollo.MutationFunction<StopAppMutation, StopApp
  * });
  */
 export function useStopAppMutation(baseOptions?: Apollo.MutationHookOptions<StopAppMutation, StopAppMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<StopAppMutation, StopAppMutationVariables>(StopAppDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<StopAppMutation, StopAppMutationVariables>(StopAppDocument, options);
+      }
 export type StopAppMutationHookResult = ReturnType<typeof useStopAppMutation>;
 export type StopAppMutationResult = Apollo.MutationResult<StopAppMutation>;
 export type StopAppMutationOptions = Apollo.BaseMutationOptions<StopAppMutation, StopAppMutationVariables>;
 export const UninstallAppDocument = gql`
-  mutation UninstallApp($id: String!) {
-    uninstallApp(id: $id) {
-      id
-      status
-      __typename
-    }
+    mutation UninstallApp($id: String!) {
+  uninstallApp(id: $id) {
+    id
+    status
+    __typename
   }
-`;
+}
+    `;
 export type UninstallAppMutationFn = Apollo.MutationFunction<UninstallAppMutation, UninstallAppMutationVariables>;
 
 /**
@@ -582,21 +539,21 @@ export type UninstallAppMutationFn = Apollo.MutationFunction<UninstallAppMutatio
  * });
  */
 export function useUninstallAppMutation(baseOptions?: Apollo.MutationHookOptions<UninstallAppMutation, UninstallAppMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<UninstallAppMutation, UninstallAppMutationVariables>(UninstallAppDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<UninstallAppMutation, UninstallAppMutationVariables>(UninstallAppDocument, options);
+      }
 export type UninstallAppMutationHookResult = ReturnType<typeof useUninstallAppMutation>;
 export type UninstallAppMutationResult = Apollo.MutationResult<UninstallAppMutation>;
 export type UninstallAppMutationOptions = Apollo.BaseMutationOptions<UninstallAppMutation, UninstallAppMutationVariables>;
 export const UpdateAppConfigDocument = gql`
-  mutation UpdateAppConfig($input: AppInputType!) {
-    updateAppConfig(input: $input) {
-      id
-      status
-      __typename
-    }
+    mutation UpdateAppConfig($input: AppInputType!) {
+  updateAppConfig(input: $input) {
+    id
+    status
+    __typename
   }
-`;
+}
+    `;
 export type UpdateAppConfigMutationFn = Apollo.MutationFunction<UpdateAppConfigMutation, UpdateAppConfigMutationVariables>;
 
 /**
@@ -617,44 +574,44 @@ export type UpdateAppConfigMutationFn = Apollo.MutationFunction<UpdateAppConfigM
  * });
  */
 export function useUpdateAppConfigMutation(baseOptions?: Apollo.MutationHookOptions<UpdateAppConfigMutation, UpdateAppConfigMutationVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useMutation<UpdateAppConfigMutation, UpdateAppConfigMutationVariables>(UpdateAppConfigDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useMutation<UpdateAppConfigMutation, UpdateAppConfigMutationVariables>(UpdateAppConfigDocument, options);
+      }
 export type UpdateAppConfigMutationHookResult = ReturnType<typeof useUpdateAppConfigMutation>;
 export type UpdateAppConfigMutationResult = Apollo.MutationResult<UpdateAppConfigMutation>;
 export type UpdateAppConfigMutationOptions = Apollo.BaseMutationOptions<UpdateAppConfigMutation, UpdateAppConfigMutationVariables>;
 export const GetAppDocument = gql`
-  query GetApp($appId: String!) {
-    getApp(id: $appId) {
+    query GetApp($appId: String!) {
+  getApp(id: $appId) {
+    id
+    status
+    config
+    info {
       id
-      status
-      config
-      info {
-        id
-        port
-        name
-        description
-        available
-        version
-        image
-        short_desc
-        author
-        source
-        categories
-        url_suffix
-        form_fields {
-          type
-          label
-          max
-          min
-          hint
-          required
-          env_variable
-        }
+      port
+      name
+      description
+      available
+      version
+      image
+      short_desc
+      author
+      source
+      categories
+      url_suffix
+      form_fields {
+        type
+        label
+        max
+        min
+        hint
+        required
+        env_variable
       }
     }
   }
-`;
+}
+    `;
 
 /**
  * __useGetAppQuery__
@@ -673,32 +630,32 @@ export const GetAppDocument = gql`
  * });
  */
 export function useGetAppQuery(baseOptions: Apollo.QueryHookOptions<GetAppQuery, GetAppQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<GetAppQuery, GetAppQueryVariables>(GetAppDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<GetAppQuery, GetAppQueryVariables>(GetAppDocument, options);
+      }
 export function useGetAppLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetAppQuery, GetAppQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<GetAppQuery, GetAppQueryVariables>(GetAppDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<GetAppQuery, GetAppQueryVariables>(GetAppDocument, options);
+        }
 export type GetAppQueryHookResult = ReturnType<typeof useGetAppQuery>;
 export type GetAppLazyQueryHookResult = ReturnType<typeof useGetAppLazyQuery>;
 export type GetAppQueryResult = Apollo.QueryResult<GetAppQuery, GetAppQueryVariables>;
 export const InstalledAppsDocument = gql`
-  query InstalledApps {
-    installedApps {
+    query InstalledApps {
+  installedApps {
+    id
+    status
+    config
+    info {
       id
-      status
-      config
-      info {
-        id
-        name
-        description
-        image
-        short_desc
-      }
+      name
+      description
+      image
+      short_desc
     }
   }
-`;
+}
+    `;
 
 /**
  * __useInstalledAppsQuery__
@@ -716,21 +673,21 @@ export const InstalledAppsDocument = gql`
  * });
  */
 export function useInstalledAppsQuery(baseOptions?: Apollo.QueryHookOptions<InstalledAppsQuery, InstalledAppsQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<InstalledAppsQuery, InstalledAppsQueryVariables>(InstalledAppsDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<InstalledAppsQuery, InstalledAppsQueryVariables>(InstalledAppsDocument, options);
+      }
 export function useInstalledAppsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<InstalledAppsQuery, InstalledAppsQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<InstalledAppsQuery, InstalledAppsQueryVariables>(InstalledAppsDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<InstalledAppsQuery, InstalledAppsQueryVariables>(InstalledAppsDocument, options);
+        }
 export type InstalledAppsQueryHookResult = ReturnType<typeof useInstalledAppsQuery>;
 export type InstalledAppsLazyQueryHookResult = ReturnType<typeof useInstalledAppsLazyQuery>;
 export type InstalledAppsQueryResult = Apollo.QueryResult<InstalledAppsQuery, InstalledAppsQueryVariables>;
 export const ConfiguredDocument = gql`
-  query Configured {
-    isConfigured
-  }
-`;
+    query Configured {
+  isConfigured
+}
+    `;
 
 /**
  * __useConfiguredQuery__
@@ -748,34 +705,34 @@ export const ConfiguredDocument = gql`
  * });
  */
 export function useConfiguredQuery(baseOptions?: Apollo.QueryHookOptions<ConfiguredQuery, ConfiguredQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<ConfiguredQuery, ConfiguredQueryVariables>(ConfiguredDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<ConfiguredQuery, ConfiguredQueryVariables>(ConfiguredDocument, options);
+      }
 export function useConfiguredLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ConfiguredQuery, ConfiguredQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<ConfiguredQuery, ConfiguredQueryVariables>(ConfiguredDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<ConfiguredQuery, ConfiguredQueryVariables>(ConfiguredDocument, options);
+        }
 export type ConfiguredQueryHookResult = ReturnType<typeof useConfiguredQuery>;
 export type ConfiguredLazyQueryHookResult = ReturnType<typeof useConfiguredLazyQuery>;
 export type ConfiguredQueryResult = Apollo.QueryResult<ConfiguredQuery, ConfiguredQueryVariables>;
 export const ListAppsDocument = gql`
-  query ListApps {
-    listAppsInfo {
-      apps {
-        id
-        available
-        image
-        port
-        name
-        version
-        short_desc
-        author
-        categories
-      }
-      total
+    query ListApps {
+  listAppsInfo {
+    apps {
+      id
+      available
+      image
+      port
+      name
+      version
+      short_desc
+      author
+      categories
     }
+    total
   }
-`;
+}
+    `;
 
 /**
  * __useListAppsQuery__
@@ -793,23 +750,23 @@ export const ListAppsDocument = gql`
  * });
  */
 export function useListAppsQuery(baseOptions?: Apollo.QueryHookOptions<ListAppsQuery, ListAppsQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<ListAppsQuery, ListAppsQueryVariables>(ListAppsDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<ListAppsQuery, ListAppsQueryVariables>(ListAppsDocument, options);
+      }
 export function useListAppsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ListAppsQuery, ListAppsQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<ListAppsQuery, ListAppsQueryVariables>(ListAppsDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<ListAppsQuery, ListAppsQueryVariables>(ListAppsDocument, options);
+        }
 export type ListAppsQueryHookResult = ReturnType<typeof useListAppsQuery>;
 export type ListAppsLazyQueryHookResult = ReturnType<typeof useListAppsLazyQuery>;
 export type ListAppsQueryResult = Apollo.QueryResult<ListAppsQuery, ListAppsQueryVariables>;
 export const MeDocument = gql`
-  query Me {
-    me {
-      id
-    }
+    query Me {
+  me {
+    id
   }
-`;
+}
+    `;
 
 /**
  * __useMeQuery__
@@ -827,35 +784,35 @@ export const MeDocument = gql`
  * });
  */
 export function useMeQuery(baseOptions?: Apollo.QueryHookOptions<MeQuery, MeQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<MeQuery, MeQueryVariables>(MeDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<MeQuery, MeQueryVariables>(MeDocument, options);
+      }
 export function useMeLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<MeQuery, MeQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<MeQuery, MeQueryVariables>(MeDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<MeQuery, MeQueryVariables>(MeDocument, options);
+        }
 export type MeQueryHookResult = ReturnType<typeof useMeQuery>;
 export type MeLazyQueryHookResult = ReturnType<typeof useMeLazyQuery>;
 export type MeQueryResult = Apollo.QueryResult<MeQuery, MeQueryVariables>;
 export const SystemInfoDocument = gql`
-  query SystemInfo {
-    systemInfo {
-      cpu {
-        load
-      }
-      disk {
-        available
-        used
-        total
-      }
-      memory {
-        available
-        used
-        total
-      }
+    query SystemInfo {
+  systemInfo {
+    cpu {
+      load
+    }
+    disk {
+      available
+      used
+      total
+    }
+    memory {
+      available
+      used
+      total
     }
   }
-`;
+}
+    `;
 
 /**
  * __useSystemInfoQuery__
@@ -873,24 +830,24 @@ export const SystemInfoDocument = gql`
  * });
  */
 export function useSystemInfoQuery(baseOptions?: Apollo.QueryHookOptions<SystemInfoQuery, SystemInfoQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<SystemInfoQuery, SystemInfoQueryVariables>(SystemInfoDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<SystemInfoQuery, SystemInfoQueryVariables>(SystemInfoDocument, options);
+      }
 export function useSystemInfoLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<SystemInfoQuery, SystemInfoQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<SystemInfoQuery, SystemInfoQueryVariables>(SystemInfoDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<SystemInfoQuery, SystemInfoQueryVariables>(SystemInfoDocument, options);
+        }
 export type SystemInfoQueryHookResult = ReturnType<typeof useSystemInfoQuery>;
 export type SystemInfoLazyQueryHookResult = ReturnType<typeof useSystemInfoLazyQuery>;
 export type SystemInfoQueryResult = Apollo.QueryResult<SystemInfoQuery, SystemInfoQueryVariables>;
 export const VersionDocument = gql`
-  query Version {
-    version {
-      current
-      latest
-    }
+    query Version {
+  version {
+    current
+    latest
   }
-`;
+}
+    `;
 
 /**
  * __useVersionQuery__
@@ -908,13 +865,13 @@ export const VersionDocument = gql`
  * });
  */
 export function useVersionQuery(baseOptions?: Apollo.QueryHookOptions<VersionQuery, VersionQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useQuery<VersionQuery, VersionQueryVariables>(VersionDocument, options);
-}
+        const options = {...defaultOptions, ...baseOptions}
+        return Apollo.useQuery<VersionQuery, VersionQueryVariables>(VersionDocument, options);
+      }
 export function useVersionLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<VersionQuery, VersionQueryVariables>) {
-  const options = { ...defaultOptions, ...baseOptions };
-  return Apollo.useLazyQuery<VersionQuery, VersionQueryVariables>(VersionDocument, options);
-}
+          const options = {...defaultOptions, ...baseOptions}
+          return Apollo.useLazyQuery<VersionQuery, VersionQueryVariables>(VersionDocument, options);
+        }
 export type VersionQueryHookResult = ReturnType<typeof useVersionQuery>;
 export type VersionLazyQueryHookResult = ReturnType<typeof useVersionLazyQuery>;
-export type VersionQueryResult = Apollo.QueryResult<VersionQuery, VersionQueryVariables>;
+export type VersionQueryResult = Apollo.QueryResult<VersionQuery, VersionQueryVariables>;

+ 13 - 1
packages/system-api/src/core/updates/v040.ts

@@ -1,6 +1,7 @@
 import logger from '../../config/logger/logger';
 import App from '../../modules/apps/app.entity';
 import { AppInfo, AppStatusEnum } from '../../modules/apps/apps.types';
+import User from '../../modules/auth/user.entity';
 import { deleteFolder, fileExists, readFile, readJsonFile } from '../../modules/fs/fs.helpers';
 import Update, { UpdateStatusEnum } from '../../modules/system/update.entity';
 
@@ -17,6 +18,7 @@ export const updateV040 = async (): Promise<void> => {
       return;
     }
 
+    // Migrate apps
     if (fileExists('/state/apps.json')) {
       const state: AppsState = await readJsonFile('/state/apps.json');
       const installed: string[] = state.installed.split(' ').filter(Boolean);
@@ -51,9 +53,19 @@ export const updateV040 = async (): Promise<void> => {
           logger.info('App already migrated');
         }
       }
+      deleteFolder('/state/apps.json');
+    }
+
+    // Migrate users
+    if (fileExists('/state/users.json')) {
+      const state: { email: string; password: string }[] = await readJsonFile('/state/users.json');
+
+      for (const user of state) {
+        await User.create({ username: user.email.trim().toLowerCase(), password: user.password }).save();
+      }
+      deleteFolder('/state/users.json');
     }
 
-    deleteFolder('/state/apps.json');
     await Update.create({ name: UPDATE_NAME, status: UpdateStatusEnum.SUCCESS }).save();
   } catch (error) {
     logger.error(error);

+ 1 - 0
packages/system-api/src/modules/apps/apps.types.ts

@@ -13,6 +13,7 @@ export enum AppCategoriesEnum {
   FEATURED = 'featured',
   BOOKS = 'books',
   DATA = 'data',
+  MUSIC = 'music',
 }
 
 export enum FieldTypes {