Knowledge base
1000 FAQs, 500 tutorials and explanatory videos. Here, there are only solutions!
This guide is for you because you have chosen (or will choose) Infomaniak as your host. This choice is not trivial. You are sensitive to ecology and want to do everything possible to reduce the carbon footprint on the Internet.
Infomaniak already thanks you for choosing this hosting provider that cares for the planet and for exploring the paths below to progress in the eco-design of your web environment.
Why act?
Websites consume energy to function, and the use of the Internet is one of the main causes of the increase in greenhouse gas emissions.
In addition to choosing an ethical host that uses renewable energy sources to power its servers, you can also contribute to reducing these emissions by adopting eco-responsible practices in the design and management of your sites and Mail services.
How to act?
As mentioned earlier, Infomaniak takes action on various points, including its support department: it will assist you in choosing services tailored to your needs with a focus on environmental preservation, gather your feedback to optimize our practices and draw inspiration from your experiences, while also communicating the environmental challenges in the hosting sector to adopt good digital practices.
At your level, there are several ways to reduce your carbon footprint on the Internet:
Minimize energy consumption
To reduce the energy consumption of servers and users' computers: optimize images, use web fonts, use minified scripts and data compression technologies. Clean designs can help reduce bandwidth requirements.
Offer options to reduce data consumption by using lower quality images or providing streaming videos in different qualities, to disable trackers and advertisements that consume a lot of data.
For good practices dedicated to WordPress consult the GreenIT sheets.
Use eco-responsible technologies
Sustainable development technologies, such as HTML5, CSS3, and JavaScript, are more environmentally friendly.‍
Promote sustainability
Raise user awareness of the environmental impact of Internet technologies and encourage them to adopt eco-responsible practices. Including with the WordPress solution.
And what about email?
The same habits can be applied to your email communication:
- Use an eco-friendly signature that encourages recipients to reduce their environmental impact by using eco-friendly technologies or adopting eco-friendly practices…
- Use eco-friendly email management tools that utilize renewable energy sources and have eco-friendly policies regarding energy consumption…
- Use plain text emails instead of HTML emails, as HTML emails tend to consume more energy to be displayed…
- Use PDF attachments instead of heavier formats…
- Use unsubscribe features to avoid sending unwanted emails…
- Use tracking tools to find out how many people open your emails and thus know if you are sending too many or too few…
All these actions can be implemented gradually and should be adapted to the situation of each website. There is no one-size-fits-all solution.
Regularly monitor energy consumption statistics to continue improving the site's ecological performance. Infomaniak will offer tools in this direction in the future, but in the meantime, you can use https://greenframe.io.
Writing to the /etc
and /lib
directories is disabled for security reasons.
This guide presents the various actions possible on a MySQL table depending on the rights granted to a user.
Actions on tables according to user rights…
… on shared Web hosting
Read + Write + Admin
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW
Read + Write
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, LOCK TABLE
Read
GRANT SELECT
… on Cloud Server
Read + Write + Admin
GRANT ALL
Read + Write
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, LOCK TABLES
Read
GRANT SELECT
This guide is for people who want to work with the Propel abstraction layer (which refers to a key component of the Propel library, an ORM (Object-Relational Mapping) for PHP).
Preamble
- Object-Relational Mapping (ORM) allows linking application objects to the tables of a relational database. Instead of writing SQL, data is manipulated through objects.
- Propel, a PHP abstraction layer, facilitates the creation, manipulation, and retrieval of objects without worrying about SQL details. It allows for managing relationships, joins, and pagination, while improving code readability and maintainability.
Particularities & limitations
- Propel is not installed by default as a Pear package; this means that you will have to install it manually on your server.
- The "Conventionnal Package" version of Propel can be installed; make sure to download and install this specific version.
- Since Propel command lines (e.g.,
propel-gen
) are not accessible, you will not be able to use them directly. - This means that Propel can only be used in production once you have generated the necessary classes and files locally or in another development environment.
- All manipulations and code generation must be done elsewhere before transferring the resulting files to your production environment.
Dependencies
- All the necessary dependencies to use Propel are available, except for Phing.
- Phing is not required for production, so this should not be an issue.
- Ensure that all other required dependencies for Propel are installed correctly.
This guide helps you install Ghost on Infomaniak, an ideal platform for blogs (regular writing, editorial format) and content-focused publishing sites, such as Substack or Medium.
Based on Node.js and using Markdown for writing, Ghost stands out for its lightness, whereas WordPress, although more flexible and universal, is heavier.
For additional help, contact a partner or launch a free tender — also discover the role of the host.
Prerequisites
- Have installed a blank Node.js site on Infomaniak Web hosting.
- Create an SSH access.
- Create a database.
- Have a valid and functional email address (especially the forgotten password features).
Ghost Installation
To do this:
- Log in to the server via SSH (need help?).
- Navigate to the site directory by running the command “cd chemin-vers-le-site” (for example
cd sites/ghost.domain.xyz
). Enter the following command:
npx -p ghost-cli ghost install --check-empty=false
and enter the requested information (database host name, website URL, etc.).
Edit the
config.production.json
file to update the port and host parameters:"server": { "port": 3000, "host": "0.0.0.0" },
Specify the email information there as well:
"mail": { "transport": "SMTP", "options": { "service": "Infomaniak", "host": "mail.infomaniak.com", "port": 465, "auth": { "user": "<<email_username>>", "pass": "<<email_password>>" } }, "from": "<<email_address>>" },
Node.js Configuration
To run the application, go to the Node.js dashboard:
- Click here to access the management of your product on the Infomaniak Manager (need help?).
- Click directly on the name assigned to the relevant product.
- Click on Manage under Advanced Settings:
- Click on the Node.js tab to access the settings:
In the execution command field, enter:
npx -p ghost-cli ghost run
- Click the Save button at the bottom of the page.
- On the main page, click the Start or Restart button.
- Observe the logs showing the creation of the database and the start of the application:
- Then, go to your site's URL to start.
User/mail configuration
To create the first user, add /ghost
to the URL of your site (for example https://ghost.domain.xyz/ghost
) and follow the assistant.
You can also configure the "member portal support address": when new members want to register, the portal sends the double opt-in confirmation from a specific address. By default, this is the “noreply” address of your domain. To update it, navigate to “Settings”, “Membership”, “Portal Settings”, “Customize”, and “Account Page”:
Resolve a technical incompatibility between Ghost and MariaDB
There is a compatibility issue between Ghost and the MariaDB database. This results in this type of error:
[2025-05-26 12:54:28] ERROR "GET /ghost/api/admin/posts/6834625e35802b06f1496305/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.conversions%2Ccount.clicks%2Csentiment%2Ccount.positive_feedback%2Ccount.negative_feedback" 400 27ms
Could not understand request.
Error ID:
8f2b0d90-3a30-11f0-a25f-fd9c83e1cf02
Error Code:
ER_BAD_FIELD_ERROR
----------------------------------------
Error: select `posts`.*, (with `k` as (select `member_id` from `members_subscription_created_events` where posts.id = members_subscription_created_events.attribution_id union select `member_id` from `members_created_events` where posts.id = members_created_events.attribution_id) select count(*) from `k`) as `count__conversions`, `posts`.*, (select count(distinct `members_click_events`.`member_id`) from `members_click_events` inner join `redirects` on `members_click_events`.`redirect_id` = `redirects`.`id` where posts.id = redirects.post_id) as `count__clicks`, `posts`.*, (select COALESCE(ROUND(AVG(score) * 100), 0) from `members_feedback` where posts.id = members_feedback.post_id) as `count__sentiment`, `posts`.*, (select count(*) from `members_feedback` where posts.id = members_feedback.post_id AND members_feedback.score = 0) as `count__negative_feedback`, `posts`.*, (select sum(`score`) from `members_feedback` where posts.id = members_feedback.post_id) as `count__positive_feedback` from `posts` where (`posts`.`type` = 'post' and `posts`.`status` in ('draft', 'published', 'scheduled', 'sent')) and `posts`.`id` = '2834125e33802b06e1433305' limit 1 - Unknown column 'posts.id' in 'where clause'
at Child.<anonymous> (/srv/customer/sites/ghost.domain.xyz/versions/5.120.2/core/server/models/base/plugins/crud.js:194:31)
at Packet.asError (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/packets/packet.js:740:17)
at Query.execute (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/commands/command.js:29:26)
at Connection.handlePacket (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/base/connection.js:475:34)
at PacketParser.onPacket (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/base/connection.js:93:12)
at PacketParser.executeStart (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/srv/customer/sites//versions/5.120.2/node_modules/mysql2/lib/base/connection.js:100:25)
at Socket.emit (node:events:518:28)
at addChunk (node:internal/streams/readable:561:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
at Readable.push (node:internal/streams/readable:392:5)
at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
Some SQL queries generated by Ghost, using common table expressions (CTE) nested in scalar subqueries, cause HTTP 400
errors when executed on MariaDB. These queries are valid in MySQL 8, which supports CTE in scalar subqueries, but not in MariaDB until version 10.6.
A patch is available to adapt Ghost's behavior and avoid these errors (refer to the official guide).
To use this patch, enter this command:
cd current
curl -L https://gist.githubusercontent.com/reneluria/8cbbfbc001e542c77d6d5887fbafe5d3/raw/65e0ce31753b4687d0eb67fc030734a35d3ffbad/ghost-post.patch | patch -p0
This guide explains how to adjust the configuration of a Node.js site hosted on the Infomaniak infrastructure to adapt the behavior of your application according to its evolution, its dependencies or your technical preferences.
Prerequisites
- Install a Node.js site on your hosting.
- Test your modifications locally before applying them to production.
- Check that your scripts (
start
,build
) are properly defined in yourpackage.json
file. - If you modify the structure of your project, remember to adjust the execution folder and the associated commands.
- The listening port defined in the Manager must absolutely correspond to the one used in the application's code.
Access the configuration
Each site has a dedicated dashboard to control the application (start, stop, restart), access the execution console, manage Node.js versions, configure domains and activate SSL certificates:
- Click here to access the management of your product on the Infomaniak Manager (need help?).
- Click directly on the name assigned to the relevant product.
- You can open the console, stop the project (a maintenance page will be applied) or restart it.
- To access the advanced settings, click on Manage under Advanced Settings:
- Click on the Node.js tab to access the settings:
Apply the changes
To do this:
- Save the changes from the Manager interface.
- Restart your application for the changes to take effect.
Refer to this other guide if you encounter any issues.
Main commands
Execution folder
The execution folder indicates the location on the server where build and launch commands will be executed. It should point to the root directory of your application, i.e., where your package.json
file is located.
For example, you can specify for the project root:
./
or if your application is in a subfolder named app
:
./app
or if it is located in a backend
folder:
./backend
Optional build command
If your Node.js application requires a compilation step before it can be run, enter a build command in the designated field. This command will be executed automatically before the application starts.
For example, you can specify:
npm install && npm run build
or, if you use yarn :
yarn install && yarn build
If your project does not require any compilation, this field can be left empty.
Launch command
The launch command corresponds to the instruction used to start your application. It must be identical to the one you use locally to run the project.
For example, you can specify:
node index.js
npm start
or
yarn start
This command should allow you to directly start the server or the entry point of your application as defined in your development environment.
Listening port
Your application must listen on a specific port that is defined in the Manager. This port is passed to your application via an environment variable PORT
.
Example in your Node.js code:
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log(`Application lancée sur le port ${port}`);
});
Make sure this port is properly accounted for in your code.
Node.js version
You can select the Node.js version that your site should use. It is recommended to use a stable and always supported version to ensure the security and compatibility of your application.
This guide details resource exhaustion errors that can occur when managing and visiting a website.
Preamble
- Resource limits are in place to maintain the integrity, stability, and performance of the shared server, while ensuring a fair experience for all users.
- If a website or application requires significantly higher resources, it may be necessary to switch to a Serveur Cloud or another type of virtual hosting where resources are allocated more flexibly.
Error origins
Fatal error: Maximum execution time of 30 seconds exceeded
This error occurs when the server sets a time limit for script execution, usually to avoid tasks that take too long. For example, if a script attempts to resize many large images in a single operation, it may exceed the allowed execution time limit. The server imposes this limit to ensure a quick response to user requests. The path often mentioned in the error can indicate a more precise origin (for example Fatal error: Maximum execution time of 30 seconds exceeded in /home/www/1234567abc/web/wp-includes/media.php on line 123
)
memory limit exceeded
This error occurs when the script or application uses more memory than allocated. This can happen when a script processes a large volume of data or when there is a memory leak. For example, an image management script may consume more memory than allowed, resulting in this error.
Resolution paths
Some ways to resolve these errors:
- Check the scripts that make multiple connections to the server to display data.
- Optimize the script(s) in question so that they require fewer resources.
- Increase the limits of the concerned site to allow the script to complete its tasks and/or limit the number of simultaneous connections (especially on a Serveur Cloud where the limits (RAM, execution time, simultaneous connections) can be significantly increased).
- Migrate your hosting to Serveur Cloud.
Also, refer to this other guide.
This guide explains how to resolve an installation issue with a Let's Encrypt certificate if you are using Cloudflare with strict security rules – especially those that filter by country or IP address.
Adjust the SSL / geoblocking settings
When you protect a website with Cloudflare and want to obtain a free Let's Encrypt SSL certificate from Infomaniak at the same time, there may be technical conflicts. These issues often arise from how Cloudflare handles security and network connections.
Let's Encrypt needs to verify that you are the owner of the domain name for which you are requesting a certificate. To do this, it sends what is called a "challenge": a specific HTTP request to your site, at an address of the type http://domain.xyz/.well-known/acme-challenge/...
. If this verification fails, the certificate cannot be issued or renewed.
The issue is that some protections enabled on Cloudflare can block these verifications:
- Security rules (WAF), for example if you block certain regions of the world (like the United States or Switzerland).
- Custom rules, such as IP filtering.
- Geoblocking, which prevents certain countries from accessing your site.
However, Let's Encrypt no longer verifies from a single location. For some time now (and even more so since March 2024), it performs its verifications from several countries at the same time – including new ones like Sweden or Singapore. Result: if one of these countries is blocked by your Cloudflare settings, the certificate request may fail, even if everything else is correctly configured.
Worse still: even if you try to make an exception solely for the challenge address (.well-known/acme-challenge
), this does not necessarily work with certain Cloudflare rules. Indeed, country or IP blocking rules are applied before any URL path-based exception.
Adjust the SSL/TLS mode in Cloudflare
Cloudflare offers different levels of SSL encryption. If you are having trouble with the Let's Encrypt certificate, switch to "Full" or "Full (strict)" mode instead of "Strict only". These modes allow you to use a self-signed or temporarily expired certificate while waiting for the real certificate to be renewed.
Using custom rules (advanced users)
It is recommended not to use "IP Access Rules" that cannot be overridden, but to set up "Custom rules" with geoip or any other desired rule, and especially to allow the path "/.well-known/acme-challenge/
" without access restrictions so that the Let's Encrypt challenges can pass despite the restrictions in place.
Temporarily disable geographic blocking
If you block access to your site from certain countries (for example, to avoid attacks), consider temporarily lifting this restriction while Let's Encrypt performs its verification. Once the certificate is issued or renewed, you can reactivate the protections.