Harbour - Docker/Portainer management app for iOS

Overview

Harbour App icon

Harbour

Docker/Portainer management app for iOS

Features

  • Real-time data
  • See all of the container details (logs too!)
  • Handoff & background refresh
  • iOS & iPadOS support
  • Built in SwiftUI

Installation

Harbour is available on TestFlight, and will be available on the App Store too in the near future 😄

Alternative methods

  • Sideload .ipa from releases
  • Build it yourself

Coming up

  • Widgets
  • Siri/Shortcuts
  • watchOS app
  • Creating new containers
  • Attaching to containers (including ANSI escape codes & input)

Credits

Comments
  • iOS 14?

    iOS 14?

    Been using Harbour on my iPhone 11 Pro before it was even released as a TestFlight beta (sideloaded from github source). Love this project and happy to see that it's moving towards an app store release. One question though - I'm still on iOS 14 for work reasons, and cannot upgrade to iOS 15 yet. Is there any reason why the TestFlight build requires iOS 15 as the minimum compatible version? Any chance for iOS 14 being supported?

    opened by radiochild577 24
  • The data couldn't be read because it is missing

    The data couldn't be read because it is missing

    Describe the bug App show an error but there aren't any error error: Error! The data couldn't be read because it is missing

    Details

    • Device: 13,2 (12)
    • OS: 15.6
    • Harbour version v2.0.0#7
    • Portainer version [e.g. 2.9.2]

    **Container create command **: docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v portainer_data:/data portainer/portainer-ce

    Screenshots IMG_364313A309FF-1 IMG_81559436CAC1-1

    Bug 
    opened by KovD3v 13
  • Unable to login in the App to Portainer

    Unable to login in the App to Portainer

    Describe the bug Unable to login into the app.

    To Reproduce Steps to reproduce the behavior:

    On LAN, after installing from TestFlight and trying to authenticate I provide Portainer URL (https://192.168.0.100:9000) the portainer admin username and password and all I get is a spinning loader. No error no login.

    Access to Portainer using same credentials and url works fine from a lan browser. Expected behavior Able to login!

    Details (please complete the following information):

    • Device: iPhone 12Pro Max
    • OS: iOS 15.1.1
    • Harbour version: latest from TestFlight
    • Portainer version: latesr

    Container create command (if applicable): e.g. docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

    Additional context Add any other context about the problem here.

    Screenshots If applicable, add screenshots to help explain your problem.

    Bug 
    opened by SemoTech 7
  • Stuck at loading

    Stuck at loading

    Describe the bug Harbour is stuck at loading. When logging off and on again, all working fine. When the app is closed some time and want to reopen, it does not open. Stuck at loading , and on top “refreshing”

    Expected behavior A working refresh and login

    Details (please complete the following information):

    • Device: iPhone 12 Pro
    • OS: ios 15.1
    • Harbour version 2.0.0(4)
    • Portainer version: 2.11.0
    Bug 
    opened by Martinvdm 7
  • Can not load endpoints after login.

    Can not load endpoints after login.

    Describe the bug Can not load endpoints after login. Same issue after every attempt. It looks as if the results returned by the endpoints interface cannot be parsed.

    To Reproduce Steps to reproduce the behavior:

    1. Go to 'Log in' page
    2. Enter the correct url, credentials.
    3. Click on 'Log in'
    4. See error

    Expected behavior A dashboard page of all endpoints after login.

    Details:

    • Device: iPhone 11
    • OS: iOS 15.3
    • Harbour version v2.0.0#5
    • Portainer version 2.11.0

    Additional context In my portainer instance there are three endpoints :

    Endpoints interface return :

    [
      {
        "Id": 1,
        "Name": "hass.io",
        "Type": 1,
        "URL": "unix:///var/run/docker.sock",
        "GroupId": 1,
        "PublicURL": "",
        "TLSConfig": {
          "TLS": false,
          "TLSSkipVerify": false
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643508346,
            "DockerVersion": "20.10.9",
            "Swarm": false,
            "TotalCPU": 2,
            "TotalMemory": 2076291072,
            "RunningContainerCount": 14,
            "StoppedContainerCount": 0,
            "HealthyContainerCount": 0,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 0,
            "ImageCount": 23,
            "ServiceCount": 0,
            "StackCount": 0,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeKey": "",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": false
        },
        "LastCheckInDate": 0,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      },
      {
        "Id": 4,
        "Name": "cloud",
        "Type": 4,
        "URL": "http://127.0.0.1:0",
        "GroupId": 1,
        "PublicURL": "xxx.xxx",
        "TLSConfig": {
          "TLS": false,
          "TLSSkipVerify": false
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643450007,
            "DockerVersion": "20.10.12",
            "Swarm": false,
            "TotalCPU": 1,
            "TotalMemory": 2083811328,
            "RunningContainerCount": 4,
            "StoppedContainerCount": 1,
            "HealthyContainerCount": 0,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 2,
            "ImageCount": 8,
            "ServiceCount": 0,
            "StackCount": 1,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeID": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxx",
        "EdgeKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": true
        },
        "LastCheckInDate": 1643508545,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      },
      {
        "Id": 5,
        "Name": "nas",
        "Type": 2,
        "URL": "tcp://192.168.2.225:9001",
        "GroupId": 1,
        "PublicURL": "192.168.2.225",
        "TLSConfig": {
          "TLS": true,
          "TLSSkipVerify": true
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643508346,
            "DockerVersion": "20.10.3",
            "Swarm": false,
            "TotalCPU": 2,
            "TotalMemory": 10272227328,
            "RunningContainerCount": 7,
            "StoppedContainerCount": 4,
            "HealthyContainerCount": 1,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 1,
            "ImageCount": 11,
            "ServiceCount": 0,
            "StackCount": 0,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeKey": "",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": false
        },
        "LastCheckInDate": 0,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      }
    ]
    
    Bug 
    opened by john5du 5
  • Self-Signed Certificates support

    Self-Signed Certificates support

    I run Portainer with a self-signed SSL certificate. Would be handy to have an option (defaulted to "off") for ignoring certificate validation errors. I can't currently use Harbour because of this.

    Bug 
    opened by cpwood 3
  • Selecting an option for a container only works briefly

    Selecting an option for a container only works briefly

    First off thanks for making this open source! The design is fantastic, it feels more useful, in a lot of ways, than Portainer because it's less intimidating and has a very crisp UI.

    Describe the bug Whenever I select a container, then select one of the four options near the top (Mounts, Config, Network, or Logs), it successfully loads that screen, but after 1-5 seconds it kicks me out of that screen, back to the container view. ~~Here's a screen recording of the behavior~~ That link seems broken, try this instead

    Additionally, and this is much more minor, but in the settings menu, when I click on the first option, which is the dropdown with my server name, it shows two identical instances of the server, and shows that they're both "in use". Screenshot

    To Reproduce Steps to reproduce the behavior:

    1. Select any active container from the main menu
    2. Select either "Mounts", "Network", "Config", or "Logs"
    3. Wait

    Expected behavior Allow browsing of these menus

    Details (please complete the following information):

    • Device: iPhone 12 Pro Max
    • OS: iOS 15.4.1
    • Harbour version v2.0.0#7 (Tried both TestFlight and Sideloaded)
    • Portainer version 2.14.1
    opened by kylefmohr 2
  • Widgets for container status

    Widgets for container status

    Is your feature request related to a problem? Please describe. Not related to any problem.

    Describe the solution you'd like Widgets that show container status (online, stopped, crashed, whatever portainer knows)

    Unrelated Not sure if it's on the feature list, but ram/cpu usage per container as well

    Enhancement 
    opened by Nahydrin 2
  • Container details for type 2 do not load properly.

    Container details for type 2 do not load properly.

    Describe the bug Container details for type 2 do not load properly, only the log tab loads properly.

    Details:

    • Device: iPhone 11
    • OS: iOS 15.3
    • Harbour version v2.0.0#6
    • Portainer version 2.11.1

    Screenshots

    image

    Bug 
    opened by john5du 1
  • Expire TestFlight IOS

    Expire TestFlight IOS

    Hi,

    Hopefully you are already aware but the TestFlight version is going to expire in 9 days.

    Is there maybe a new version with lots of goodies?

    Many thanks

    opened by thisiscrazy2701 1
  • The log cannot be displayed in Chinese

    The log cannot be displayed in Chinese

    Describe the bug

    The log cannot be displayed in Chinese.

    Details (please complete the following information):

    • Device: iPhone13
    • OS: ios16.beta6
    • Harbour version v2.0.0
    • Portainer version 2.9.2

    Container create command (if applicable): e.g. docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

    Screenshots image

    Bug 
    opened by WuhanSy 0
  • Update/pull images

    Update/pull images

    Describe the solution you'd like The ability to manually update/recreate/repull images.

    Describe alternatives you've considered Using the Portainer UI on mobile, which is definitely not ideal.

    Enhancement 
    opened by Nojwe 0
  • The data couldn't be read because it isn't in the correct format.

    The data couldn't be read because it isn't in the correct format.

    Describe the bug Login with "The data couldn't be read because it isn't in the correct format" error.

    To Reproduce

    1. Fill in portainer URL and access token
    2. Click on login button
    3. See error

    Expected behavior Can successfully login

    Details (please complete the following information):

    • Device: iPhone 13 Pro
    • OS: iOS 16.1
    • Harbour version: lastest from Testflight
    • Portainer version: lastest

    Screenshots IMG_9880

    Bug 
    opened by ted1ore1ee 11
  • "At-A-Glance" Type Views

    The default container view of all stopped/running containers does not give the viewer any sense of context. Are all services healthy? Are all services up (i.e. 1/1, 3/3, or 9/9)? Is the environment good?

    In the container world, I don't care about containers. Kittens vs Cattle. I want to know the environment is healthy, if the stacks are running, if the services are fully scheduled. That's "green" to me.

    If I care about a container or diving deep, then let me drill down, but I feel my first layer view should tell me all the things I need to know. Seeing a list of containers, both stopped and running is confusing to know if "my environment is healthy or not". A list of containers is only useful when I have less than 5 containers and I know and care for all of them (kittens). In a "cattle" environment, I care about stacks, services, and health checks. I can't remember the names of all 36 of my running containers.

    The stack details view has all the information I need to know I'm good.

    image

    All of my services are fully scheduled (1/1 and 3/3), and the last update was what I expected it to be. I don't need to look at any container because I know everything is up.

    Enhancement 
    opened by jnovack 0
  • ANSI Console Colors in Container Logs

    ANSI Console Colors in Container Logs

    The Container logs are printed raw into the UI.

    If logs contains ANSI Console Colors they are printed, instead the should be colored in the color of the color code.

    Ohne Titel

    normally it should by like this Bildschirmfoto 2022-03-30 um 17 59 55

    Enhancement 
    opened by ExtremTechniker 1
  • Error

    Error "Invalid URL" with correct Portainer URL

    Describe the bug I am entering my Portainer endpoint which is located at https://my.domain.com/portainer/ (trailing slash is important here) and add my credentials to login. I get the error message "Invalid URL" even though the endpoint works and I can login at that URL in the browser.

    To Reproduce Steps to reproduce the behavior: Login with an external HTTPS Portainer URL and subpath e.g. /portainer/ that ends in a trailing slash

    Expected behavior I should be able to login with my external URL

    Details (please complete the following information):

    • Device: iPhone 12 Pro
    • OS: iOS 15.3.1
    • Harbour version v2.0.0#5
    • Portainer version 2.11.1

    Additional context If I enter the address without "https://" I get an endlessly spinning circle. If I enter my internal Container IP address and Port http://xxx.xxx.xxx.xxx:9000 I can login.

    The Container is deployed normally with a docker compose file and exposed via Traefik. Though my current setup explicitly needs the URL to end in /portainer/ with the trailing slash.

    Bug 
    opened by Tech-Non 2
Releases(v3.0.0-5)
AppLove - View iOS app reviews in multiple selected territories with translation option.

App Love Note: Swift Version 2.2 currently, will update to Swift 3/XCode 8 after cocoapods are updated to Swift 3. Features View iOS Customer App Revi

Woodie Dovich 52 Nov 19, 2022
IOS - Unofficial app for Swift Evolution

EVOlution - iOS The goal of this project is for the version 1.0 was: bring to iOS the experience provided by Swift Evolution website. Now we are shift

EVOlution App 235 Dec 19, 2022
Buglife-iOS - Awesome bug reporting for iOS apps

Buglife is an awesome bug reporting SDK & web platform for iOS apps. Here's how it works: User takes a screenshot, or stops screen recording User anno

Buglife 498 Dec 17, 2022
A native Jellyfin client for Apple platforms (iOS, macOS and tvOS)

Jellyfin Swift (working title) is a native Swift app targeting all modern Apple devices (iOS, ipadOS, tvOS and macOS).

Julien Machiels 3 Jun 7, 2021
Awesome-ML - Discover, download, compile & launch different image processing & style transfer CoreML models on iOS.

⚠️ ⚠️ ⚠️ IMPORTANT: I'm no longer maintaining Awesome-ML. Awesome ML is an iOS app that is made to demonstrate different image processing CoreML model

eugene 171 Nov 8, 2022
BaseConverter-iOS - The fast and easy way to convert numbers with tons of possibilities!

BaseConverter-iOS The fast and easy way to convert numbers with tons of possibilities! With BaseConverter, convert your numbers from and to: Decimal B

Groupe MINASTE 3 Feb 8, 2022
Dash-iOS - Dash gives your iPad and iPhone instant offline access to 200+ API documentation sets

Discontinued Dash for iOS was discontinued. Please check out Dash for macOS instead. Dash for iOS Dash gives your iPad and iPhone instant offline acce

Bogdan Popescu 7.1k Dec 29, 2022
Learning Swift using Docker containers as development environment

100-days-of-swift Small setup to help me learn Swift. I don't own a mac so this is what I came up with ?? .

Diogo Cavaleiro 1 Feb 14, 2022
Docker images for Swift on Raspberry Pi and other ARM devices from balena's base images.

Swift on Balena Welcome to Swift on Balena – a set of Docker images for Swift on Raspberry Pi and other ARM devices. These images are based on balena'

Will Lisac 173 Dec 5, 2022
Quillow is an elegant book management app on the App Store that allows you to search, add and track the books you've consumed.

Quillow Quillow is an elegant book management app on the App Store that allows you to search, add and track the books you've consumed. Please use the

Daniyal Mohammed 3 Aug 29, 2022
MerchantKit - A modern In-App Purchases management framework for iOS developers

MerchantKit dramatically simplifies the work indie developers have to do in order to add premium monetizable components to their applications. Track purchased products, offer auto-renewing subscriptions, restore transactions, and much more.

Benjamin Mayo 1.1k Dec 17, 2022
Alfresco iOS App - Alfresco is the open platform for business-critical content management and collaboration.

Welcome to the Alfresco iOS App Alfresco is the open platform for business-critical content management and collaboration. Alfresco Mobile was designed

Alfresco Software 42 Sep 26, 2022
🟣 Verge is a very tunable state-management engine on iOS App (UIKit / SwiftUI) and built-in ORM.

Verge is giving the power of state-management in muukii/Brightroom v2 development! Verge.swift ?? An effective state management architecture for iOS -

VergeGroup 478 Dec 29, 2022
A modern In-App Purchases management framework for iOS.

MerchantKit A modern In-App Purchases management framework for iOS developers. MerchantKit dramatically simplifies the work indie developers have to d

Benjamin Mayo 1.1k Dec 17, 2022
🟣 Verge is a very tunable state-management engine on iOS App (UIKit / SwiftUI) and built-in ORM.

Verge.swift ?? An effective state management architecture for iOS - UIKit and also SwiftUI ?? _ An easier way to get unidirectional data flow _ _ Supp

VergeGroup 478 Dec 29, 2022
A simple Student Management on an iOS App

Student Management XCode Swift App A simple Student Management on an Xcode Swift App Table of Contents About the projects Technologies Features Setup

Long Ta 0 Dec 3, 2021
Event management iOS app for organizers using Open Event Platform

Open Event Organizer iOS App Event management app for organizers using Open Event Platform Roadmap Make the app functionality and UI/UX similar to the

FOSSASIA 1.5k Dec 29, 2022
Demo app for SwiftUI state management

StateObject vs ObservedObject Demo Demo app for SwiftUI state management Run the app and push 3 buttons to increase each counter. Toggle one of the to

Serhii Kyrylenko 0 Oct 13, 2021
Simple implementation of asset management app UI using swiftUI

MyAssets (자산관리 앱 만들기) swiftUI를 이용하여 자산관리 앱 UI를 간략하게 구현 (swiftUI를 익히기 위함) 초기 화면 1. Tab bar 구현 자산, 추천, 알람, 설정 탭 구현 2. Navigation bar 구현 1) leading에 titl

null 0 Dec 9, 2021
An open-source task management app for daily general operations

Taskaholic An open-source task management app for daily general operations, sepa

Aiden 1 Sep 19, 2022