From cbc9916eb89fe66f0ad06ab9b3003d073d2e816e Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 15 Sep 2022 20:31:08 +0000 Subject: [PATCH] --- devdocs/todo.txt | 84 +++++++++++++--------------------- server/AyaNova/Program.cs | 9 ++++ server/AyaNova/util/License.cs | 14 +----- 3 files changed, 43 insertions(+), 64 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 4da9b9cf..398842a3 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -36,7 +36,39 @@ TODO: Get teh amount of space a HUGE seeded database consumes -TODO: SUBSCRIPTION CHANGES +TODO: SUBSCRIPTION CHANGES DATA VOLUME +ACTUALLY, it's not super easy to get file space used surprisingly, and also it's time consuming and disk io intensive as it has to enumerate every file +and subdirectory one at a time, a better option is to find a way to create a fixed volume in linux dedicated to ayanova, put all the data in it +and use that and if they pay for more then can use a volume in a storage location. + +Also that means AyaNova is not having to make sure they don't crash AyaNova by using up too much space, instead, the volume is fixed and it becomes a matter of +checking for free space only, not counting files + + +TODO: DOCUMENT A NEW droplet has about 21gb of free space. We could say 20 and 1 bonus but meh, 21 sounds better. + So this needs to be turned into a volume dedicated to data usage and maybe leave the 1gb on the /dev/vda1 and put the 20gb on the new volume purely for data storage + actually 21gb this is a generic setup with no data generated yet: + Filesystem Size Used Avail Use% Mounted on + tmpfs 98M 1.1M 97M 2% /run + /dev/vda1 25G 4.0G 21G 17% / + tmpfs 486M 28K 486M 1% /dev/shm + tmpfs 5.0M 0 5.0M 0% /run/lock + /dev/vda15 105M 5.3M 100M 5% /boot/efi + tmpfs 98M 4.0K 98M 1% /run/user/0 + + + Filesystem 1K-blocks Used Available Use% Mounted on + tmpfs 99444 1116 98328 2% /run + /dev/vda1 25215872 4131840 21067648 17% / + tmpfs 497220 28 497192 1% /dev/shm + tmpfs 5120 0 5120 0% /run/lock + /dev/vda15 106858 5329 101529 5% /boot/efi + tmpfs 99444 4 99440 1% /run/user/0 +TEST: cheapest storage for attachments possible, test out creating a new droplet with block storage to hold the attachment files to see if it's possible, how it's done and mapped etc + + +probably not a good idea down here -----v + private const string MAXIMUM_DATA_GB_FEATURE_NAME = "MaximumDataGB"; If license doesn't have it and it's subscrkiption then the default is 20gb ATTACHMENT / DATA CAP have a maximum attachment / data cap size that can be configured for subscriptions @@ -151,26 +183,6 @@ todo: move howto's from digitalocean folder to documentation for rockfish so it todo: what are "reserved ip's" referenced on create droplet page? Sounds like a possible solution to the endless new certs issue maybe? -TODO: DOCUMENT A NEW droplet has about 21gb of free space. We could say 20 and 1 bonus but meh, 21 sounds better. - So this needs to be turned into a volume dedicated to data usage and maybe leave the 1gb on the /dev/vda1 and put the 20gb on the new volume purely for data storage - actually 21gb this is a generic setup with no data generated yet: - Filesystem Size Used Avail Use% Mounted on - tmpfs 98M 1.1M 97M 2% /run - /dev/vda1 25G 4.0G 21G 17% / - tmpfs 486M 28K 486M 1% /dev/shm - tmpfs 5.0M 0 5.0M 0% /run/lock - /dev/vda15 105M 5.3M 100M 5% /boot/efi - tmpfs 98M 4.0K 98M 1% /run/user/0 - - - Filesystem 1K-blocks Used Available Use% Mounted on - tmpfs 99444 1116 98328 2% /run - /dev/vda1 25215872 4131840 21067648 17% / - tmpfs 497220 28 497192 1% /dev/shm - tmpfs 5120 0 5120 0% /run/lock - /dev/vda15 106858 5329 101529 5% /boot/efi - tmpfs 99444 4 99440 1% /run/user/0 - @@ -199,44 +211,14 @@ todo: Uptime monitoring for customers servers, going to need something, can't be https://www.digitalocean.com/products/uptime-monitoring https://docs.digitalocean.com/reference/api/api-reference/#operation/monitoring_get_dropletFilesystemFreeMetrics -todo: update the test servers whichever are around, I've done my dev test.helloayanova.com, but should also do a261 and the eval ones - todo: research stuff below, then website stuff and move on -REVISIT PRICING: -This is interesting -The HaveAByte AyaNova hosting rate is $15 per month per scheduleable user, with a minimum of $100/month. It doesn’t matter which version you’re on, which options you have, or add-ons you have purchased, which parts you use, or don’t use. There is also a one-time setup fee of $299. That’s it! - -I'm thinking of reducing the price, 50 seems way too high for most people, perhaps we too can do a minimum per month and lower the per user costs? Maybe more around the 25-30 dollar range?? L8ER >>>>>>>>>>>>>>>>>>>> -todo: jmeter load testing surfaced this in the log: -it's actually part of one of the tests, not sure if I should axe it or keep it, but it does tend to fill the log -Non existant translation keys requested: PMTemplate,PartInventoryList,NotificationSettings,FilterUnsaved,WorkOrderTemplate - -todo: Howto doc in digitalocean work folder sb moved into rockfish docs as central location / cheat sheet when on the road - -RESEARCH: EMAIL server replacement -sendgrid / email system can we have a domain just for our notifications for those that don't use their own domain and use for all users (but NOT tied to AyaNova.com) -https://linuxhandbook.com/set-up-discourse-digital-ocean/ has an example of discourse with Mailgun freen email ssytem and a domain -(NOT MAILCHIMP AFTER HACK that affected digitalocean they sound like dicks) -NOTE: this is important for our business as well as we want to stop using our own mail server and we want ensured delivery of business emails which we do not have right now to all microsoft mail customers which is huge -RESEARCH: -Sendgrid is for sending out notifiations stuff like that, not a full on email provider, just a deliverer - -Fastmail looks like a good option because only need to pay for one account and can have up to 500 aliases so basically pay for support@ayannova.com but can receive on sales@ayanova.com etc and when sending will look like comes -Also they only do email, they don't use email for marketing or data gathering, there are real people to talk to if an issue wherease google is almost impossiible, they are cheaper than google etc -from sales@ayanova.com so in essence it's all that is needed. -There are issues though with keeping mail on their server, Ideally I would copy all to local on thunderbird and backup local folder here which makes sense. -TODO: figure out how to copy all email to local folders and any new mail coming in or sent out to local folders automatically so that if the mail provider gets toasted nothing is lost - https://support.mozilla.org/en-US/questions/1079742 -TODO: backup email locally in some automated way as localfolders now contains all the cardjohn email in that one place and in future will have all the old biz email too - I'm seeing I used to have all my profile in c:\data\thunderbird but now it's in some other folder so move it back to data and add it to the regular backup rotation -TEST: cheapest storage for attachments possible, test out creating a new droplet with block storage to hold the attachment files to see if it's possible, how it's done and mapped etc todo: shareit once we know the optional add-on's people can buy for subscription need prodcut pages with shareit to actually sell that shit and also options in rockfish so it displays in the license, in fact rockfish should allow quantities with the options but currently doesn't which is just wrong diff --git a/server/AyaNova/Program.cs b/server/AyaNova/Program.cs index 64176073..190efdad 100644 --- a/server/AyaNova/Program.cs +++ b/server/AyaNova/Program.cs @@ -259,8 +259,13 @@ namespace AyaNova logger.Info(".Net Version - {0}", Environment.Version.ToString()); logger.Debug("CPU count - {0}", Environment.ProcessorCount); logger.Debug("RAM - {0}", FileUtil.GetBytesReadable(GC.GetGCMemoryInfo().TotalAvailableMemoryBytes)); +#if (SUBSCRIPTION_BUILD) + logger.Debug("Available data storage - {0}", FileUtil.GetBytesReadable(AttachmentFilesAvailableSpace)); +#else logger.Debug("Backup file space - {0}", FileUtil.GetBytesReadable(UtilityFilesAvailableSpace)); logger.Debug("Attachments file space - {0}", FileUtil.GetBytesReadable(AttachmentFilesAvailableSpace)); +#endif + ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("Boot path", startFolder); ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("OS", Environment.OSVersion.ToString()); @@ -274,8 +279,12 @@ namespace AyaNova ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("OS Locale", System.Globalization.CultureInfo.CurrentCulture.EnglishName); ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("RAM", FileUtil.GetBytesReadable(GC.GetGCMemoryInfo().TotalAvailableMemoryBytes)); +#if (SUBSCRIPTION_BUILD) + ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("Available data storage", FileUtil.GetBytesReadable(AttachmentFilesAvailableSpace)); +#else ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("Backup space", FileUtil.GetBytesReadable(UtilityFilesAvailableSpace)); ServerBootConfig.BOOT_DIAGNOSTIC_INFO.Add("Attachments space", FileUtil.GetBytesReadable(AttachmentFilesAvailableSpace)); +#endif diff --git a/server/AyaNova/util/License.cs b/server/AyaNova/util/License.cs index 73c6e83f..3b69b002 100644 --- a/server/AyaNova/util/License.cs +++ b/server/AyaNova/util/License.cs @@ -68,10 +68,6 @@ namespace AyaNova.Core //ActiveCustomerUsers subscription license private const string ACTIVE_CUSTOMER_USERS_FEATURE_NAME = "ActiveCustomerUsers"; - //Subscription maximum data folder size (includes db and all files created by AyaNova or attached etc) - private const string MAXIMUM_DATA_GB_FEATURE_NAME = "MaximumDataGB"; - private const int DEFAULT_MAXIMUM_DATA_GB = 20; - //This feature name means it's a trial key private const string TRIAL_FEATURE_NAME = "TrialMode"; @@ -164,14 +160,6 @@ namespace AyaNova.Core } } - public long MaxiumDataGB - { - get - { - return GetLicenseFeature(MAXIMUM_DATA_GB_FEATURE_NAME)?.Count ?? DEFAULT_MAXIMUM_DATA_GB; - } - } - /// /// Check for the existance of license feature /// @@ -430,7 +418,7 @@ namespace AyaNova.Core #else build = "Perpetual", #endif - // activeTechUserCount = AyaNova.Biz.UserBiz.ActiveTechUserCountAsync().Result, + // activeTechUserCount = AyaNova.Biz.UserBiz.ActiveTechUserCountAsync().Result, activeCustomerContactUserCount = AyaNova.Biz.UserBiz.ActiveCustomerContactUserCountAsync().Result, activeInternalUserCount = AyaNova.Biz.UserBiz.ActiveInternalUserCountAsync().Result }