Support manifest file (cyberfusion.yml)
Comparable to Dockerfile / docker-compose.yml / Kubernetes manifests / etc. Allow users to define the specs for specific hosting in a cyberfusion.yml file (meant to be stored in a Git repository). This allows them to manage infrastructural settings (PHP version, etc.) together with application code.
William Edwards 13 days ago
Hosting
Support manifest file (cyberfusion.yml)
Comparable to Dockerfile / docker-compose.yml / Kubernetes manifests / etc. Allow users to define the specs for specific hosting in a cyberfusion.yml file (meant to be stored in a Git repository). This allows them to manage infrastructural settings (PHP version, etc.) together with application code.
William Edwards 13 days ago
Hosting
Administer expected service level
Some customers expect us to manage their cluster (e.g. add virtual hosts, setup, add node groups, etc. etc. etc.) Others automate much, and therefore do not want us to mutate their clusters. In that case, support questions should be handled differently (only advice/instruct, don't change anything).We should clearly administer the expected service level. Note that this can differ per-cluster for the same customer.
William Edwards 23 days ago
Core
Administer expected service level
Some customers expect us to manage their cluster (e.g. add virtual hosts, setup, add node groups, etc. etc. etc.) Others automate much, and therefore do not want us to mutate their clusters. In that case, support questions should be handled differently (only advice/instruct, don't change anything).We should clearly administer the expected service level. Note that this can differ per-cluster for the same customer.
William Edwards 23 days ago
Core
Communicate clearly how much disk space is available for databases
Other than disk space for UNIX users, which is unlimited and billed after, databases are stored on the node disk with a fixed size. The node disk contains logs, temporary files, etc. -- of which the size is not accurately predictable beforehand, and depends largely on the customer's usage. We use 20% as a rule of thumb.We should clearly communicate that on average, 100% - 20% = 80% of the node disk space is available for databases.
William Edwards 25 days ago
Core
Communicate clearly how much disk space is available for databases
Other than disk space for UNIX users, which is unlimited and billed after, databases are stored on the node disk with a fixed size. The node disk contains logs, temporary files, etc. -- of which the size is not accurately predictable beforehand, and depends largely on the customer's usage. We use 20% as a rule of thumb.We should clearly communicate that on average, 100% - 20% = 80% of the node disk space is available for databases.
William Edwards 25 days ago
Core
Mark clusters as non-critical
Some clusters are not critical. Staging clusters for an application that runs on a separate cluster, for example. We should mark these as such using an attribute in the Cluster API, so that we know which clusters this applies to.Additionally, we could consider applying a discount for such clusters, as maintenance/upgrades/etc. may be performed during the day (even preferred in some cases).
William Edwards About 1 month ago
Core
Mark clusters as non-critical
Some clusters are not critical. Staging clusters for an application that runs on a separate cluster, for example. We should mark these as such using an attribute in the Cluster API, so that we know which clusters this applies to.Additionally, we could consider applying a discount for such clusters, as maintenance/upgrades/etc. may be performed during the day (even preferred in some cases).
William Edwards About 1 month ago
Core
nginx: Allow multiple contexts for `custom_config`
Virtual hosts have a custom_config, which allows you to place custom configs. For nginx, this custom config is always placed in the server context. But sometimes, users need to place custom configs in other places, most notably in the location ~ \.php block that we add statically. A current case is as follows. Sometimes, directives need to be added to a specific PHP path, for example in the case of a Satis webhook:location = /webhook.php { auth_basic "off"; allow all; }Because nginx does not merge but overwrites locations, this causes the directives in location ~ \.php to no longer have any effect on /webhook.php.To work around that, the customer must duplicate the directives in location ~ \.php himself, but:These are 'implementation details'. I.e. they can change anytime, and are really our (internal) business.The socket path to the FPM pool must be hardcoded, which goes sideways when the virtual host's FPM pool is changed.The most elegant solution: turn custom_config from a text field of which the content is always placed in the server context, into an array with multiple possible values (such as location_php or generic).
William Edwards About 2 months ago
Core
nginx: Allow multiple contexts for `custom_config`
Virtual hosts have a custom_config, which allows you to place custom configs. For nginx, this custom config is always placed in the server context. But sometimes, users need to place custom configs in other places, most notably in the location ~ \.php block that we add statically. A current case is as follows. Sometimes, directives need to be added to a specific PHP path, for example in the case of a Satis webhook:location = /webhook.php { auth_basic "off"; allow all; }Because nginx does not merge but overwrites locations, this causes the directives in location ~ \.php to no longer have any effect on /webhook.php.To work around that, the customer must duplicate the directives in location ~ \.php himself, but:These are 'implementation details'. I.e. they can change anytime, and are really our (internal) business.The socket path to the FPM pool must be hardcoded, which goes sideways when the virtual host's FPM pool is changed.The most elegant solution: turn custom_config from a text field of which the content is always placed in the server context, into an array with multiple possible values (such as location_php or generic).
William Edwards About 2 months ago
Core
Insights into console ouput of crons
Especially when running scheduled commands, it could be useful to view its output for debugging/checking purposes. It would be great to have a little bit of a history too, but3 days would already be great. As that could end up with many results, especially with the Laravel task scheduler running every minute, I would suggest a simple search on the plain text and/or date range selection. For example, searching for a keyword between 10:00 and 10:30.
Dick 2 months ago
Platform
Insights into console ouput of crons
Especially when running scheduled commands, it could be useful to view its output for debugging/checking purposes. It would be great to have a little bit of a history too, but3 days would already be great. As that could end up with many results, especially with the Laravel task scheduler running every minute, I would suggest a simple search on the plain text and/or date range selection. For example, searching for a keyword between 10:00 and 10:30.
Dick 2 months ago
Platform
Support running Redis redundantly
Currently, we only support Redis's primary-replica mode. When the node that hosts the Redis primary goes down, applications break, as we can only read from the replica. We should support running Redis redundantly. There are two approaches:Redis Cluster. Mostly meant for scale. Seems to be natively supported by Laravel.Redis Sentinel. Mostly meant for HA when not using Redis Cluster. It is not clear what the advantage of not using Redis Cluster is. Does not seem to be natively supported by Laravel.
William Edwards 2 months ago
Core
Support running Redis redundantly
Currently, we only support Redis's primary-replica mode. When the node that hosts the Redis primary goes down, applications break, as we can only read from the replica. We should support running Redis redundantly. There are two approaches:Redis Cluster. Mostly meant for scale. Seems to be natively supported by Laravel.Redis Sentinel. Mostly meant for HA when not using Redis Cluster. It is not clear what the advantage of not using Redis Cluster is. Does not seem to be natively supported by Laravel.
William Edwards 2 months ago
Core
Endpoint to estimate node RAM
In some cases, we can make an educated guess. Most notably by looking at: If MariaDB: amount of InnoDB data.If PHP: amount of FPM pools, multiplied by their average memory usage.If Redis: the sum of all Redis instances' memory limits.Safety margin (e.g. 20%).Advantages:Users are able to estimate their costs beforehand. It is useful to know what costs for growth will be in advance.When growth is expected, users can upgrade nodes before running into memory issues.We don't have to do manual calculations (doesn't scale).
William Edwards 2 months ago
Core
Endpoint to estimate node RAM
In some cases, we can make an educated guess. Most notably by looking at: If MariaDB: amount of InnoDB data.If PHP: amount of FPM pools, multiplied by their average memory usage.If Redis: the sum of all Redis instances' memory limits.Safety margin (e.g. 20%).Advantages:Users are able to estimate their costs beforehand. It is useful to know what costs for growth will be in advance.When growth is expected, users can upgrade nodes before running into memory issues.We don't have to do manual calculations (doesn't scale).
William Edwards 2 months ago
Core
Passenger app logs
Currently, it is not possible to view logs for Passenger apps. As many NodeJS applications log important information, it should be.
William Edwards 2 months ago
Core
Passenger app logs
Currently, it is not possible to view logs for Passenger apps. As many NodeJS applications log important information, it should be.
William Edwards 2 months ago
Core
SRS support
We do not currently support SRS, which means forwarding to external destinations rarely works. This could be regarded as a non-issue, however, as forwarding mail is always flaky and therefore generally not recommended.
William Edwards 2 months ago
Hosting
SRS support
We do not currently support SRS, which means forwarding to external destinations rarely works. This could be regarded as a non-issue, however, as forwarding mail is always flaky and therefore generally not recommended.
William Edwards 2 months ago
Hosting
Remove node from load balancing when MariaDB node is not synced
When MariaDB is down on a node, it should not be load balanced to. For nodes running a web server as well as MariaDB, this can be achieved using the load_balancer_health_checks_groups_pairs attribute. Currently, nodes are not removed from load balancing on nodes on which MariaDB is not down but not functional either because Galera is not in the state 'synced'. E.g. after restarting MariaDB. This causes WSREP has not yet prepared node for application use errors.
William Edwards 2 months ago
Core
Remove node from load balancing when MariaDB node is not synced
When MariaDB is down on a node, it should not be load balanced to. For nodes running a web server as well as MariaDB, this can be achieved using the load_balancer_health_checks_groups_pairs attribute. Currently, nodes are not removed from load balancing on nodes on which MariaDB is not down but not functional either because Galera is not in the state 'synced'. E.g. after restarting MariaDB. This causes WSREP has not yet prepared node for application use errors.
William Edwards 2 months ago
Core
Resource limit crons
Intensive crons may cause all of a node's resources to be used. Options:Static limit (e.g. fixed amount of RAM).Dynamic limit (limit crons based on node resources).
William Edwards 3 months ago
Core
Resource limit crons
Intensive crons may cause all of a node's resources to be used. Options:Static limit (e.g. fixed amount of RAM).Dynamic limit (limit crons based on node resources).
William Edwards 3 months ago
Core
ClamAV support
The ability to upload files to a ClamAV instance using HTTP/socket, e.g. for on-the-fly upload scanning from a PHP application.
William Edwards 3 months ago
Core
ClamAV support
The ability to upload files to a ClamAV instance using HTTP/socket, e.g. for on-the-fly upload scanning from a PHP application.
William Edwards 3 months ago
Core
Automatically adjust and/or notify about too small InnoDB buffer pool
MySQL has a certain amount of InnoDB data. For the best performance as well as lower I/O, the InnoDB buffer pool should be the same size, or larger. Currently, the InnoDB buffer pool size is adjusted when a customer reports slowness. Instead, it could be adjusted automatically based on the amount of InnoDB data.Note: as the InnoDB buffer pool uses RAM, and nodes have a fixed amount of RAM, we should not adjust but notify when there is not enough RAM for the intended InnoDB buffer pool size. This is a difficult calculation, as it also depends on the amount of RAM other services on a given node require.
William Edwards 3 months ago
Core
Automatically adjust and/or notify about too small InnoDB buffer pool
MySQL has a certain amount of InnoDB data. For the best performance as well as lower I/O, the InnoDB buffer pool should be the same size, or larger. Currently, the InnoDB buffer pool size is adjusted when a customer reports slowness. Instead, it could be adjusted automatically based on the amount of InnoDB data.Note: as the InnoDB buffer pool uses RAM, and nodes have a fixed amount of RAM, we should not adjust but notify when there is not enough RAM for the intended InnoDB buffer pool size. This is a difficult calculation, as it also depends on the amount of RAM other services on a given node require.
William Edwards 3 months ago
Core