# AppLaunch Full Site Summary AppLaunch helps customers launch and manage hosting services from one account. Public products include WordPress hosting, PHP + MySQL hosting, Docker container hosting, Minecraft server hosting, free portfolio hosting, and business webpage early access. Domain registration is marked coming soon; supported existing domains can be attached where product flows allow it. ## WordPress Hosting with SSL, Backups & MySQL | AppLaunch URL: https://applaunch.org/wordpress-hosting Launch and manage WordPress from one clear dashboard. Your plan brings together the website, MySQL database, SSL, storage, backups and secure file access needed to keep publishing. Included capabilities: WordPress setup: One-click installation; Storage: Fast NVMe storage; Database: MySQL included; Security: SSL included; Files: SSH and SFTP access; Domains: Connect a domain you own; Backups: Automatic and plan-based on-demand storage; Support: Support included. ### WordPress hosting FAQ - Does AppLaunch WordPress hosting include WordPress installation? Yes. AppLaunch includes a one-click WordPress installation flow so you can create the service and install WordPress without setting up the web server manually. - Is SSL included with WordPress hosting? Yes. SSL is included for supported WordPress domains and AppLaunch service addresses. - Does each WordPress plan include MySQL? Yes. WordPress plans include MySQL database capacity. The number of databases and other resource limits depend on the current plan. - Can I access WordPress files directly? Yes. WordPress hosting includes SSH and SFTP access for working with site files securely. - Can I use a domain I already own? Yes. You can connect a supported domain you already own. AppLaunch domain registration is separate and may not yet be available. - Are backups included? WordPress plans include automatic backups. Frequency and any shared on-demand backup storage are shown in the current plan comparison before checkout. - Is this fully managed WordPress hosting? AppLaunch manages the hosting platform and provides service tools and support. You remain responsible for your WordPress content, plugins, themes and application-level maintenance. ## PHP Hosting with MySQL, SSL & SFTP | AppLaunch URL: https://applaunch.org/php-hosting Deploy PHP 8 applications with MySQL, NVMe storage, SSL and secure file access in one service. AppLaunch handles the hosting layer while you keep control of your code and data. Included capabilities: Runtime: PHP 8.x; Database: MySQL included; Storage: Fast NVMe storage; Security: SSL included; Files: SSH and SFTP access; Configuration: Plan-dependent php.ini control; Domains: Connect a domain you own; Backups: Automatic and plan-based on-demand storage. ### PHP + MySQL hosting FAQ - What PHP version does AppLaunch hosting support? AppLaunch PHP hosting supports PHP 8.x. Current runtime details and plan capabilities are shown before checkout. - Is MySQL included with PHP hosting? Yes. PHP hosting plans include MySQL databases. Database quantity and service resources vary by plan. - Does PHP hosting include SSL? Yes. SSL is included for supported domains and AppLaunch service addresses. - Can I connect with SSH or SFTP? Yes. PHP hosting includes SSH and SFTP access for secure work with application files. - Can I change php.ini settings? Some PHP plans include php.ini control. Check the current plan comparison for the exact capability before purchasing. - Are automatic backups included? PHP plans include automatic backups. Frequency and any shared on-demand backup allocation depend on the selected plan. - Does AppLaunch include Git deployment, Redis or cron jobs? Those capabilities are not presented as included PHP hosting features. Use the current plan comparison and documentation as the source of truth. ## Docker Hosting for Containers & Compose | AppLaunch URL: https://applaunch.org/docker-hosting Deploy Docker applications with Compose, environment variables, persistent volumes, public ports and custom domains. AppLaunch keeps deployment and day-to-day controls in one place. Included capabilities: Deployment: GitHub auto-deploy; Definition: Docker Compose; Configuration: Environment variables; Data: Persistent volumes; Networking: Plan-based public ports; Domains: Custom domain support; Security: SSL included; Operations: Logs, backups and support. ### Docker container hosting FAQ - Can AppLaunch deploy Docker Compose applications? Yes. Docker hosting includes Docker Compose support, subject to the applications, containers and resources available on your plan. - Does Docker hosting support persistent volumes? Yes. Persistent volumes are included so supported application data can survive container replacement and redeployment. - Can Docker applications deploy from GitHub? Yes. GitHub auto-deploy is included as a Docker hosting capability. - Can I configure environment variables? Yes. Docker services support environment variables for application configuration and secrets. - Are public ports and custom domains supported? Yes. Docker plans include plan-based public ports and support custom domains with SSL. - Does Docker hosting include backups? Yes. Docker plans include automatic backups, with frequency and shared on-demand backup storage determined by the selected plan. - Is Docker hosting the same as a VPS? No. AppLaunch provides a managed container-hosting workflow and dashboard rather than an unrestricted virtual private server with root host access. ## Minecraft Server Hosting Plans & Prices | AppLaunch URL: https://applaunch.org/minecraft-server-hosting Compare current Minecraft hosting prices and resources, then choose Vanilla, Paper, Spigot, Forge or Fabric with guided RAM sizing for the players you expect. Included capabilities: Software: Vanilla, Paper, Spigot, Forge and Fabric; Sizing: Player-based RAM guidance; Console: Commands and live output; Files: SSH and SFTP access; Storage: Plan-based NVMe storage; Networking: Five additional ports; Databases: Three MySQL databases; Protection: Daily backups and support. ### Minecraft server hosting FAQ - What Minecraft server software can I host? The AppLaunch configurator supports Vanilla, Paper, Spigot, Forge and Fabric options, plus supported proxy configurations shown in the live setup flow. - Can AppLaunch host modded Minecraft? Yes. Forge and Fabric choices are available for modded servers. Modpacks and mods still need resources appropriate to their workload. - How much RAM does my Minecraft server need? It depends on software, mod or plugin load, world activity and player count. The AppLaunch configurator uses expected players and server type to guide the recommendation. - Do Minecraft plans include backups? Yes. Current Minecraft plans include daily backups. Always review the current plan details and keep separate copies of important worlds where appropriate. - Can I use SFTP and the server console? Yes. Minecraft hosting includes secure file access and service-panel console controls for commands and live output. - Are ports and MySQL databases included? Current Minecraft plans include five additional ports and three MySQL databases. Confirm current limits in the live plan comparison before checkout. - Where are Minecraft servers hosted? The current guided setup offers a European hosting region. North American and Asia-Pacific regions are shown as coming later, not currently available. ## Independent hosting and deployment guides ### How much RAM does a Minecraft server need? URL: https://applaunch.org/guides/how-much-ram-minecraft-server-needs Question: Which RAM figure should you buy? Answer: For a small server using a recent Java Edition, 4 GB is a sensible place to start planning, but it is not the right answer for everyone. Large modpacks, a longer view distance, more explored world areas or more players online together may need extra memory. Test the busiest real play session and keep some memory free for the computer itself. Plain-English explanation: RAM is the short-term memory your Minecraft server uses while people are playing. The server keeps nearby parts of the world, players, creatures, plugins and mods in this memory so it can use them quickly. If it runs out, the server may freeze or stop. Buying far more RAM than the server can use will not automatically make it faster. Player count matters, but it is only one part of the answer. A quiet server for ten friends usually needs less memory than a server for the same ten people using a large modpack and exploring in different directions. Start with the kind of server you want, then allow room for busy moments and test it with real play. Example: Imagine eight friends playing normal survival Minecraft. A 4 GB plan is a reasonable place to begin. If those same friends install a large modpack, build lots of automated machines and explore new land at the same time, 4 GB may no longer be comfortable. The number of friends did not change, but the amount of work and world data did. Steps: Choose software and modpack before choosing RAM. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on workload: start with software, mods and loaded chunks. Write the result down so you can compare it later. Keep some memory free for the computer instead of assigning everything to Minecraft. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test travel, world generation and the expected player peak. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Record memory use and game-update speed, then resize from evidence. Finish by checking the result against upgrade signal: memory stays almost full, freezes become frequent or the server stops for lack of memory. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? For a small server using a recent Java Edition, 4 GB is a sensible place to start planning, but it is not the right answer for everyone. Large modpacks, a longer view distance, more explored world areas or more players online together may need extra memory. Test the busiest real play session and keep some memory free for the computer itself. What should I check first? Start with workload: start with software, mods and loaded chunks. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Choose software and modpack before choosing RAM. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Sizing from player slots alone. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Workload: Start with software, mods and loaded chunks; Safety margin: Keep roughly 20% for the computer and other services; Upgrade signal: Memory stays almost full, freezes become frequent or the server stops for lack of memory. ### Minecraft server CPU vs RAM: which matters more? URL: https://applaunch.org/guides/minecraft-server-cpu-vs-ram Question: Is CPU or RAM the current bottleneck? Answer: RAM gives Minecraft room to hold the world, players and add-ons while it runs. The processor has to calculate each game update on time. If memory is not close to full but creatures, machines or new terrain make the whole server slow down, a faster processor or a lighter workload is more useful than buying more unused RAM. Plain-English explanation: RAM and CPU solve different problems. RAM gives the server room to hold active world data. The CPU does the actual work: moving creatures, running redstone, loading land and processing what players do. Adding RAM helps when memory is genuinely full, but it does not make a slow CPU finish that work faster. You do not need to understand computer engineering to spot the difference. A server that crashes with an out-of-memory message may need more RAM or fewer heavy mods. A server that stays online but feels slow when farms, creatures or new land are active is more likely struggling with the amount of work it must calculate. Example: Two servers both have 8 GB of RAM. One runs a small world for five friends and feels smooth. The other has 40 players, hundreds of creatures and several large farms, so blocks react late even though 3 GB of RAM is still unused. The second server needs less work, better settings or faster CPU time—not another 8 GB of unused memory. Steps: Record memory and game-update speed during the same busy period. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on game-update symptom: the whole server slows during busy areas or new terrain. Write the result down so you can compare it later. Check new terrain, creatures and plugins before resizing. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Change one variable at a time. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Repeat the exact workload and compare several busy results, not one instant. Finish by checking the result against fair test: repeat the same route and player actions after one change. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? RAM gives Minecraft room to hold the world, players and add-ons while it runs. The processor has to calculate each game update on time. If memory is not close to full but creatures, machines or new terrain make the whole server slow down, a faster processor or a lighter workload is more useful than buying more unused RAM. What should I check first? Start with game-update symptom: the whole server slows during busy areas or new terrain. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Record memory and game-update speed during the same busy period. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Judging the processor from one overall percentage. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Game-update symptom: The whole server slows during busy areas or new terrain; Memory symptom: Memory remains nearly full, freezes repeat or the server stops; Fair test: Repeat the same route and player actions after one change. ### Paper vs Spigot vs Vanilla for a Minecraft server URL: https://applaunch.org/guides/paper-vs-spigot-vs-vanilla-server Question: Which server software matches the project? Answer: Choose Vanilla for the closest official behaviour, Spigot when its plugin ecosystem and API compatibility are the requirement, and Paper when you want Spigot-compatible plugins plus extensive performance and configuration controls. Always test game mechanics your community cares about because implementation differences matter. Plain-English explanation: Vanilla is the official Minecraft server from Mojang. It is the simplest choice when you want the game to behave as close as possible to normal Minecraft and do not need server plugins. Spigot adds support for a large plugin library. Paper builds on that plugin world and adds more settings and performance improvements. There is no single winner for every server. The best choice depends on what you want to add and which parts of normal Minecraft must behave exactly the same. Before changing an existing world, test important farms, redstone, portals and plugins on a copy. Small technical differences can matter to dedicated players. Example: A private survival world for four friends who build technical redstone machines may stay on Vanilla because matching normal game behaviour matters most. A public town server that needs permissions, anti-grief tools and moderation commands may choose Paper because those plugins are central to the community. Steps: List required plugins and mechanics. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on vanilla: official baseline; no bukkit plugin api. Write the result down so you can compare it later. Clone the world into a test environment. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test farms, redstone, portals and plugins. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Back up before migrating and retain a rollback copy. Finish by checking the result against paper: spigot-compatible focus with more controls and patches. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Choose Vanilla for the closest official behaviour, Spigot when its plugin ecosystem and API compatibility are the requirement, and Paper when you want Spigot-compatible plugins plus extensive performance and configuration controls. Always test game mechanics your community cares about because implementation differences matter. What should I check first? Start with vanilla: official baseline; no bukkit plugin api. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List required plugins and mechanics. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Choosing only from benchmark claims. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Vanilla: Official baseline; no Bukkit plugin API; Spigot: Plugin ecosystem with server behaviour changes; Paper: Spigot-compatible focus with more controls and patches. ### How view distance affects Minecraft server performance URL: https://applaunch.org/guides/minecraft-view-distance-server-performance Question: What does one extra chunk of radius cost? Answer: Loaded area grows roughly with the square of the radius: moving from radius 8 to 12 increases the square-area proxy from 289 to 625 chunks per isolated player, about 2.16×. Player overlap reduces the real total, while exploration and simulation work can increase it. Plain-English explanation: View distance controls how far around each player the server sends land. Simulation distance controls how far away the server keeps creatures, crops and other game activity running. Higher numbers let players see or affect more of the world, but they also make the server keep track of more chunks at once. The cost grows quickly because distance spreads in every direction. Moving from 8 chunks to 12 chunks is not just 50% more land. For a player standing away from everyone else, the rough square grows from 289 chunks to 625. Players standing together share much of that area, while players exploring separately do not. Example: Ten friends building together at one town may run well with a view distance of 12 because their loaded areas overlap. The same ten friends flying in ten different directions can ask the server to load many more chunks. This is why an empty-server test or a test with everyone at spawn can hide the real cost. Steps: Tune simulation distance separately from visual view distance. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on radius 8 proxy: (2×8+1)² = 289 chunks. Write the result down so you can compare it later. Test both clustered and dispersed players. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Pre-generate the planned world border if exploration spikes hurt. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Raise distances one step at a time. Finish by checking the result against best test: spread players apart and make some travel. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Loaded area grows roughly with the square of the radius: moving from radius 8 to 12 increases the square-area proxy from 289 to 625 chunks per isolated player, about 2.16×. Player overlap reduces the real total, while exploration and simulation work can increase it. What should I check first? Start with radius 8 proxy: (2×8+1)² = 289 chunks. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Tune simulation distance separately from visual view distance. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Assuming distance cost grows linearly. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Radius 8 proxy: (2×8+1)² = 289 chunks; Radius 12 proxy: (2×12+1)² = 625 chunks; Best test: Spread players apart and make some travel. ### Minecraft server slots do not measure performance URL: https://applaunch.org/guides/minecraft-server-player-slots-explained Question: What does a player-slot number prove? Answer: The max-players setting limits logins; it does not reserve CPU, RAM or bandwidth per slot. Real capacity depends on simultaneous activity, software, plugins, entities, loaded chunks and latency, so judge a plan by resources and workload evidence. Plain-English explanation: A player slot is permission for one more person to join. It is not a reserved package of RAM or CPU power. A host can let you set 100 slots even when the plan would struggle badly with 100 active players. That is why very large slot numbers should not be treated as proof of performance. What matters is how many people are online at the same time and what they do. Twenty players standing in one lobby can be lighter than ten players exploring new land, running farms and using heavy plugins. Compare real resources and ask how the server is expected to be used. Example: A community may have 500 Discord members but only 12 people online during its busiest evening. Its useful starting number is 12 concurrent players plus room to grow, not 500 community members. A sensible maximum-player setting can then stop new joins before the experience becomes unusable. Steps: Forecast concurrent players, not community members. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on slot count: an admission-control setting. Write the result down so you can compare it later. Describe the busiest activity. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test that concurrency with representative plugins and worlds. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Keep a queue or lower max-players if tick health degrades. Finish by checking the result against capacity proof: stable tick time during a representative peak. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The max-players setting limits logins; it does not reserve CPU, RAM or bandwidth per slot. Real capacity depends on simultaneous activity, software, plugins, entities, loaded chunks and latency, so judge a plan by resources and workload evidence. What should I check first? Start with slot count: an admission-control setting. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Forecast concurrent players, not community members. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Buying the largest advertised slot number. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Slot count: An admission-control setting; Concurrency: Players actually online at the same time; Capacity proof: Stable tick time during a representative peak. ### How often should you back up a Minecraft server? URL: https://applaunch.org/guides/minecraft-server-backup-frequency Question: What backup interval matches the risk? Answer: Set frequency from the recovery point objective: if losing six hours of builds is unacceptable, a daily backup is already too infrequent. Use automated snapshots plus longer retention, and prove the files restore to a separate test server. Plain-English explanation: Backup frequency should be based on how much player progress you are willing to lose. If your world is copied once a day, a failure just before the next copy could remove almost a full day of building. A busy public server may need copies much more often than a world used by friends once a week. Keeping several older backups matters too. You may not notice a damaged area, stolen items or a bad plugin update straight away. If every old copy is quickly replaced by a newer damaged copy, frequent backups have not protected you from that problem. Example: Suppose players would be very upset to lose more than two hours of work. A backup every six hours cannot meet that promise. You might save the world every hour, keep hourly copies for a day, daily copies for a week and weekly copies for longer. The exact schedule can change, but it starts from acceptable loss. Steps: Write down how much progress and downtime the community can accept. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on progress at risk: maximum amount of recent gameplay you can accept losing. Write the result down so you can compare it later. Make sure the world finishes saving before each backup copy is taken. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Keep at least one copy outside the live server. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run scheduled practice restores. Finish by checking the result against saved history: enough older copies to predate delayed damage or griefing. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Set frequency from the recovery point objective: if losing six hours of builds is unacceptable, a daily backup is already too infrequent. Use automated snapshots plus longer retention, and prove the files restore to a separate test server. What should I check first? Start with progress at risk: maximum amount of recent gameplay you can accept losing. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Write down how much progress and downtime the community can accept. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Calling an untested archive a backup. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Progress at risk: Maximum amount of recent gameplay you can accept losing; Restore time: Maximum acceptable time before the server works again; Saved history: Enough older copies to predate delayed damage or griefing. ### Should you pre-generate Minecraft world chunks? URL: https://applaunch.org/guides/minecraft-pre-generate-world-chunks Question: When does pre-generation pay off? Answer: Pre-generation moves expensive terrain creation out of the player session, making exploration peaks more predictable. It is most useful when you have a practical world border and enough disk for the generated region; it is wasteful for an effectively unlimited map. Plain-English explanation: Minecraft has to create new land the first time somebody visits it. This can cause a burst of work while the player is moving, especially when several people explore at once. Pre-generating creates a chosen area earlier, while nobody is waiting for the server to keep up. The trade-off is storage. Generated land takes disk space and makes world backups larger. Pre-generating an enormous area that nobody will visit wastes time and storage, so it works best when the server has a sensible world border or a clear expected play area. Example: A small survival season uses a 10,000-block border. The owner creates that area before launch while the server is closed, then tests flying quickly near the edge. Launch-day explorers mostly visit land that already exists. A no-border server cannot reasonably create every chunk in advance. Steps: Choose a world border from gameplay needs. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on benefit: less live terrain-generation work. Write the result down so you can compare it later. Estimate disk growth with a small measured sample. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Generate while the server is closed or quiet. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Back up after generation and test travel at the edge. Finish by checking the result against boundary: generate only the region players can reasonably use. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Pre-generation moves expensive terrain creation out of the player session, making exploration peaks more predictable. It is most useful when you have a practical world border and enough disk for the generated region; it is wasteful for an effectively unlimited map. What should I check first? Start with benefit: less live terrain-generation work. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Choose a world border from gameplay needs. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Generating millions of unused chunks. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Benefit: Less live terrain-generation work; Cost: More storage, backup size and setup time; Boundary: Generate only the region players can reasonably use. ### Minecraft port forwarding vs hosted servers URL: https://applaunch.org/guides/minecraft-server-port-forwarding-vs-hosting Question: Which operating model is the better fit? Answer: Home hosting can be economical for experiments when you control the router and accept maintenance. Hosted service is usually simpler when the server must stay reachable, your internet provider does not give you a directly reachable address, or you do not want to expose and maintain a machine on your network. Plain-English explanation: Running Minecraft at home can be a good free experiment, but it makes your home computer and internet connection part of the service. You may need to change router settings, keep the machine powered on, install updates, manage backups and expose a game port to the internet. Paid hosting moves the machine, power and public connection to a provider. You still decide the world, software and community rules, but you do not have to keep a home computer online. The better choice depends on whether this is a short private test or a server people expect to reach every day. Example: Three friends playing for one weekend may be happy with a spare home PC and a temporary port-forwarding rule. A school club with 30 members, scheduled events and players joining while the owner is away will usually value a hosted server that stays online without relying on one bedroom computer. Steps: Check whether your ISP provides a reachable public address. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on home: you own patching, routing, power and public exposure. Write the result down so you can compare it later. Measure upload capacity and latency from player regions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Define an update and backup owner. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare total effort as well as monthly price. Finish by checking the result against decision trigger: required uptime and willingness to operate infrastructure. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Home hosting can be economical for experiments when you control the router and accept maintenance. Hosted service is usually simpler when the server must stay reachable, your internet provider does not give you a directly reachable address, or you do not want to expose and maintain a machine on your network. What should I check first? Start with home: you own patching, routing, power and public exposure. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Check whether your ISP provides a reachable public address. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Opening broad firewall ranges. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Home: You own patching, routing, power and public exposure; Hosted: Provider owns the host layer; you still own server configuration; Decision trigger: Required uptime and willingness to operate infrastructure. ### Minecraft Java vs Bedrock server hosting URL: https://applaunch.org/guides/minecraft-java-vs-bedrock-server Question: Which edition should the server run? Answer: Choose the edition your players own and can join. Java is the usual choice for Java mods and the Bukkit/Paper plugin ecosystem; Bedrock targets Bedrock clients across supported devices. Cross-play bridges add compatibility work and should be tested, not treated as native equivalence. Plain-English explanation: Java Edition and Bedrock Edition are different versions of Minecraft. Java is mainly used on Windows, macOS and Linux computers and has a large mod and plugin community. Bedrock is used across phones, tablets, consoles and Windows. A player normally needs the matching edition for the server. Choose by asking what your players already own and what features you need. Tools can sometimes let Bedrock players join a Java server, but that adds another piece of software and does not make the two games completely identical. Example: If every friend plays Java on a laptop and the group wants a Fabric modpack, choose a Java server. If the group mainly plays on phones and Xbox consoles, a Bedrock server is the natural starting point. Do not buy first and ask about devices later. Steps: Survey actual player editions and devices. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on player devices: the first and hardest constraint. Write the result down so you can compare it later. List required mods, plugins or add-ons. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test authentication and skins through any bridge. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Document which client versions are supported. Finish by checking the result against cross-play: a bridge adds another compatibility and security layer. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Choose the edition your players own and can join. Java is the usual choice for Java mods and the Bukkit/Paper plugin ecosystem; Bedrock targets Bedrock clients across supported devices. Cross-play bridges add compatibility work and should be tested, not treated as native equivalence. What should I check first? Start with player devices: the first and hardest constraint. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Survey actual player editions and devices. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Buying Java hosting for a Bedrock-only group. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Player devices: The first and hardest constraint; Extensions: Java mods/plugins and Bedrock add-ons differ; Cross-play: A bridge adds another compatibility and security layer. ### How to size a modded Minecraft server URL: https://applaunch.org/guides/minecraft-modded-server-sizing Question: Why is mod count a poor sizing input? Answer: Two packs with the same number of mods can have radically different memory, CPU and world-generation costs. Size from the exact pack version, expected concurrency and a repeatable test that includes exploration, machines and chunk loaders. Plain-English explanation: A modded server cannot be sized accurately by counting mods. One small mod may change almost nothing, while another may add complex world generation, machines or creatures. Two packs with 150 mods can need very different amounts of memory and CPU time. Use the exact modpack, version and player group you plan to run. Build or copy a realistic base, turn machines on, explore new land and watch how the server behaves. Pack authors may publish a starting recommendation, but your test is what shows whether it fits your community. Example: A lightweight building pack with 200 small decoration mods may run comfortably for six players. A 100-mod technology pack with chunk loaders and large automated factories may use much more memory and processing power. The smaller mod count does not make the second pack lighter. Steps: Install the exact server pack. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on pack identity: exact loader, game version and pack release. Write the result down so you can compare it later. Use the pack author’s supported Java version. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Build or import a representative base. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Measure during exploration and active automation. Finish by checking the result against headroom: room for backups, updates and transient spikes. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Two packs with the same number of mods can have radically different memory, CPU and world-generation costs. Size from the exact pack version, expected concurrency and a repeatable test that includes exploration, machines and chunk loaders. What should I check first? Start with pack identity: exact loader, game version and pack release. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Install the exact server pack. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using mods-per-gigabyte formulas. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Pack identity: Exact loader, game version and pack release; Peak scenario: Travel plus active automation and players; Headroom: Room for backups, updates and transient spikes. ### Fabric vs Forge for a modded Minecraft server URL: https://applaunch.org/guides/fabric-vs-forge-server Question: What decides between Fabric and Forge? Answer: The required modpack decides first: server and clients must use a compatible loader, game version and mod set. Fabric is often selected for lightweight ecosystems and specific performance mods; Forge is required by many established content-heavy packs. Neither makes incompatible mods interchangeable. Plain-English explanation: Fabric and Forge are mod loaders: they are the layer that lets Minecraft load mods. Mods are normally written for one loader and one range of Minecraft versions. A Forge mod cannot simply be dropped into a Fabric server, and players need a matching setup. Choose the loader required by the mods or modpack you actually want. Fabric is popular for lightweight tools and some performance mods. Forge is required by many large, long-running content packs. The list of must-have mods should make the choice, not a general claim that one loader is always faster. Example: Your group wants a published pack that says “Forge 1.20.1.” That already decides the loader and Minecraft version. Choosing Fabric because somebody called it lighter would mean giving up or replacing the pack. For a custom server, list the must-have mods first and see which loader supports all of them. Steps: Start from the pack manifest or official server files. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on required mods: check loader and exact game-version support. Write the result down so you can compare it later. Lock loader and mod versions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test client join with a clean profile. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Upgrade a cloned world before production. Finish by checking the result against upgrade path: confirm the pack supports the target release. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The required modpack decides first: server and clients must use a compatible loader, game version and mod set. Fabric is often selected for lightweight ecosystems and specific performance mods; Forge is required by many established content-heavy packs. Neither makes incompatible mods interchangeable. What should I check first? Start with required mods: check loader and exact game-version support. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Start from the pack manifest or official server files. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Mixing loader-specific jars. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Required mods: Check loader and exact game-version support; Client burden: Players need the matching mod set; Upgrade path: Confirm the pack supports the target release. ### Minecraft TPS and MSPT explained URL: https://applaunch.org/guides/minecraft-server-tps-mspt-explained Question: Which number shows remaining tick headroom? Answer: A 20 TPS target gives roughly 50 ms for each tick. MSPT exposes how much of that budget the server uses: sustained work near or above 50 ms means it cannot maintain real-time tick rate, even if a short average still looks healthy. Plain-English explanation: Minecraft tries to update the game 20 times every second. These updates are called ticks. TPS means ticks per second, so 20 TPS is the normal target. MSPT means milliseconds per tick and shows how long the server takes to finish one update. There are 1,000 milliseconds in a second. Dividing that by 20 gives the server about 50 milliseconds for each tick. If work regularly takes longer than 50 milliseconds, the server cannot keep up and the game begins to run behind real time. Example: At 25 MSPT, the server uses about half of its tick-time budget and has room for a busier moment. At 65 MSPT, each update takes too long, so creatures, blocks and player actions may appear delayed. More player internet speed will not fix that server-side delay. Steps: Capture metrics during the complaint window. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on time available: 1000 milliseconds ÷ 20 updates = 50 milliseconds. Write the result down so you can compare it later. Separate network latency from server tick delay. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Profile plugins, entities and chunks. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify changes against the same scenario. Finish by checking the result against diagnosis: inspect the busy period, not the quiet average. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A 20 TPS target gives roughly 50 ms for each tick. MSPT exposes how much of that budget the server uses: sustained work near or above 50 ms means it cannot maintain real-time tick rate, even if a short average still looks healthy. What should I check first? Start with time available: 1000 milliseconds ÷ 20 updates = 50 milliseconds. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Capture metrics during the complaint window. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Calling every connection delay TPS lag. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Time available: 1000 milliseconds ÷ 20 updates = 50 milliseconds; Healthy evidence: Even the slower game updates normally finish inside that time; Diagnosis: Inspect the busy period, not the quiet average. ### A Minecraft server lag troubleshooting checklist URL: https://applaunch.org/guides/minecraft-server-lag-troubleshooting Question: Where should diagnosis start? Answer: First classify the symptom: rubber-banding for everyone suggests server tick or network trouble, one player may have a route/client issue, and low client FPS is not server TPS. Capture evidence during the event before restarting and erasing the useful state. Plain-English explanation: “Lag” can mean several different problems. If one player has trouble while everybody else is fine, their device or internet route may be the cause. If everyone sees blocks return after breaking or creatures freeze, the server may be falling behind. Low frames per second on one computer is a graphics problem, not server TPS. Start by writing down who was affected, where they were and what was happening. Do this before restarting if the server is still safe to inspect. A restart may make the problem disappear for a while, but it can also remove the clues that explain it. Example: Players report lag every time three people fly into new land. Tick time rises during those trips but memory stays comfortable. That points toward world generation work. If only one player reports delay and the server numbers stay normal, check that player’s connection before changing the server. Steps: Record time, player locations and activity. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on scope: one player, one area or everyone. Write the result down so you can compare it later. Check game-update speed and memory at that time. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use a performance recording to find the slow work. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Change one cause and repeat the same test. Finish by checking the result against network: delay, lost data and the route from affected players. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? First classify the symptom: rubber-banding for everyone suggests server tick or network trouble, one player may have a route/client issue, and low client FPS is not server TPS. Capture evidence during the event before restarting and erasing the useful state. What should I check first? Start with scope: one player, one area or everyone. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Record time, player locations and activity. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Installing “lag-fix” plugins blindly. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Scope: One player, one area or everyone; Server: Game-update time, memory and a performance recording; Network: Delay, lost data and the route from affected players. ### Minecraft server security checklist URL: https://applaunch.org/guides/minecraft-server-security-checklist Question: Which controls prevent the most avoidable incidents? Answer: Keep online authentication enabled unless a correctly secured proxy architecture explicitly requires otherwise, expose only required ports, restrict console and file access, update server software, and install plugins only from trusted sources. Backups are part of security because containment without recovery is incomplete. Plain-English explanation: A public Minecraft server is an internet service, so it needs more than a whitelist and a good password. Keep account checking enabled, open only the ports players truly need, limit who can use the console or edit files, and update Java, server software and plugins. Plugins and mods are programs running on the server. Download them from the real project or a trusted distribution site and remove anything abandoned or unnecessary. A recoverable backup is also a security control because it lets you rebuild after damage. Example: A helper needs permission to mute rude players. They do not need the host password, file access and permission to delete worlds. Give them a game moderation role instead. If their account is taken over, the damage is limited to that smaller role. Steps: Inventory every open port and administrator. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on identity: online authentication or secured proxy forwarding. Write the result down so you can compare it later. Remove unused plugins and accounts. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Patch Java, server software and plugins. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test restore and credential rotation. Finish by checking the result against recovery: off-server, tested backups. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Keep online authentication enabled unless a correctly secured proxy architecture explicitly requires otherwise, expose only required ports, restrict console and file access, update server software, and install plugins only from trusted sources. Backups are part of security because containment without recovery is incomplete. What should I check first? Start with identity: online authentication or secured proxy forwarding. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory every open port and administrator. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Running offline mode on an exposed backend. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Identity: Online authentication or secured proxy forwarding; Exposure: Only game and intentional management paths; Recovery: Off-server, tested backups. ### How to use a Minecraft server allowlist URL: https://applaunch.org/guides/minecraft-whitelist-vs-allowlist Question: What does an allowlist protect? Answer: An allowlist limits which known accounts may join; it does not replace account authentication, operator permissions or network security. Use it for private communities, remove stale members, and keep the operator list much smaller than the player list. Plain-English explanation: Minecraft’s allowlist—often still called a whitelist—is a list of accounts allowed to join. It is useful for private worlds and closed testing. It does not make everybody on the list an administrator and it does not replace normal account checking. Keep three groups separate: people allowed to play, people allowed to moderate the game and people allowed to control the host or files. Most players need only the first. Review the list occasionally so old or unwanted accounts do not stay enabled forever. Example: A class server has 25 pupils on the allowlist, two teachers with moderation commands and one technical owner with console access. Adding a pupil never gives them the teacher or owner permissions. That separation keeps ordinary account problems from becoming full server problems. Steps: Enable the allowlist before sharing the address. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on allowlist: who may connect. Write the result down so you can compare it later. Add exact verified account names. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Review membership on a schedule. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Keep administration in separate least-privilege roles. Finish by checking the result against host access: who may change files, console and backups. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? An allowlist limits which known accounts may join; it does not replace account authentication, operator permissions or network security. Use it for private communities, remove stale members, and keep the operator list much smaller than the player list. What should I check first? Start with allowlist: who may connect. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Enable the allowlist before sharing the address. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Making every trusted player an operator. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Allowlist: Who may connect; Operator role: Who may administer the game; Host access: Who may change files, console and backups. ### How a domain points to a Minecraft server URL: https://applaunch.org/guides/minecraft-server-domain-srv-record Question: Which DNS records are needed? Answer: An A or AAAA record maps a hostname to the server address. For Java Edition on a non-default port, an SRV record can advertise the service port so players use the hostname alone. DNS does not open a firewall or make a private address reachable. Plain-English explanation: A domain lets players use a friendly name such as play.example.com instead of remembering a number. An A record points that name to an IPv4 address; an AAAA record does the same for IPv6. Java servers using an unusual port can also use an SRV record to advertise that port. DNS only tells players where to go. It does not start the server, open a firewall or make a private home address reachable from the internet. Those network parts must already work before the friendly name can work. Example: Your Java server is reachable at 203.0.113.10 on port 25570. You create play.example.com pointing to that address, then add the correct Minecraft SRV record pointing at play.example.com and port 25570. Players can enter the friendly name without typing :25570. Steps: Create a dedicated hostname such as play.example.com. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on a/aaaa: hostname to ipv4/ipv6 address. Write the result down so you can compare it later. Point it at the reachable server address. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Add the edition-appropriate SRV record if needed. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test from outside the server network after DNS propagates. Finish by checking the result against still required: reachable server port and correct firewall. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? An A or AAAA record maps a hostname to the server address. For Java Edition on a non-default port, an SRV record can advertise the service port so players use the hostname alone. DNS does not open a firewall or make a private address reachable. What should I check first? Start with a/aaaa: hostname to ipv4/ipv6 address. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Create a dedicated hostname such as play.example.com. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Pointing DNS at a private LAN address. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: A/AAAA: Hostname to IPv4/IPv6 address; SRV: Service target and port; Still required: Reachable server port and correct firewall. ### Minecraft server DDoS protection basics URL: https://applaunch.org/guides/minecraft-server-ddos-protection-basics Question: What should a hosting claim actually cover? Answer: Useful protection filters attack traffic upstream before the server link is saturated and avoids exposing an origin that attackers can bypass. Ask what game traffic and attack classes are covered, what happens during mitigation, and whether the protected address stays stable. Plain-English explanation: A denial-of-service attack sends more traffic than a server or internet link can handle. Useful protection filters that traffic before it fills the connection. A normal website CDN does not automatically protect the Minecraft game protocol, so ask specifically about game-server traffic. Protection can be bypassed if the real, unprotected server address is still published somewhere. Keep old DNS records, status pages and direct connection instructions from exposing an address that attackers can use to go around the protected route. Example: Players join through a protected address, but an old subdomain still points directly to the backend server. An attacker finds the old record and floods that direct address. The protected hostname stays healthy, yet the real server connection is already full. Removing the leak closes that bypass. Steps: Document every hostname and exposed address. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on filtering point: upstream of the constrained server link. Write the result down so you can compare it later. Confirm the game port is within provider protection. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Remove obsolete DNS pointing to the origin. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Prepare a communication and evidence plan. Finish by checking the result against incident plan: provider contact, logs and community status channel. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Useful protection filters attack traffic upstream before the server link is saturated and avoids exposing an origin that attackers can bypass. Ask what game traffic and attack classes are covered, what happens during mitigation, and whether the protected address stays stable. What should I check first? Start with filtering point: upstream of the constrained server link. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Document every hostname and exposed address. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Treating a web CDN as game-protocol protection. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Filtering point: Upstream of the constrained server link; Origin exposure: Direct backend address should not bypass protection; Incident plan: Provider contact, logs and community status channel. ### How much storage does a Minecraft server need? URL: https://applaunch.org/guides/minecraft-server-storage-estimate Question: How do you forecast disk use? Answer: Measure a representative world after a known amount of exploration, then budget for the live world, plugins/mods, logs, temporary update space and retained backups. Pre-generated or heavily explored maps can dominate storage even when player count is low. Plain-English explanation: Minecraft storage is used by worlds, player data, plugins or mods, logs and backups. The world often becomes the largest part because every explored chunk is saved. A small community can still create a large world if people travel very far in different directions. Do not fill a disk almost to the limit. Updates, world tools and backups may need temporary working space, and a completely full disk can stop saves or damage services. Measure real growth for a week or a test season, then keep comfortable room above it. Example: A test world grows by 6 GB after a week of normal exploration. The owner wants four weekly full copies plus room for logs and an update copy. A 10 GB plan clearly cannot hold that safely even though the fresh world was tiny. The backup policy changes the storage need. Steps: Measure actual directories after a test week. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on live data: worlds plus plugin/mod data. Write the result down so you can compare it later. Set log retention. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Model backup retention separately. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Alert before the filesystem becomes critically full. Finish by checking the result against backups: snapshot size × retained copies, adjusted for deduplication. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Measure a representative world after a known amount of exploration, then budget for the live world, plugins/mods, logs, temporary update space and retained backups. Pre-generated or heavily explored maps can dominate storage even when player count is low. What should I check first? Start with live data: worlds plus plugin/mod data. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure actual directories after a test week. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Counting only the world folder. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Live data: Worlds plus plugin/mod data; Operational headroom: Logs, updates, archives and temporary copies; Backups: Snapshot size × retained copies, adjusted for deduplication. ### How to audit Minecraft server plugins before launch URL: https://applaunch.org/guides/minecraft-server-plugin-audit Question: What makes a plugin acceptable for production? Answer: A plugin should have a trusted source, a version compatible with the exact server build, a clear purpose, maintained dependencies and permissions no broader than necessary. Install the smallest set that meets the design rather than treating plugins as harmless decorations. Plain-English explanation: Every plugin adds code, settings and future update work. Before launch, make a list showing what each plugin does, where it came from, which version is installed and who is responsible for it. If two plugins do the same job, keep the one you trust and understand best. Check compatibility with the exact Minecraft and server-software version. A plugin page saying “1.21” may not guarantee every later 1.21 release. Test permissions too: a moderation or economy plugin can cause serious problems if normal players receive powerful commands. Example: A server has three chat plugins because each was added to fix one small problem. They all change message formatting and permissions, producing confusing conflicts. Replacing them with one maintained plugin and a clear configuration makes updates and troubleshooting much easier. Steps: Record source URL, version and owner for every plugin. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on source: official project page or reputable download service. Write the result down so you can compare it later. Scan configuration and permissions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test upgrades on a clone. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Profile the complete stack under load. Finish by checking the result against running cost: game-update work, storage, network use and support burden. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A plugin should have a trusted source, a version compatible with the exact server build, a clear purpose, maintained dependencies and permissions no broader than necessary. Install the smallest set that meets the design rather than treating plugins as harmless decorations. What should I check first? Start with source: official project page or reputable download service. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Record source URL, version and owner for every plugin. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Downloading reuploaded jars. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Source: Official project page or reputable download service; Compatibility: Exact Minecraft, server-software and required add-on versions; Running cost: Game-update work, storage, network use and support burden. ### How to update a Minecraft server without losing the world URL: https://applaunch.org/guides/minecraft-server-update-without-losing-world Question: What is the safe update sequence? Answer: Stop writes cleanly, take a complete backup, clone the environment and test the new server, Java, plugins and mods together. World upgrades may be one-way, so rollback means restoring the pre-upgrade world rather than merely reinstalling the old jar. Plain-English explanation: A safe update starts with a complete copy of the current server. That means every world, player data, settings, plugins or mods—not just the main overworld folder. Test the update on another copy before the real server opens the world with new software. Minecraft world upgrades can change saved data. Reinstalling the old server file may not make the upgraded world safe for the old version. A real rollback therefore includes restoring the world copy made before the update. Example: You want to move from one Minecraft release to the next. First stop the test copy cleanly, back it up, update Java and server software there, then join and check inventories, portals, farms and plugin commands. Only after that rehearsal do you schedule the live update. Steps: Read release and migration notes. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on compatibility set: java, server, loader, plugins/mods and clients. Write the result down so you can compare it later. Back up every world and configuration file. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run the upgrade on a clone. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Schedule downtime and retain the old environment until validation. Finish by checking the result against acceptance test: join, travel, portals, inventories and critical plugins. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Stop writes cleanly, take a complete backup, clone the environment and test the new server, Java, plugins and mods together. World upgrades may be one-way, so rollback means restoring the pre-upgrade world rather than merely reinstalling the old jar. What should I check first? Start with compatibility set: java, server, loader, plugins/mods and clients. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Read release and migration notes. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Opening an upgraded world with the old server. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Compatibility set: Java, server, loader, plugins/mods and clients; Rollback asset: Complete pre-upgrade world and configuration backup; Acceptance test: Join, travel, portals, inventories and critical plugins. ### When a Minecraft network needs a Velocity proxy URL: https://applaunch.org/guides/minecraft-server-proxy-velocity Question: When is a proxy justified? Answer: A proxy is useful when players need one entry point into multiple backend servers, such as a lobby plus game modes. It is unnecessary complexity for one server, and backend servers must be protected so players cannot bypass the proxy or spoof forwarded identity. Plain-English explanation: A proxy such as Velocity gives players one front door for several Minecraft servers. It can send them from a lobby to survival, creative or minigame servers without entering a new address. A single normal server does not need this extra layer. The proxy becomes part of login and player identity, so security matters. Backend servers should accept connections only from the proxy and use the supported player-information forwarding setup. Simply turning off account checking on public backends is dangerous. Example: A network has a lobby, one survival server and one minigame server. Players join play.example.com, reach the Velocity proxy and are sent to the right backend. The backends are firewalled so nobody can connect to them directly and pretend to be another account. Steps: Confirm multiple backends are truly required. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on benefit: one address and controlled movement between backends. Write the result down so you can compare it later. Choose and configure a supported forwarding mode. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Firewall backends to the proxy path. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test reconnects and proxy failure behaviour. Finish by checking the result against security requirement: authenticated forwarding plus unreachable direct backends. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A proxy is useful when players need one entry point into multiple backend servers, such as a lobby plus game modes. It is unnecessary complexity for one server, and backend servers must be protected so players cannot bypass the proxy or spoof forwarded identity. What should I check first? Start with benefit: one address and controlled movement between backends. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Confirm multiple backends are truly required. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Turning off backend online mode without securing forwarding. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Benefit: One address and controlled movement between backends; New dependency: Proxy availability and configuration; Security requirement: Authenticated forwarding plus unreachable direct backends. ### What does it really cost to run a Minecraft server? URL: https://applaunch.org/guides/minecraft-server-cost-checklist Question: Which costs belong in the comparison? Answer: The monthly plan is only one line. Include resource upgrades, backup retention, domain or protected address needs, payment fees for community funding, and the operator time required for updates, moderation and recovery. Free home hosting still consumes hardware, power and attention. Plain-English explanation: The advertised monthly price is not the whole cost of a Minecraft server. You may also need more storage as the world grows, backup space, a domain, protected networking and paid tools. The owner also spends time on updates, moderation and fixing problems. Home hosting is not always truly free. It uses a computer, electricity and home internet, and somebody must be available when it breaks. Paid hosting is not automatically better either; compare the resources and support you actually need. Example: A £5 plan looks cheaper than a £9 plan, but the first needs a separate £3 backup service and has too little storage after two months. It also takes the owner several hours to manage. Over a year, the plan that looked cheaper may cost more or create more risk. Steps: Forecast a realistic 12-month workload. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on direct: hosting, storage, domains and paid tools. Write the result down so you can compare it later. Separate required costs from optional cosmetics. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Value administrator time consistently. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare plans at the resource level, not slot count. Finish by checking the result against risk: expected cost of downtime or lost worlds. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The monthly plan is only one line. Include resource upgrades, backup retention, domain or protected address needs, payment fees for community funding, and the operator time required for updates, moderation and recovery. Free home hosting still consumes hardware, power and attention. What should I check first? Start with direct: hosting, storage, domains and paid tools. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Forecast a realistic 12-month workload. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Ignoring renewal or upgrade pricing. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Direct: Hosting, storage, domains and paid tools; Operational: Updates, moderation, backups and incident response; Risk: Expected cost of downtime or lost worlds. ### How to choose a Minecraft server location URL: https://applaunch.org/guides/minecraft-server-location-latency Question: Which region gives the fairest experience? Answer: Choose the region that minimizes poor outcomes across the actual player group, not necessarily the lowest ping for the owner. Compare median and worst-player latency at the hours people play, then consider route stability and support alongside distance. Plain-English explanation: Server location affects how long player actions take to travel across the internet. That delay is called latency or ping. A server close to one person may be far from everybody else, so choose a location that gives the whole regular group a fair result. Distance is not the only factor. Internet routes can be crowded or indirect, especially in the evening. Test candidate locations at the times people normally play and look for steady results, not only the single lowest number. Example: The owner lives in Scotland, while most players live around London and a few live in France. A London region may give the group a better overall result than a server closest to the owner. Ask the regular players, rather than deciding from one home connection. Steps: Collect player regions without unnecessary precise location data. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on player map: where players who are online together really connect from. Write the result down so you can compare it later. Test candidate endpoints at play time. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Prefer a balanced central route. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Recheck after the community geography changes. Finish by checking the result against stability: lost data and sudden delay changes during the evening peak. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Choose the region that minimizes poor outcomes across the actual player group, not necessarily the lowest ping for the owner. Compare median and worst-player latency at the hours people play, then consider route stability and support alongside distance. What should I check first? Start with player map: where players who are online together really connect from. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Collect player regions without unnecessary precise location data. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Choosing from country labels alone. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Player map: Where players who are online together really connect from; Connection delay: Typical result plus the slowest regular player result; Stability: Lost data and sudden delay changes during the evening peak. ### How to test a Minecraft backup restore URL: https://applaunch.org/guides/minecraft-server-backup-restore-test Question: What proves a backup is usable? Answer: A successful archive job proves only that files were written. A restore test proves recovery: create an isolated server, restore every required world and configuration, start with network exposure blocked, then verify joins, inventories, locations, portals and plugin data. Plain-English explanation: A “backup completed” message only proves that some files were copied. A restore test proves those files can create a working server again. Restore into a separate folder or test machine so the check cannot overwrite the live world. Check more than whether the server starts. Join with a test player and inspect locations, inventories, the Nether and End, plugin data, permissions and important settings. Measure how long the whole process takes so recovery promises are realistic. Example: A backup contains the main world but misses the plugin folder and player permissions. The test server starts, so a basic check says it passed, but staff roles and protected areas are gone. A written join-and-check list catches that incomplete backup before a real emergency. Steps: Provision an isolated target. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on integrity: archive can be read and checksums pass. Write the result down so you can compare it later. Restore without overwriting production. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run a written acceptance checklist. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Record duration and fix missing dependencies. Finish by checking the result against recovery time: measured from incident decision to usable service. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A successful archive job proves only that files were written. A restore test proves recovery: create an isolated server, restore every required world and configuration, start with network exposure blocked, then verify joins, inventories, locations, portals and plugin data. What should I check first? Start with integrity: archive can be read and checksums pass. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Provision an isolated target. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Testing in the live directory. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Integrity: Archive can be read and checksums pass; Completeness: All dimensions, configs and plugin data exist; Recovery time: Measured from incident decision to usable service. ### Minecraft server launch checklist URL: https://applaunch.org/guides/minecraft-server-launch-checklist Question: What must be true before invitations go out? Answer: A server is ready when the exact client can join, tick health survives representative load, access is restricted, backups restore, rules have an owner and the connection instructions match DNS. “The process started” is only the first check. Plain-English explanation: A running server is not automatically ready for players. Before launch, use the same Minecraft client players will use, join through the public address, test saving and restarting, and try the busiest type of play you expect. Make sure somebody owns backups, updates and moderation. Launch to a small group first. They can find confusing instructions, missing permissions and performance problems without a large public audience watching. Freeze software versions for launch day instead of adding last-minute mods or plugins. Example: Ten trusted players join the evening before launch. They spread out, use portals, try important commands and reconnect after a restart. The owner restores a test backup and fixes two permission mistakes. The public launch now has evidence behind it, not just hope. Steps: Freeze the initial software versions. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on technical: join, save, restart, update and restore. Write the result down so you can compare it later. Run a load and exploration rehearsal. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Complete a restore drill. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Invite a small cohort before the public opening. Finish by checking the result against operations: named owner, rules, alerts and incident communication. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A server is ready when the exact client can join, tick health survives representative load, access is restricted, backups restore, rules have an owner and the connection instructions match DNS. “The process started” is only the first check. What should I check first? Start with technical: join, save, restart, update and restore. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Freeze the initial software versions. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Changing the modpack on launch day. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Technical: Join, save, restart, update and restore; Capacity: A realistic busy test where game updates stay on time; Operations: Named owner, rules, alerts and incident communication. ### Docker Compose production checklist URL: https://applaunch.org/guides/docker-compose-production-checklist Question: What changes between development and production? Answer: Production Compose should build or pull an application image with a fixed version, avoid linking live source-code folders into containers, use production settings and protected secrets, define restart and health behaviour, save only required data, and have a tested backup and rollback path. Plain-English explanation: A Compose file that works on a developer’s laptop is a useful start, but production has different needs. The live version should use a known application image, keep passwords outside the file, restart sensibly after a failure and store important data somewhere that survives a replaced container. Think about recovery before launch. You should know which folders contain real data, how to back them up, how to tell whether the app is healthy and how to return to the previous release. These checks matter more than adding lots of complicated Docker settings. Example: During development, a web container reads code straight from a laptop folder and uses a password written in compose.yaml. For production, the code is built into a versioned image, the password comes from a protected secret, uploads use a backed-up volume and the previous image is kept for rollback. Steps: Check the final combined settings with docker compose config. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on image: fixed version, repeatable build and application code included. Write the result down so you can compare it later. Remove development ports and source-code folder links. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Add health checks and clear restart behaviour. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Practise deployment, rollback and data restore. Finish by checking the result against recovery: known rollback image and restore procedure. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Production Compose should build or pull an application image with a fixed version, avoid linking live source-code folders into containers, use production settings and protected secrets, define restart and health behaviour, save only required data, and have a tested backup and rollback path. What should I check first? Start with image: fixed version, repeatable build and application code included. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Check the final combined settings with docker compose config. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using latest tags. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Image: Fixed version, repeatable build and application code included; Saved data: Named volumes or external services with backups; Recovery: Known rollback image and restore procedure. ### Docker Compose health checks that test readiness URL: https://applaunch.org/guides/docker-compose-healthcheck-guide Question: What should a health check prove? Answer: A health check should prove the service can perform its critical local function, not merely that its process exists. Keep it fast and deterministic; use dependency conditions when startup order needs readiness, while still making applications retry transient downstream failures. Plain-English explanation: A running process is not always a working application. It may have started but still be loading, waiting for its database or stuck in a state where it cannot answer users. A health check is a small command that asks the service to prove it can do its basic job. Keep the check quick and local. A web service might answer a simple health page that confirms its own important parts are ready. Do not make every check depend on half the internet, because an unrelated outage would make a healthy container look broken. Example: A database container starts its process in two seconds but needs another twenty seconds before it accepts queries. The web container uses a database health check and waits for a healthy result. It also keeps retrying later, because the database could restart again after launch. Steps: Choose a lightweight application-aware endpoint or command. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on liveness: process can keep doing useful work. Write the result down so you can compare it later. Set interval, timeout, retries and start period. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test both success and forced failure. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Make the application reconnect after dependency restarts. Finish by checking the result against dependency: service_healthy gates startup but not every future outage. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A health check should prove the service can perform its critical local function, not merely that its process exists. Keep it fast and deterministic; use dependency conditions when startup order needs readiness, while still making applications retry transient downstream failures. What should I check first? Start with liveness: process can keep doing useful work. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Choose a lightweight application-aware endpoint or command. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Checking only that a TCP port opens. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Liveness: Process can keep doing useful work; Readiness: Service can accept its intended traffic; Dependency: service_healthy gates startup but not every future outage. ### Why Docker Compose depends_on does not always mean ready URL: https://applaunch.org/guides/docker-compose-depends-on-not-wait Question: How do you wait for a dependency correctly? Answer: Basic dependency order controls creation order, not application readiness. Add a real dependency health check and use condition: service_healthy when appropriate, then retain retry logic because dependencies can fail again after startup. Plain-English explanation: depends_on tells Compose which container to start first, but “started” can mean only that its process was launched. A database may still be preparing files, and a web app may try to connect too soon. That is why a cold start can fail even though the order looks correct. Add a real health check to the dependency and wait for service_healthy where it fits. The application should still retry temporary failures, because startup ordering helps only at the beginning and does not protect against a later restart or short network problem. Example: Compose starts MySQL, then immediately starts PHP. PHP makes its first query before MySQL is ready and exits. A fixed ten-second sleep sometimes works but fails on a slower machine. A database health check waits for a real connection, while PHP retry logic handles later interruptions. Steps: Reproduce the cold-start race. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on creation: container has been started. Write the result down so you can compare it later. Add a database-aware health check. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Gate the dependent service on service_healthy. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test dependency restart after the stack is live. Finish by checking the result against resilient: consumer reconnects after later failure. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Basic dependency order controls creation order, not application readiness. Add a real dependency health check and use condition: service_healthy when appropriate, then retain retry logic because dependencies can fail again after startup. What should I check first? Start with creation: container has been started. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Reproduce the cold-start race. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Adding fixed sleep delays. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Creation: Container has been started; Healthy: Configured health command passes; Resilient: Consumer reconnects after later failure. ### Docker volumes vs bind mounts in production URL: https://applaunch.org/guides/docker-volume-vs-bind-mount Question: Where should each kind of data live? Answer: Build application code and fixed assets into the image, use Docker-managed volumes for data that must survive container replacement, and reserve links to host folders for deliberate needs such as configuration or imports. Every writable location needs a backup and ownership plan. Plain-English explanation: Both volumes and bind mounts let a container use files that are not part of its read-only image. A named volume is managed by Docker and works well for application-owned data. A bind mount points at an exact folder on the host, which gives control but connects the app tightly to that machine. Production application code normally belongs inside the image so every release is known and repeatable. Use persistent storage only for data that must survive replacement, such as uploads or a database. Decide how each persistent path will be backed up and restored. Example: A photo app has its code inside the image, stores uploaded pictures in a named volume and reads one host-provided configuration file through a deliberate bind mount. Replacing the container changes the code version but leaves the pictures in place. Steps: List every directory the application writes to. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on image layer: fixed application code and packaged assets. Write the result down so you can compare it later. Classify it as disposable, reproducible or required data. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Mount only required data or intentional host folders. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test backup and restore with matching permissions. Finish by checking the result against host-folder link: an explicit host path that ties the container to that host. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Build application code and fixed assets into the image, use Docker-managed volumes for data that must survive container replacement, and reserve links to host folders for deliberate needs such as configuration or imports. Every writable location needs a backup and ownership plan. What should I check first? Start with image layer: fixed application code and packaged assets. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List every directory the application writes to. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Linking source-code folders into production. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Image layer: Fixed application code and packaged assets; Named volume: Docker-managed application data that must survive; Host-folder link: An explicit host path that ties the container to that host. ### Docker Compose secrets vs environment variables URL: https://applaunch.org/guides/docker-compose-secrets-vs-environment Question: How should a container receive a credential? Answer: Use a secret manager or Compose secrets for sensitive values when the application can read a mounted file. Environment variables are convenient but more easily exposed through configuration, diagnostics or child processes; never commit real values into the Compose file. Plain-English explanation: Passwords and API keys need a safer path than being typed into compose.yaml. Environment variables are easy for applications to read, but they can appear in configuration output, debugging tools or child processes. Compose secrets can provide a value as a mounted file instead. The best method also depends on what the application supports. Whichever method you use, keep real values out of Git, give each service only the secrets it needs and write down how to replace a secret without rebuilding the entire world. Example: The web container needs a database password, but the worker does not. The password is stored outside the repository and supplied only to the web container as a secret file. When it changes, the deployment updates that secret and restarts the one service that reads it. Steps: List credentials and current exposure paths. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on source control: contains names and wiring, never secret values. Write the result down so you can compare it later. Move values to an external secret source. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Grant each service only the secrets it needs. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test rotation and removal. Finish by checking the result against rotation: document how a changed value reaches and restarts consumers. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use a secret manager or Compose secrets for sensitive values when the application can read a mounted file. Environment variables are convenient but more easily exposed through configuration, diagnostics or child processes; never commit real values into the Compose file. What should I check first? Start with source control: contains names and wiring, never secret values. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List credentials and current exposure paths. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using .env as proof of secrecy. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Source control: Contains names and wiring, never secret values; Runtime: Mounted secret file where supported; Rotation: Document how a changed value reaches and restarts consumers. ### Docker Compose networking explained URL: https://applaunch.org/guides/docker-compose-networking-explained Question: Which address should one service call? Answer: Inside a Compose network, call the dependency by service name and container port. Publish a host port only when traffic must enter from outside Docker; localhost inside a container refers to that same container, not its neighbour or the host. Plain-English explanation: Compose normally creates a private network where services can find each other by service name. A web container can call db on the database’s internal port. Inside a container, localhost means that same container—it does not mean another service or the host computer. Publish a port only when something outside Docker must reach it. A public website may publish the reverse proxy’s web ports, while its database and cache stay private. Fewer published ports means fewer services exposed by mistake. Example: The app connects to mysql:3306 inside the Compose network. The database does not publish 3306 to the internet. A reverse proxy publishes ports 80 and 443 and sends web requests to app:8080. Each address describes the path that actually needs to exist. Steps: Draw each required traffic path. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on container-to-container: service-name:container-port. Write the result down so you can compare it later. Remove published database/cache ports unless externally needed. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use service names in application configuration. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test name resolution and firewall exposure. Finish by checking the result against isolation: attach services only to networks they need. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Inside a Compose network, call the dependency by service name and container port. Publish a host port only when traffic must enter from outside Docker; localhost inside a container refers to that same container, not its neighbour or the host. What should I check first? Start with container-to-container: service-name:container-port. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Draw each required traffic path. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using localhost for another service. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Container-to-container: service-name:container-port; Host-to-container: published-host-port; Isolation: Attach services only to networks they need. ### Choosing a Docker Compose restart policy URL: https://applaunch.org/guides/docker-compose-restart-policy Question: Which failures should restart automatically? Answer: Use restart behaviour that matches the service: long-running production services commonly need automatic recovery, while one-shot migrations and jobs should surface failure rather than loop forever. A restart policy is not a fix for deterministic crashes. Plain-English explanation: A restart policy tells Docker what to do when a container stops. Long-running web services often should return after an unexpected crash or host restart. One-time jobs, such as a database migration, should usually finish once and show a clear failure instead of looping forever. Automatic restart is useful recovery, not a cure. If the same programming error makes a service crash every five seconds, restarting it hides the symptom behind a noisy loop and can fill logs. Alert on repeated restarts and fix the cause. Example: A web server uses unless-stopped so it returns after a machine reboot but stays off when an operator deliberately stops it. A migration container uses no endless restart policy; if its SQL fails, the release stops and shows the error for investigation. Steps: Classify each service as daemon or job. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on long-running service: restart after unexpected exit. Write the result down so you can compare it later. Test clean shutdown and non-zero exit. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set a finite backoff in the application where relevant. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Alert on repeated restarts. Finish by checking the result against crash loop: alert and preserve logs instead of hiding it. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use restart behaviour that matches the service: long-running production services commonly need automatic recovery, while one-shot migrations and jobs should surface failure rather than loop forever. A restart policy is not a fix for deterministic crashes. What should I check first? Start with long-running service: restart after unexpected exit. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Classify each service as daemon or job. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Applying always to migrations. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Long-running service: Restart after unexpected exit; One-shot job: Run to completion and expose status; Crash loop: Alert and preserve logs instead of hiding it. ### Why latest is a risky Docker image tag URL: https://applaunch.org/guides/docker-image-tags-production Question: Can you reproduce the running release? Answer: A changeable tag such as latest can point to different content over time, so the same Compose file may deploy a different build tomorrow. Use a version or source-code revision tag and ideally record the exact image content identifier that actually ran. Plain-English explanation: A Docker tag is a label attached to an image. The label latest can be moved to different image contents, so the same Compose file may run one build today and another build tomorrow. That makes failures and rollback difficult to explain. Use a release number or source commit tag and record the image digest, which identifies the exact content. Keep the previous known-good image available. Production should not need to rebuild old code during an emergency just to return to it. Example: Version 2.4.1 is deployed with its recorded digest. Version 2.4.2 later fails its health check. The operator changes the deployment back to the saved 2.4.1 reference and knows it is the same image that worked before—not a newly moved latest tag. Steps: Tag images with a release or source-code revision. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on traceability: release maps to a source-code revision and exact image. Write the result down so you can compare it later. Record the exact image identifier in deployment evidence. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Retain previous images according to the rollback policy. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test rollback without rebuilding. Finish by checking the result against rollback: previous known-good reference remains available. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A changeable tag such as latest can point to different content over time, so the same Compose file may deploy a different build tomorrow. Use a version or source-code revision tag and ideally record the exact image content identifier that actually ran. What should I check first? Start with traceability: release maps to a source-code revision and exact image. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Tag images with a release or source-code revision. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Reusing version tags. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Traceability: Release maps to a source-code revision and exact image; Repeatability: Pulling the reference retrieves the intended content; Rollback: Previous known-good reference remains available. ### Can Docker Compose deploy with zero downtime? URL: https://applaunch.org/guides/docker-compose-zero-downtime-reality Question: What can a single-host Compose stack guarantee? Answer: Compose can recreate an individual service, but strict zero downtime needs overlapping healthy instances, traffic switching and backward-compatible state changes. On one small host, a brief, planned maintenance window is often more honest and safer than pretending recreation is invisible. Plain-English explanation: Replacing one container usually creates at least a short moment when that instance is unavailable. True zero-downtime deployment needs an old and new version running together, a proxy that sends traffic only to a ready instance and database changes that both versions understand. That can be worth it for an important busy service, but it adds complexity. For a small app on one machine, a clearly announced one-minute maintenance window may be safer and more honest than a fragile setup that claims no downtime. Example: The new web version starts beside the old one and passes its health check. The proxy begins sending new requests to it, then the old container stops. If both versions cannot safely use the same database during that overlap, the plan is not zero downtime yet. Steps: Define an acceptable outage target. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on application: can old and new versions run simultaneously?. Write the result down so you can compare it later. Make health and readiness observable. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use expand-and-contract database migrations. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test failed rollout and traffic rollback. Finish by checking the result against database: schema works during both sides of the rollout. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Compose can recreate an individual service, but strict zero downtime needs overlapping healthy instances, traffic switching and backward-compatible state changes. On one small host, a brief, planned maintenance window is often more honest and safer than pretending recreation is invisible. What should I check first? Start with application: can old and new versions run simultaneously?. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Define an acceptable outage target. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Equating restart: always with zero downtime. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Application: Can old and new versions run simultaneously?; Traffic: Proxy routes only to ready instances; Database: Schema works during both sides of the rollout. ### How to back up a database in Docker Compose URL: https://applaunch.org/guides/docker-compose-backup-database-volume Question: Should you copy the volume directory? Answer: Prefer a database-aware logical or physical backup method that guarantees consistency. Copying live database files without coordination can capture an unusable state; whichever method you choose, restore it into an isolated database and validate application queries. Plain-English explanation: A database changes files while it is running. Copying those files at a random moment can capture part of one change and part of another, producing a backup that looks complete but will not start. Use the database’s supported dump or backup method, or a snapshot method that coordinates with it. Move the result away from the Docker host and keep several dates. Then restore into a separate database and let the application read important records. The restore test is what turns copied bytes into evidence of recovery. Example: A MySQL container writes to a named volume. Instead of simply copying the live volume folder, a scheduled job creates a consistent database dump, encrypts it and sends it to separate storage. Every month a clean container restores the dump and runs application checks. Steps: Select the engine-supported backup method. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on consistency: database knows or is quiesced during capture. Write the result down so you can compare it later. Encrypt and transfer the result off-host. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Retain multiple recovery points. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Schedule full restore drills. Finish by checking the result against proof: automated restore plus integrity/application checks. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Prefer a database-aware logical or physical backup method that guarantees consistency. Copying live database files without coordination can capture an unusable state; whichever method you choose, restore it into an isolated database and validate application queries. What should I check first? Start with consistency: database knows or is quiesced during capture. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Select the engine-supported backup method. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Tar-ing live database files blindly. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Consistency: Database knows or is quiesced during capture; Separation: Backup leaves the Docker host; Proof: Automated restore plus integrity/application checks. ### Docker Compose CPU and memory limits URL: https://applaunch.org/guides/docker-compose-resource-limits Question: What should a container limit accomplish? Answer: Limits should contain a runaway service without making normal busy periods fail. Measure real memory and processor demand, keep room for Docker and the operating system, set memory deliberately, and alert before forced slowdowns or out-of-memory stops become the first warning. Plain-English explanation: Resource limits stop one container from taking everything on the host. A memory limit is a hard ceiling; going beyond it may cause the process to be killed. A CPU limit controls how much processing time the service receives, which can slow it rather than immediately stopping it. Choose limits from a busy realistic test and leave room for Docker, the operating system and other services. Limits that are too low create failures during normal peaks. Limits that use every available resource leave the host unable to recover or run backups. Example: A web container normally uses 300 MB and reaches 520 MB during image uploads. A 350 MB limit will fail during a real upload even though idle tests pass. The team sets a justified higher limit, caps the number of workers and keeps host memory free. Steps: Test traffic that represents a real busy period. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on memory: a hard limit; exceeding it can stop the process. Write the result down so you can compare it later. Record memory and processor use across several busy results. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set initial limits above the measured peak with a justified safety margin. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Create resource pressure deliberately and observe recovery. Finish by checking the result against host safety margin: docker, file cache, logging and maintenance tools. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Limits should contain a runaway service without making normal busy periods fail. Measure real memory and processor demand, keep room for Docker and the operating system, set memory deliberately, and alert before forced slowdowns or out-of-memory stops become the first warning. What should I check first? Start with memory: a hard limit; exceeding it can stop the process. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Test traffic that represents a real busy period. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Allocating 100% of host RAM to containers. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Memory: A hard limit; exceeding it can stop the process; Processor: A share of processing time, not stored capacity; Host safety margin: Docker, file cache, logging and maintenance tools. ### Why use a multi-stage Docker build? URL: https://applaunch.org/guides/docker-multi-stage-build Question: What belongs in the final image? Answer: The final image should contain the runtime, production dependencies and built application—not compilers, package caches or test tools. Multi-stage builds let one stage compile and another copy only the required artifacts. Plain-English explanation: Building an application may need compilers, development packages and source files that are not needed when it runs. A multi-stage Dockerfile uses one stage to build the app and a smaller final stage to run only the finished result. The final image becomes smaller and contains fewer tools an attacker could use. It also makes the intended runtime files clearer. Still scan and test the final stage, because that is the image production actually runs. Example: A Node app uses one stage to install all packages and create a production build. The final stage copies only the built files and production packages, then runs as a non-root user. Compilers, test tools and the original source tree are left behind. Steps: Name builder and runtime stages. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on builder: toolchain, dev dependencies and compilation. Write the result down so you can compare it later. Copy dependency manifests before source to improve cache reuse. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Copy only built output into runtime. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run as a non-root user where possible. Finish by checking the result against verification: scan and run the exact final stage. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The final image should contain the runtime, production dependencies and built application—not compilers, package caches or test tools. Multi-stage builds let one stage compile and another copy only the required artifacts. What should I check first? Start with builder: toolchain, dev dependencies and compilation. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Name builder and runtime stages. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Copying the whole builder filesystem. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Builder: Toolchain, dev dependencies and compilation; Runtime: Minimum files and packages needed to execute; Verification: Scan and run the exact final stage. ### Speed up Docker builds without stale results URL: https://applaunch.org/guides/docker-build-cache-speed Question: Which layer invalidates the expensive work? Answer: Copy stable dependency manifests before frequently changing source, use a precise .dockerignore, and use supported cache mounts for package managers. Cache is an accelerator, not a source of truth; a clean build must still produce the same application. Plain-English explanation: Docker reuses an earlier build layer when its instructions and inputs have not changed. Good layer order keeps slow dependency installation reusable while letting source-code changes rebuild only later steps. A large build context can spoil that by sending unnecessary changing files. Use a careful .dockerignore and committed lockfiles. Cache should make a correct build faster, not decide what the build contains. Occasionally compare with a clean build so missing inputs or stale results do not stay hidden. Example: A Dockerfile copies the entire project before npm install, so changing one README file reinstalls every package. Moving package.json and the lockfile into an earlier step lets Docker reuse dependencies until those files actually change. Steps: Measure layer timing with a cold build. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on context: only files the build needs. Write the result down so you can compare it later. Add a narrow .dockerignore. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Separate dependency install from source copy. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare cached and no-cache outputs. Finish by checking the result against reproducibility: lockfiles and clean-build verification. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Copy stable dependency manifests before frequently changing source, use a precise .dockerignore, and use supported cache mounts for package managers. Cache is an accelerator, not a source of truth; a clean build must still produce the same application. What should I check first? Start with context: only files the build needs. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure layer timing with a cold build. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Ignoring lockfiles. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Context: Only files the build needs; Layer order: Stable expensive steps before volatile source; Reproducibility: Lockfiles and clean-build verification. ### Stop Docker container logs filling the disk URL: https://applaunch.org/guides/docker-container-logs-disk-full Question: How much log history belongs on the host? Answer: Unlimited local JSON logs can consume the filesystem and take every service down. Set size and file-count limits or use a managed logging driver, keep high-value structured events, and alert on both growth rate and remaining space. Plain-English explanation: Containers can produce logs much faster than expected, especially when an error repeats. If local log files have no size limit, they can fill the host disk and break every service, including the one you need to investigate the problem. Set a maximum file size and number of old files, or send logs to a managed system with a retention policy. Keep useful events and request details, but remove secrets and turn noisy debug logging off after the investigation. Example: A failed API call is retried several times each second and writes a large stack trace every time. Within a day the Docker log consumes most of the disk. Rotation limits the damage, while a rate-limited error and alert lead the team to the real broken API. Steps: Identify the largest container logs. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on retention: defined by incident and compliance need. Write the result down so you can compare it later. Fix noisy repeated errors at source. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Configure bounded rotation. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test that old logs expire and new logs remain searchable. Finish by checking the result against detection: filesystem and per-service log growth alerts. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Unlimited local JSON logs can consume the filesystem and take every service down. Set size and file-count limits or use a managed logging driver, keep high-value structured events, and alert on both growth rate and remaining space. What should I check first? Start with retention: defined by incident and compliance need. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Identify the largest container logs. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Deleting an open log without understanding disk handles. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Retention: Defined by incident and compliance need; Rotation: Bounded size and number of local files; Detection: Filesystem and per-service log growth alerts. ### Docker Compose environment files without surprises URL: https://applaunch.org/guides/docker-compose-environment-files Question: Which values does Compose see, and which reach the container? Answer: Compose interpolation and a service env_file solve different problems. Treat the rendered configuration as the truth, keep environment-specific non-secret values explicit, and source secrets separately rather than assuming a hidden .env file is secure. Plain-English explanation: Compose uses environment values in two different ways. Some values fill placeholders while Compose reads the YAML file. Others are passed into the container for the application to read. An env_file for a service does not automatically fill every placeholder elsewhere in the Compose file. Give development, staging and production clear separate inputs and check the final result with docker compose config. Keep passwords in a real secret path rather than assuming a file is safe because its name begins with a dot. Example: APP_PORT is used while Compose builds a published-port line, while DATABASE_HOST is passed into the web container. The team documents where each value comes from and fails the deployment when a required production value is missing. Steps: Name development, staging and production inputs clearly. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on interpolation: values used while compose parses yaml. Write the result down so you can compare it later. Render config in CI before deployment. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Fail on missing required values. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Keep real secrets out of committed env files. Finish by checking the result against audit: docker compose config with secrets redacted. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Compose interpolation and a service env_file solve different problems. Treat the rendered configuration as the truth, keep environment-specific non-secret values explicit, and source secrets separately rather than assuming a hidden .env file is secure. What should I check first? Start with interpolation: values used while compose parses yaml. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Name development, staging and production inputs clearly. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Assuming env_file interpolates every YAML field. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Interpolation: Values used while Compose parses YAML; Container env: Values passed to the service process; Audit: docker compose config with secrets redacted. ### Reverse proxy and HTTPS for a Docker Compose app URL: https://applaunch.org/guides/docker-compose-reverse-proxy-https Question: Which container should be public? Answer: Normally only the reverse proxy publishes web ports. Application and database services stay on internal Compose networks; the proxy selects a backend by service name, handles certificates and forwards the headers the application is configured to trust. Plain-English explanation: A reverse proxy is the public front door for a web application. It receives requests for a domain, handles HTTPS and sends each request to the correct private container. The application and database normally do not need their own public host ports. The proxy also sends information such as the original scheme and visitor address. Configure the app to trust those headers only from the real proxy; trusting them from anybody can let a visitor pretend a request came through a secure path. Example: Only the proxy publishes ports 80 and 443. It sends app.example.com to web:8080 on the private Compose network. The database has no public port. Certificates renew at the proxy, and an external monitor warns well before expiry. Steps: Point DNS at the reachable host. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on public edge: ports 80/443 where required. Write the result down so you can compare it later. Publish only proxy ports. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Configure certificate issuance and renewal. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test redirects, client IP handling and backend isolation. Finish by checking the result against trust boundary: explicit proxy headers and allowed proxy source. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Normally only the reverse proxy publishes web ports. Application and database services stay on internal Compose networks; the proxy selects a backend by service name, handles certificates and forwards the headers the application is configured to trust. What should I check first? Start with public edge: ports 80/443 where required. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Point DNS at the reachable host. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Publishing database ports. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Public edge: Ports 80/443 where required; Internal app: Service name and container port; Trust boundary: Explicit proxy headers and allowed proxy source. ### Run database migrations safely with Docker Compose URL: https://applaunch.org/guides/docker-compose-database-migrations Question: Who should run the migration? Answer: Run migrations as an explicit one-shot release step with the same application image and a single owner. Prefer backward-compatible expand-and-contract changes so old and new application versions can overlap or roll back safely. Plain-English explanation: A database migration changes tables or stored information for a new app release. Run it as one controlled job, not from every web container at once. If three replicas all try the same change, they can conflict or repeat work. Safer releases add the new structure first, deploy code that understands both old and new shapes, move data in manageable batches and remove the old structure later. This leaves a period when the application can roll back without finding a database it no longer understands. Example: A column needs a new name. The release first adds the new column, then code writes to both and reads the new one. After data is copied and the rollback period ends, a later release removes the old column. Nothing depends on one irreversible moment. Steps: Back up or confirm recovery before destructive changes. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on execution: exactly one controlled migration job. Write the result down so you can compare it later. Apply additive schema first. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Deploy code that supports both shapes. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Remove old columns only after rollback window closes. Finish by checking the result against failure: deployment stops and exposes logs/status. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Run migrations as an explicit one-shot release step with the same application image and a single owner. Prefer backward-compatible expand-and-contract changes so old and new application versions can overlap or roll back safely. What should I check first? Start with execution: exactly one controlled migration job. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Back up or confirm recovery before destructive changes. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Every web replica runs migrations. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Execution: Exactly one controlled migration job; Compatibility: Old and new code tolerate transitional schema; Failure: Deployment stops and exposes logs/status. ### What to monitor in a Docker Compose stack URL: https://applaunch.org/guides/docker-compose-monitoring-basics Question: Which alerts justify waking someone? Answer: Start with availability and latency at the real service boundary, then container restarts, health state, CPU/memory saturation, disk capacity and backup success. An alert needs an owner and action; a dashboard without response thresholds is decoration. Plain-English explanation: Start monitoring with what a user needs: can the service answer correctly, and how long does it take? Then add the information that explains failures, such as container restarts, health state, memory, CPU, disk space and database availability. Every alert needs an owner and an action. A warning that nobody understands or responds to becomes background noise. Brief harmless spikes may belong on a graph, while continued user failures or a rapidly filling disk should alert somebody. Example: An external check sees that checkout fails even though every container is still running. The dashboard shows the database is healthy but the payment API calls are timing out. User-outcome monitoring found a problem that a simple “container up” check missed. Steps: Define one service-level symptom per public endpoint. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on user outcome: success rate and latency. Write the result down so you can compare it later. Add resource and lifecycle context. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set actionable thresholds with time windows. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test alerts by forcing safe failures. Finish by checking the result against durability: disk, database and backup/restore status. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Start with availability and latency at the real service boundary, then container restarts, health state, CPU/memory saturation, disk capacity and backup success. An alert needs an owner and action; a dashboard without response thresholds is decoration. What should I check first? Start with user outcome: success rate and latency. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Define one service-level symptom per public endpoint. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Alerting on every brief CPU spike. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: User outcome: Success rate and latency; Runtime: Health, restarts and resource pressure; Durability: Disk, database and backup/restore status. ### Docker Compose security checklist URL: https://applaunch.org/guides/docker-compose-security-checklist Question: Which controls reduce the ways an attacker can get in? Answer: Use trusted images with fixed versions, run without the root account where possible, remove unneeded permissions, make files read-only when the application does not need to change them, expose only required ports and protect secrets. Keep the host and images updated because containers do not remove the need for security maintenance. Plain-English explanation: Containers reduce some kinds of accidental interference, but they do not remove the need for security. Use trusted versioned images, update them, run with as little permission as possible and expose only ports that real users or systems need. Avoid giving ordinary application containers control of Docker itself. Mounting the Docker socket or running privileged can give a compromised app control over the whole host. Protect secrets and important volumes, and plan how to rebuild after an incident. Example: A small web container runs as a non-root user, reads a single database secret, writes only to its upload volume and connects only to the app and database networks. It cannot manage Docker or browse unrelated host folders. Steps: List images, ports, mounted folders and special permissions. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on software source: fixed trusted image and vulnerability review. Write the result down so you can compare it later. Remove Docker socket access unless it is essential. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Patch and rebuild on a defined schedule. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test how damage is contained and how credentials are changed. Finish by checking the result against exposure: only the required public ports and network paths. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use trusted images with fixed versions, run without the root account where possible, remove unneeded permissions, make files read-only when the application does not need to change them, expose only required ports and protect secrets. Keep the host and images updated because containers do not remove the need for security maintenance. What should I check first? Start with software source: fixed trusted image and vulnerability review. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List images, ports, mounted folders and special permissions. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Mounting /var/run/docker.sock into ordinary apps. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Software source: Fixed trusted image and vulnerability review; Access: Non-root account, minimal permissions and folder access; Exposure: Only the required public ports and network paths. ### Managed Docker hosting vs a VPS URL: https://applaunch.org/guides/managed-docker-hosting-vs-vps Question: Which layer do you want to operate? Answer: A VPS gives broad host control but makes you responsible for OS patching, Docker installation, firewalling, monitoring and recovery. Managed Docker hosting removes some host work but may constrain networking, privileges or storage; choose from workload requirements and operator capacity. Plain-English explanation: A VPS gives you a virtual computer with broad control. That means you choose Docker, firewall rules, updates, monitoring and backups—and you are responsible when any of them fail. Managed Docker hosting handles more of that host layer but may limit special network or system features. Choose by writing down what the app truly requires and who will do the weekly operational work. Root access is valuable only when you need it and have somebody able to use it safely. Example: A standard web app needs two containers, a domain and persistent uploads. It does not need kernel changes or unusual host software, and the team has no server administrator. Managed Docker hosting removes work they are not equipped to own. A networking product needing custom kernel features may require a VPS. Steps: List kernel, network, volume and privilege requirements. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on vps: maximum host control and maximum host responsibility. Write the result down so you can compare it later. List routine patching and incident tasks. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Price backups and operator time. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test the deployment and restore path before committing. Finish by checking the result against decision: required privileges versus available operations time. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A VPS gives broad host control but makes you responsible for OS patching, Docker installation, firewalling, monitoring and recovery. Managed Docker hosting removes some host work but may constrain networking, privileges or storage; choose from workload requirements and operator capacity. What should I check first? Start with vps: maximum host control and maximum host responsibility. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List kernel, network, volume and privilege requirements. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Comparing headline monthly price only. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: VPS: Maximum host control and maximum host responsibility; Managed: Reduced host administration with platform constraints; Decision: Required privileges versus available operations time. ### Which PHP version should you use in production? URL: https://applaunch.org/guides/choose-php-version-production Question: Newest PHP or safest compatible PHP? Answer: Use a currently supported PHP branch that your framework, CMS and extensions explicitly support. Newer releases may improve language and runtime behaviour, but production migration should pass the application test suite and deprecation review before the old runtime is removed. Plain-English explanation: Use a PHP version that still receives security fixes and is supported by your application. “The page opens” is not enough: the framework, installed packages and PHP extensions must all support that version. A newer version can bring improvements, but test it away from the live site first. Include command-line jobs and background workers as well as normal web pages, because they may use a different PHP installation. Example: A site runs PHP 8.2 and its framework supports 8.4. The team tests 8.4 on staging, updates one incompatible package and checks forms, uploads, scheduled jobs and payments. Only then do they switch production while keeping an 8.2 rollback path. Steps: Check the current PHP support table. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on support: branch still receives security fixes. Write the result down so you can compare it later. Audit Composer platform requirements and native extensions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run tests with deprecations visible. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Switch with a rollback window. Finish by checking the result against proof: tests and representative traffic on the new runtime. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use a currently supported PHP branch that your framework, CMS and extensions explicitly support. Newer releases may improve language and runtime behaviour, but production migration should pass the application test suite and deprecation review before the old runtime is removed. What should I check first? Start with support: branch still receives security fixes. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Check the current PHP support table. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Staying on end-of-life PHP because the site loads. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Support: Branch still receives security fixes; Compatibility: Framework, packages and extensions support it; Proof: Tests and representative traffic on the new runtime. ### PHP 8.4 upgrade checklist URL: https://applaunch.org/guides/php-8-4-upgrade-checklist Question: What must be tested before PHP 8.4? Answer: Treat a minor PHP upgrade as a compatibility change: read the migration guide, update dependencies that declare support, test deprecated and backward-incompatible behaviour, verify required extensions, then run the release in staging with production-like configuration. Plain-English explanation: Moving to PHP 8.4 changes the language runtime underneath the application. Some old behaviour is deprecated or changed, and packages may need newer releases. Read the official migration guide and test the exact app rather than assuming every PHP 8 release is interchangeable. Check all ways PHP runs: the website, command line, scheduled tasks and queue workers. A server can accidentally use PHP 8.4 for web requests while cron still runs an older binary. Example: The staging homepage works on PHP 8.4, but a nightly import fails because its command-line script uses an old library. Testing the scheduled job before launch catches a problem that browser-only testing missed. Steps: Run composer why-not php 8.4 where applicable. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on code: tests cover changed and deprecated behaviour. Write the result down so you can compare it later. Enable comprehensive error reporting outside production. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test uploads, mail, database and scheduled jobs. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Keep the old runtime available for rollback. Finish by checking the result against operations: fpm, cli, cron and workers use intended binaries. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Treat a minor PHP upgrade as a compatibility change: read the migration guide, update dependencies that declare support, test deprecated and backward-incompatible behaviour, verify required extensions, then run the release in staging with production-like configuration. What should I check first? Start with code: tests cover changed and deprecated behaviour. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Run composer why-not php 8.4 where applicable. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Testing only the homepage. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Code: Tests cover changed and deprecated behaviour; Dependencies: Composer packages and extensions support 8.4; Operations: FPM, CLI, cron and workers use intended binaries. ### PHP OPcache in production: what to tune URL: https://applaunch.org/guides/php-opcache-production-settings Question: What does OPcache improve? Answer: OPcache stores compiled PHP bytecode in shared memory, removing repeated parse and compile work. Size it so the application fits without excessive restarts, keep timestamp validation aligned with the deployment model, and monitor cache fullness and wasted memory. Plain-English explanation: PHP normally has to read and prepare code files before running them. OPcache keeps the prepared version in memory so later requests can reuse it. This can make a busy PHP site faster without changing the application. The cache needs enough room for the real codebase and a clear way to notice new files after deployment. Monitor whether it fills up or restarts often. OPcache cannot fix slow database queries or an overloaded external API. Example: A site has 12,000 PHP files but the cache is set to hold fewer. Files keep dropping out and being prepared again. Increasing the file capacity based on the measured codebase improves the hit rate, while the deployment process resets the cache when code changes. Steps: Count PHP files and inspect current OPcache status. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on memory: enough for application scripts and interned strings. Write the result down so you can compare it later. Choose memory from measured usage. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Define cache reset as part of deployment. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare request latency and cache hit rate. Finish by checking the result against deployment: invalidate or restart cache predictably when code changes. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? OPcache stores compiled PHP bytecode in shared memory, removing repeated parse and compile work. Size it so the application fits without excessive restarts, keep timestamp validation aligned with the deployment model, and monitor cache fullness and wasted memory. What should I check first? Start with memory: enough for application scripts and interned strings. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Count PHP files and inspect current OPcache status. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Disabling timestamp checks without a deploy reset. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Memory: Enough for application scripts and interned strings; File capacity: max_accelerated_files exceeds real script count; Deployment: Invalidate or restart cache predictably when code changes. ### Why changing upload_max_filesize may not fix PHP uploads URL: https://applaunch.org/guides/php-upload-limit-not-working Question: Which limit rejects the request first? Answer: The upload ceiling depends on more than upload_max_filesize. post_max_size must cover the whole request, the web server or proxy may set its own size limit, and PHP needs a writable temporary folder. Confirm the settings used by the website, not only those used by PHP commands in a terminal. Plain-English explanation: A PHP upload passes through several size checks. upload_max_filesize limits the file itself, post_max_size limits the whole form request, and the web server or proxy may have another limit. PHP also needs a writable temporary folder with enough free space. Make sure you edit the settings used by the website. Command-line PHP can load a different php.ini file, so a change shown by php --ini may not affect PHP-FPM or the web server. Example: upload_max_filesize is raised to 50 MB, but post_max_size remains 8 MB. A 20 MB image still fails because the whole request is rejected before the file limit matters. Raising the matching request limit and restarting the correct PHP service fixes it. Steps: Check the PHP settings shown by the website safely. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on php file: upload_max_filesize. Write the result down so you can compare it later. Compare every request-size limit. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Check temporary folder space and permissions. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Restart the correct service and test a file with a known size. Finish by checking the result against before php: proxy and web-server size and time limits. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The upload ceiling depends on more than upload_max_filesize. post_max_size must cover the whole request, the web server or proxy may set its own size limit, and PHP needs a writable temporary folder. Confirm the settings used by the website, not only those used by PHP commands in a terminal. What should I check first? Start with php file: upload_max_filesize. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Check the PHP settings shown by the website safely. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Editing only the php.ini used by command-line PHP. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: PHP file: upload_max_filesize; Whole request: post_max_size plus the rest of the form; Before PHP: Proxy and web-server size and time limits. ### How to choose a PHP memory_limit URL: https://applaunch.org/guides/php-memory-limit-sizing Question: Why is per-request memory not the same as server RAM? Answer: memory_limit constrains an individual PHP request or process, while the host must support multiple workers plus MySQL, caches and the OS. A 256 MB limit with 20 simultaneous workers represents a theoretical 5 GB PHP ceiling before other services. Plain-English explanation: PHP memory_limit applies to one PHP process or request. The server may run many PHP workers at the same time, so a 256 MB limit does not mean the whole site needs only 256 MB. Twenty workers could theoretically ask for 5 GB before counting MySQL or the operating system. Measure the heaviest normal actions, such as imports or image processing, and separate unusual command-line jobs from ordinary web pages. Fix unexpected growth before raising limits across every request. Example: Normal pages use under 80 MB, while a monthly import needs 400 MB. Instead of giving every web request 512 MB, the site keeps a smaller web limit and runs the controlled import with its own setting and worker limit. Steps: Measure peak memory for representative endpoints and jobs. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on per process: memory_limit. Write the result down so you can compare it later. Separate web and CLI job requirements. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Cap worker concurrency to fit the host. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Fix abnormal growth before increasing limits. Finish by checking the result against host model: limit × workers plus database, cache and os headroom. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? memory_limit constrains an individual PHP request or process, while the host must support multiple workers plus MySQL, caches and the OS. A 256 MB limit with 20 simultaneous workers represents a theoretical 5 GB PHP ceiling before other services. What should I check first? Start with per process: memory_limit. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure peak memory for representative endpoints and jobs. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Setting -1 in production. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Per process: memory_limit; Concurrency: Maximum active PHP workers; Host model: limit × workers plus database, cache and OS headroom. ### How to size PHP-FPM workers URL: https://applaunch.org/guides/php-fpm-worker-sizing Question: How many PHP requests can run safely? Answer: Worker capacity is limited by both memory and processor time. Divide the memory available to PHP by the memory used by one of the larger busy workers, then run a realistic traffic test. Too many active workers create a queue and can make every request slower even when they fit in RAM. Plain-English explanation: PHP-FPM keeps worker processes ready to answer web requests. More workers can handle more requests at once, but each uses memory and active workers also compete for CPU time. Too many can make the whole server slower or run it out of memory. Measure worker memory during real endpoints, reserve room for MySQL and the operating system, then load-test. Watch the request queue as well as CPU and memory. A queue may mean too few workers, but it can also mean slow code or database work. Example: Workers reach about 120 MB during busy requests and 2 GB is safely available to PHP. Setting 30 workers could need 3.6 GB and is unsafe. The team starts below the memory ceiling, then improves a slow query before adding concurrency. Steps: Measure worker memory across several types of request. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on memory ceiling: available php ram ÷ memory used by a larger busy worker. Write the result down so you can compare it later. Reserve RAM for the database, cache and operating system. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set max_children below the safe memory ceiling. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test busy traffic and watch the queue, processor and response time together. Finish by checking the result against queue signal: waiting requests and response time during peak traffic. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Worker capacity is limited by both memory and processor time. Divide the memory available to PHP by the memory used by one of the larger busy workers, then run a realistic traffic test. Too many active workers create a queue and can make every request slower even when they fit in RAM. What should I check first? Start with memory ceiling: available php ram ÷ memory used by a larger busy worker. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure worker memory across several types of request. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Sizing from idle workers. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Memory ceiling: Available PHP RAM ÷ memory used by a larger busy worker; Processor reality: How many requests the processor can complete together; Queue signal: Waiting requests and response time during peak traffic. ### MySQL utf8mb4 and collation: a practical guide URL: https://applaunch.org/guides/mysql-utf8mb4-collation-guide Question: Why use utf8mb4 instead of utf8? Answer: In modern MySQL, utf8 is a deprecated alias for the three-byte utf8mb3 character set; utf8mb4 stores full Unicode. Collation determines sorting and equality rules, so choose it deliberately and test unique indexes before conversion. Plain-English explanation: A character set decides which text MySQL can store. utf8mb4 supports full Unicode, including emoji and many characters that MySQL’s older utf8 name cannot safely hold. A collation decides how stored text compares and sorts. Changing collation can change whether two values count as equal. Test unique usernames, codes and indexes on a copy before converting a live table, because previously different values may collide under new comparison rules. Example: A table using old utf8 cannot store a four-byte emoji in a profile name. Moving to utf8mb4 fixes the storage range, but the team first tests its case-insensitive unique username index to ensure no two existing names become equal. Steps: Inspect server, database, table and column settings. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on character set: which code points can be stored. Write the result down so you can compare it later. Choose a collation matching language and case needs. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test duplicate and index impact on a copy. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Set client connection character set explicitly. Finish by checking the result against migration risk: previously distinct values may compare equal. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? In modern MySQL, utf8 is a deprecated alias for the three-byte utf8mb3 character set; utf8mb4 stores full Unicode. Collation determines sorting and equality rules, so choose it deliberately and test unique indexes before conversion. What should I check first? Start with character set: which code points can be stored. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inspect server, database, table and column settings. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Assuming utf8 means full UTF-8 in MySQL. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Character set: Which code points can be stored; Collation: How strings compare and sort; Migration risk: Previously distinct values may compare equal. ### How to tell if a MySQL query needs an index URL: https://applaunch.org/guides/mysql-index-missing-slow-query Question: What evidence supports a new index? Answer: Use EXPLAIN and runtime evidence to see how MySQL accesses tables, how many rows it expects to examine and whether sorting or temporary work dominates. Build indexes for actual filter, join and ordering patterns, then verify write cost and plan changes. Plain-English explanation: An index helps MySQL find matching rows without reading an entire table, much like a book index. The right index follows the way a real query filters, joins and sorts. Adding an index to every column wastes storage and makes inserts and updates do more work. Use EXPLAIN to see the plan MySQL expects to use, then compare rows examined with rows returned. Test with production-like data because a plan that looks fine with 100 rows may be terrible with ten million. Example: A query finds recent paid orders for one customer and sorts by date. A combined index beginning with customer and payment status, then date, can match that pattern better than three unrelated single-column indexes. EXPLAIN and timing confirm the result. Steps: Capture the exact parameterized query shape. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on access plan: explain key, type, rows and extra. Write the result down so you can compare it later. Run EXPLAIN in a safe representative environment. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Design the narrowest useful composite index. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare latency and write impact after creation. Finish by checking the result against tradeoff: faster reads against storage and write overhead. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use EXPLAIN and runtime evidence to see how MySQL accesses tables, how many rows it expects to examine and whether sorting or temporary work dominates. Build indexes for actual filter, join and ordering patterns, then verify write cost and plan changes. What should I check first? Start with access plan: explain key, type, rows and extra. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Capture the exact parameterized query shape. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Adding one index per column. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Access plan: EXPLAIN key, type, rows and Extra; Work: Rows examined versus rows returned; Tradeoff: Faster reads against storage and write overhead. ### MySQL backups: mysqldump is only half the job URL: https://applaunch.org/guides/mysql-backup-mysqldump-restore-test Question: When is a MySQL backup complete? Answer: A dump is useful only when it includes the objects your application needs, is stored away from the live database and restores successfully. Define recovery point and time targets, then automate both capture and recurring isolated restore tests. Plain-English explanation: mysqldump can create a readable copy of database structure and data, but the options must include everything the application needs. Some systems also rely on triggers, stored routines or scheduled database events. Store dumps away from the live database, protect sensitive data and keep several dates. Then restore into a clean MySQL server and run application checks. A file existing in backup storage is not proof that recovery works. Example: A dump restores tables and rows but omits a trigger that maintains account totals. The website opens, yet new transactions calculate incorrectly. The restore checklist includes placing an order, so it catches the missing object before an emergency. Steps: Inventory every required database object. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on scope: schemas, data, triggers, routines and events as required. Write the result down so you can compare it later. Use a consistent engine-supported dump method. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Encrypt and retain multiple off-host copies. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Restore into an isolated server on a schedule. Finish by checking the result against recovery: measured restore plus application acceptance test. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A dump is useful only when it includes the objects your application needs, is stored away from the live database and restores successfully. Define recovery point and time targets, then automate both capture and recurring isolated restore tests. What should I check first? Start with scope: schemas, data, triggers, routines and events as required. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory every required database object. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Dumping only one schema when cross-schema objects exist. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Scope: Schemas, data, triggers, routines and events as required; Consistency: Engine-aware snapshot or transaction options; Recovery: Measured restore plus application acceptance test. ### Fix MySQL “Too many connections” at the cause URL: https://applaunch.org/guides/mysql-connection-too-many-connections Question: Why are connections accumulating? Answer: The error can mean leaked connections, an oversized application pool, slow queries holding sessions, traffic spikes or an unavailable database copy. Raising max_connections uses more server memory and may postpone failure while making overload worse. Plain-English explanation: MySQL allows only a limited number of connections because every connection uses resources. The error can come from leaked connections, slow work holding them open, oversized connection pools or a sudden traffic spike. Raising the limit may use more memory and let an overloaded database accept even more work. First count the maximum connections requested by every application copy, inspect active and sleeping sessions and find transactions or queries that stay open too long. Example: Ten app instances each allow a pool of 50 connections, so they can ask for 500 even though MySQL allows 200. Normal use needs far less. Reducing each pool, closing leaked sessions and making excess requests wait safely fixes the cause without giving MySQL an unsafe limit. Steps: Compare every pool maximum with the database limit. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on demand: application copies × maximum pool size. Write the result down so you can compare it later. Inspect active versus sleeping sessions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Trace slow queries and unfinished transactions. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Limit pools and make excess requests wait safely before raising limits. Finish by checking the result against database capacity: memory and work for every connection running together. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The error can mean leaked connections, an oversized application pool, slow queries holding sessions, traffic spikes or an unavailable database copy. Raising max_connections uses more server memory and may postpone failure while making overload worse. What should I check first? Start with demand: application copies × maximum pool size. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Compare every pool maximum with the database limit. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Doubling max_connections first. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Demand: Application copies × maximum pool size; Duration: How long active and idle sessions remain; Database capacity: Memory and work for every connection running together. ### Secure PHP MySQL connections with PDO URL: https://applaunch.org/guides/php-mysql-connection-pdo Question: What belongs in a safe PDO baseline? Answer: Load credentials from a private server-side setting, choose the intended text encoding, enable exception error mode, use prepared statements for values and give the application account only the access it needs. Never build SQL by joining user input directly into the query. Plain-English explanation: PDO is a standard PHP way to connect to databases. Keep the password on the server, set the intended utf8mb4 character set and use a dedicated database account with only the permissions the application needs. Prepared statements keep user values separate from SQL instructions, which is essential for preventing SQL injection. Do not show raw database errors to visitors; log useful details privately and return a safe message. Example: A login query uses a prepared placeholder for the email address instead of joining the typed email into the SQL string. The application account can read the required user table but cannot create new database administrators or access unrelated databases. Steps: Create a dedicated application database user. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on query safety: prepared parameters for untrusted values. Write the result down so you can compare it later. Configure the connection string to use utf8mb4. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use prepared statements consistently. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test connection failure and changing credentials. Finish by checking the result against failure: errors logged without exposing credentials to users. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Load credentials from a private server-side setting, choose the intended text encoding, enable exception error mode, use prepared statements for values and give the application account only the access it needs. Never build SQL by joining user input directly into the query. What should I check first? Start with query safety: prepared parameters for untrusted values. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Create a dedicated application database user. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Committing credentials. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Query safety: Prepared parameters for untrusted values; Identity: A separate application account with only required access; Failure: Errors logged without exposing credentials to users. ### How to run reliable PHP cron jobs URL: https://applaunch.org/guides/php-cron-job-hosting Question: What makes a cron job safe to repeat? Answer: A production cron job should use the intended CLI PHP version, prevent harmful overlap, record success and failure, and be idempotent so a retry does not duplicate side effects. Long jobs need timeouts, checkpoints and a clear owner. Plain-English explanation: A cron job runs PHP work on a schedule, such as sending reminders or cleaning old data. Use the exact PHP binary and working folder the job expects, because scheduled jobs often have a smaller environment than an interactive terminal. Make repeated runs safe. A job should not send the same invoice twice if it is retried, and two copies should not change the same data at once. Record when it starts, finishes and fails, then alert when an expected run never happens. Example: A job runs every five minutes but sometimes takes eight. Without a lock, the next copy starts while the first is still working and sends duplicate messages. A lock and per-message idempotency make overlap harmless, while monitoring shows the job needs optimisation. Steps: Use an absolute command and working directory. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on runtime: exact cli php binary and environment. Write the result down so you can compare it later. Add idempotency or a distributed lock. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Capture output and exit code. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Alert when expected runs are missing. Finish by checking the result against evidence: start, completion, duration and failure logs. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A production cron job should use the intended CLI PHP version, prevent harmful overlap, record success and failure, and be idempotent so a retry does not duplicate side effects. Long jobs need timeouts, checkpoints and a clear owner. What should I check first? Start with runtime: exact cli php binary and environment. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Use an absolute command and working directory. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Assuming cron uses the web PHP version. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Runtime: Exact CLI PHP binary and environment; Concurrency: Lock or queue prevents unsafe overlap; Evidence: Start, completion, duration and failure logs. ### PHP sessions across multiple web servers URL: https://applaunch.org/guides/php-session-storage-multiple-servers Question: Where should session state live? Answer: Local filesystem sessions work on one server but fail when requests move between replicas. Sticky routing can reduce movement but weakens failover; a shared store provides consistent access but adds latency, locking and another dependency. Plain-English explanation: PHP sessions often store login and short-lived user state. Files on one web server work until traffic is spread across several servers. A later request may reach a different server that cannot see the original session file. Sticky routing tries to keep one user on one server, while shared session storage makes state available to all servers. Shared storage improves movement and failover but becomes another service to secure, monitor and keep fast. Example: A user logs in through web-1, then the load balancer sends their next request to web-2. With local files, they appear logged out. Moving sessions to a shared store fixes that, and a test removes web-1 during an active session to prove failover. Steps: Measure session size and access pattern. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on local: simple, tied to one instance. Write the result down so you can compare it later. Choose failure and consistency behaviour. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set secure cookies and expiry deliberately. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test replica loss during an active session. Finish by checking the result against shared: portable state with external-store operations. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Local filesystem sessions work on one server but fail when requests move between replicas. Sticky routing can reduce movement but weakens failover; a shared store provides consistent access but adds latency, locking and another dependency. What should I check first? Start with local: simple, tied to one instance. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure session size and access pattern. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Scaling replicas without moving session state. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Local: Simple, tied to one instance; Sticky: Routing dependency and uneven load risk; Shared: Portable state with external-store operations. ### How to estimate MySQL database hosting size URL: https://applaunch.org/guides/mysql-database-size-hosting Question: What consumes database disk besides table data? Answer: Plan for data plus indexes, binary and error logs, temporary files, online schema-change headroom and retained backups. Measure growth over a meaningful interval and keep operating headroom so maintenance does not begin when the disk is already full. Plain-English explanation: Database storage includes table data and indexes, but production also needs room for logs, temporary query work, backups and some table changes. A database that is 20 GB today may need much more than a 20 GB disk to operate safely. Measure growth by table over several weeks and pay attention to the fastest-growing data. Keep alerts based on time until full, because a disk growing 5 GB each day needs action even when its current percentage looks comfortable. Example: A database has 30 GB of data, 18 GB of indexes and keeps 15 GB of recovery logs. A planned table change may need another large copy. A 64 GB disk is already too tight despite the “data” being only 30 GB. Steps: Record schema sizes weekly. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on core: table data plus indexes. Write the result down so you can compare it later. Project high-growth tables separately. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set log retention from recovery goals. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Alert on time-to-full, not only percent used. Finish by checking the result against recovery: backups and point-in-time log retention. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Plan for data plus indexes, binary and error logs, temporary files, online schema-change headroom and retained backups. Measure growth over a meaningful interval and keep operating headroom so maintenance does not begin when the disk is already full. What should I check first? Start with core: table data plus indexes. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Record schema sizes weekly. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Counting rows instead of bytes. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Core: Table data plus indexes; Operations: Logs, temp space and schema-change copies; Recovery: Backups and point-in-time log retention. ### PHP hosting vs a VPS: which should you choose? URL: https://applaunch.org/guides/php-shared-hosting-vs-vps Question: Do you need host control or an application platform? Answer: Choose managed PHP hosting when the application fits supported runtimes and you want the provider to handle the host layer. Choose a VPS when you need unusual system packages, daemons or network control and have someone responsible for patching and recovery. Plain-English explanation: Managed PHP hosting gives you a prepared web stack and removes much of the server maintenance. A VPS gives root control but makes you responsible for operating-system updates, firewall rules, PHP-FPM, MySQL, backups and monitoring. Choose a VPS when the application truly needs unusual system packages, private services or network control and somebody can operate it. Standard PHP sites often benefit more from a supported managed platform than from unused root access. Example: A brochure site needs PHP, one MySQL database, HTTPS and scheduled jobs. The owner has no server administrator, so managed PHP hosting covers the real need. A media processor needing special system libraries and long-running daemons may justify a VPS. Steps: List required PHP extensions and background services. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on managed php: less host work, defined runtime constraints. Write the result down so you can compare it later. Identify who patches the OS and database. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Compare backup and restore responsibilities. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Prototype the hardest requirement. Finish by checking the result against true cost: plan plus backups, monitoring and operator time. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Choose managed PHP hosting when the application fits supported runtimes and you want the provider to handle the host layer. Choose a VPS when you need unusual system packages, daemons or network control and have someone responsible for patching and recovery. What should I check first? Start with managed php: less host work, defined runtime constraints. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List required PHP extensions and background services. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Buying root access without an operator. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Managed PHP: Less host work, defined runtime constraints; VPS: Broader control, full OS responsibility; True cost: Plan plus backups, monitoring and operator time. ### How to debug a PHP 500 error safely URL: https://applaunch.org/guides/php-500-error-production-debugging Question: Where is the useful error evidence? Answer: Keep public error display off in production and correlate the failing request with web-server, PHP-FPM and application logs. Reproduce the exact route, method and input safely, check the first error rather than the cascade, and link it to the latest deployment or configuration change. Plain-English explanation: A 500 response means the server could not complete the request, but the safe public page should not reveal file paths, passwords or a full error trace. Useful details belong in private logs with a time and request identifier. Follow the request through the proxy, web server, PHP-FPM and application logs. Start with the first error, because one failure can create many later messages. Compare the time with recent code, configuration or permission changes. Example: A form returns 500 after a deployment. The request ID leads to a PHP log showing a missing extension, while later messages show unrelated cleanup failures. Installing the required extension in staging and redeploying fixes the first cause without exposing details to visitors. Steps: Capture time and request identifier. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on user response: generic message plus request identifier. Write the result down so you can compare it later. Inspect proxy, web-server, FPM and app logs in order. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Check syntax, permissions, extensions and environment changes. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify the repair through the original path. Finish by checking the result against reproduction: exact route and safe representative input. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Keep public error display off in production and correlate the failing request with web-server, PHP-FPM and application logs. Reproduce the exact route, method and input safely, check the first error rather than the cascade, and link it to the latest deployment or configuration change. What should I check first? Start with user response: generic message plus request identifier. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Capture time and request identifier. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Turning display_errors on publicly. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: User response: Generic message plus request identifier; Private evidence: Timestamped exception, stack and release; Reproduction: Exact route and safe representative input. ### Use the MySQL slow query log without drowning in data URL: https://applaunch.org/guides/mysql-slow-query-log-guide Question: Which queries deserve attention first? Answer: Prioritize query patterns by total user impact: frequency multiplied by latency or rows examined often matters more than the single slowest maintenance query. Enable suitable logging with controlled retention and protect sensitive query data. Plain-English explanation: The slow query log records database statements that cross a chosen time or work threshold. Use it for a limited, protected observation period, because logs can grow quickly and query text may contain sensitive information. Group similar queries and rank them by total impact. A query taking one second thousands of times may matter more than a ten-second report that runs once a month. Use EXPLAIN and application context before changing indexes. Example: The single slowest query is a nightly report, but a 300 ms product query runs 200,000 times each day. Improving the common query saves far more user waiting and database work than optimising the rare report first. Steps: Choose a threshold and observation window. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on frequency: how often the pattern runs. Write the result down so you can compare it later. Aggregate normalized query patterns. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use EXPLAIN on representative data. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify application latency after each change. Finish by checking the result against impact: affected user route or background job. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Prioritize query patterns by total user impact: frequency multiplied by latency or rows examined often matters more than the single slowest maintenance query. Enable suitable logging with controlled retention and protect sensitive query data. What should I check first? Start with frequency: how often the pattern runs. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Choose a threshold and observation window. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Leaving verbose logging unlimited. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Frequency: How often the pattern runs; Cost: Latency, rows examined and lock time; Impact: Affected user route or background job. ### Safer MySQL schema migrations for live PHP apps URL: https://applaunch.org/guides/mysql-schema-migration-zero-downtime Question: Can old and new PHP code coexist with the schema? Answer: Prefer expand-and-contract: add the new structure, deploy code that can work with both versions, backfill in controlled batches, switch reads, then remove the old shape after the rollback window. Check MySQL’s actual algorithm and lock behaviour for the specific alteration. Plain-English explanation: Live database changes are safest when old and new application versions can both work during the release. Add new columns or tables first, deploy compatible code, copy data in small batches, then remove old structures only after rollback is no longer needed. The exact MySQL operation matters. Some changes can happen mostly online; others copy or lock a large table. Test on a restored database of similar size so the maintenance time and disk use are known. Example: A status field is being replaced. The team adds the new field, releases code that writes both, copies old values in batches and switches reads. A later release removes the old field. Rolling back during the first release remains possible. Steps: Measure table size and current load. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on compatibility: both application releases tolerate transition. Write the result down so you can compare it later. Test ALTER behaviour on a restored copy. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Deploy additive schema before dependent code. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Delay destructive cleanup. Finish by checking the result against backfill: batched, resumable and observable. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Prefer expand-and-contract: add the new structure, deploy code that can work with both versions, backfill in controlled batches, switch reads, then remove the old shape after the rollback window. Check MySQL’s actual algorithm and lock behaviour for the specific alteration. What should I check first? Start with compatibility: both application releases tolerate transition. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure table size and current load. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Dropping a column in the first release. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Compatibility: Both application releases tolerate transition; Lock risk: Operation tested on production-like size; Backfill: Batched, resumable and observable. ### Composer install for a production PHP deployment URL: https://applaunch.org/guides/php-composer-production-deploy Question: What should production install from? Answer: Commit composer.lock for applications and install those exact dependency versions during a build or release step. Exclude development packages, prepare autoloading for production where appropriate, and never run an unrestricted composer update on the live server. Plain-English explanation: composer.lock records the exact package versions chosen for a PHP application. composer install follows that file; composer update chooses new versions. Production deployment should reproduce a reviewed lockfile rather than make new dependency decisions on the live server. Build dependencies in a clean environment, exclude development-only tools where appropriate, run tests and deploy the resulting release together. Check required PHP extensions as well as package versions. Example: The developer reviews and commits a dependency update in composer.lock. CI runs composer install, tests the app and packages the release. Production receives that tested package instead of running composer update and discovering a new incompatible library during deployment. Steps: Validate Composer files in automated checks. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on input: reviewed composer.json and committed lockfile. Write the result down so you can compare it later. Install with production flags in a clean environment. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run tests and a vulnerability review. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Deploy the tested release without changing its files. Finish by checking the result against result: tested vendor folder tied to the release. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Commit composer.lock for applications and install those exact dependency versions during a build or release step. Exclude development packages, prepare autoloading for production where appropriate, and never run an unrestricted composer update on the live server. What should I check first? Start with input: reviewed composer.json and committed lockfile. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Validate Composer files in automated checks. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Running composer update during deploy. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Input: Reviewed composer.json and committed lockfile; Command intent: install repeats known versions; update chooses new versions; Result: Tested vendor folder tied to the release. ### When a PHP deployment needs a database backup URL: https://applaunch.org/guides/php-mysql-backup-before-deploy Question: Will this release make stored state harder to reverse? Answer: Take or confirm a recent recoverable backup before destructive or hard-to-reverse data changes. A code-only release may not need a fresh full dump if continuous recovery already meets the objective, but every migration needs an explicit rollback or restore decision. Plain-English explanation: Not every code upload needs a fresh full database dump, but any release that can change or remove stored data needs an explicit recovery decision. Confirm the newest backup meets the allowed data-loss window and has been proven by restore. A code rollback does not automatically reverse a database migration or data conversion. Write down the point after which rollback means restoring data, and understand how much new user activity that restore would remove. Example: A release only changes page colours, while continuous backups already meet the recovery target; no special dump is needed. The next release converts customer addresses and drops old fields, so the team confirms a fresh recoverable copy and delays deletion until validation. Steps: Classify release data risk. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on change type: code-only, additive schema, backfill or destructive. Write the result down so you can compare it later. Confirm last successful backup and restore evidence. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Record migration rollback boundaries. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Monitor data correctness after release. Finish by checking the result against restore time: can service recover within the outage budget?. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Take or confirm a recent recoverable backup before destructive or hard-to-reverse data changes. A code-only release may not need a fresh full dump if continuous recovery already meets the objective, but every migration needs an explicit rollback or restore decision. What should I check first? Start with change type: code-only, additive schema, backfill or destructive. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Classify release data risk. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Taking a dump but not waiting for success. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Change type: Code-only, additive schema, backfill or destructive; Recovery point: How much data can be lost; Restore time: Can service recover within the outage budget?. ### PHP and MySQL application launch checklist URL: https://applaunch.org/guides/php-mysql-launch-checklist Question: What proves the app is launch-ready? Answer: A launch-ready PHP app runs on a supported version, uses least-privilege database access, handles errors privately, survives representative traffic, completes scheduled work, restores from backup and has a release rollback plan. A successful homepage response is not enough. Plain-English explanation: A PHP application is ready when its important user journeys work on the real runtime, errors stay private, database permissions are limited and scheduled work completes. It also needs monitoring, backups that restore and a known previous release. Test more than the homepage. Submit forms, upload files, create and change records, run cron jobs and try invalid or unauthorised requests. Launch gradually while somebody watches errors and user outcomes. Example: A team tests account signup, password reset, checkout, an image upload and the nightly billing task against production-like settings. The restore drill finds a missing database routine, which is fixed before users depend on it. Steps: Run critical journeys against production-like configuration. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on application: critical user journeys and validation. Write the result down so you can compare it later. Load-test expensive endpoints. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Complete backup restore and credential rotation checks. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Launch gradually with logs and an owner watching. Finish by checking the result against recovery: database restore and previous release rollback. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A launch-ready PHP app runs on a supported version, uses least-privilege database access, handles errors privately, survives representative traffic, completes scheduled work, restores from backup and has a release rollback plan. A successful homepage response is not enough. What should I check first? Start with application: critical user journeys and validation. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Run critical journeys against production-like configuration. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Testing only GET requests. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Application: Critical user journeys and validation; Platform: Supported PHP, HTTPS, worker and upload settings; Recovery: Database restore and previous release rollback. ### What does good WordPress hosting need? URL: https://applaunch.org/guides/wordpress-hosting-requirements Question: Which hosting features are requirements rather than extras? Answer: Start with WordPress’s current server requirements, HTTPS and enough resources for the real site. Then compare backup recovery, update ownership, staging, file/database access and support; “WordPress hosting” alone does not define which layer the provider manages. Plain-English explanation: WordPress needs a supported PHP version, a suitable MySQL or MariaDB database and HTTPS. Those are the basic technical requirements. Good hosting also needs enough resources for the real site and a clear answer about who handles backups, updates and recovery. A small blog and a busy online shop can both use WordPress but need very different capacity. Count important plugins, media, editors, visitors and uncached actions such as login or checkout before choosing a plan. Example: A five-page local-business site with a contact form may run comfortably on a modest plan. A WooCommerce shop with product filters, imports and hundreds of shoppers has much more PHP and database work even if both sites use the same WordPress version. Steps: List required plugins and PHP extensions. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on runtime: supported php, database and https. Write the result down so you can compare it later. Check current WordPress requirements. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Ask who performs and tests restores. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Trial the heaviest admin and visitor paths. Finish by checking the result against workload: plugins, traffic, media and admin activity. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Start with WordPress’s current server requirements, HTTPS and enough resources for the real site. Then compare backup recovery, update ownership, staging, file/database access and support; “WordPress hosting” alone does not define which layer the provider manages. What should I check first? Start with runtime: supported php, database and https. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List required plugins and PHP extensions. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Choosing by storage alone. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Runtime: Supported PHP, database and HTTPS; Operations: Backups, updates, monitoring and restore access; Workload: Plugins, traffic, media and admin activity. ### WordPress memory limit vs PHP memory_limit URL: https://applaunch.org/guides/wordpress-memory-limit-vs-php-memory Question: Which memory limit actually applies? Answer: WordPress constants request an application ceiling, but PHP memory_limit remains the hard limit for each request. The lower setting wins, and the host must still support several PHP requests at once. Find the plugin, import or query using the memory before increasing both. Plain-English explanation: WordPress can ask PHP for a certain memory allowance through settings such as WP_MEMORY_LIMIT. PHP still has its own memory_limit, which is the hard ceiling for one process. WordPress cannot use more than PHP allows. The host also runs several PHP workers at once. Raising every request to a very large limit can let a traffic spike use all server memory. Find the plugin, import or image task that uses the memory before changing limits. Example: WordPress asks for 256 MB, but PHP allows only 128 MB, so the effective limit stays 128 MB. A large image import fails. The owner profiles the import, raises the correct web setting carefully and keeps normal worker concurrency within host capacity. Steps: Capture the exact failing operation. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on wordpress: wp_memory_limit / wp_max_memory_limit request. Write the result down so you can compare it later. Inspect the PHP limit used by the website, not only the command line. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Measure plugin and theme memory where possible. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Raise the limit only after checking how many requests can run together. Finish by checking the result against host: several php workers plus the database and operating system. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? WordPress constants request an application ceiling, but PHP memory_limit remains the hard limit for each request. The lower setting wins, and the host must still support several PHP requests at once. Find the plugin, import or query using the memory before increasing both. What should I check first? Start with wordpress: wp_memory_limit / wp_max_memory_limit request. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Capture the exact failing operation. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Setting unlimited PHP memory. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: WordPress: WP_MEMORY_LIMIT / WP_MAX_MEMORY_LIMIT request; PHP: Hard memory limit for each request; Host: Several PHP workers plus the database and operating system. ### Audit WordPress plugins before moving hosts URL: https://applaunch.org/guides/wordpress-plugin-audit-before-hosting-move Question: Which plugins create migration risk? Answer: Plugins that own data, scheduled tasks, caches, mail, security rules or external integrations deserve explicit testing. Remove abandoned and duplicate plugins before migration, but do not delete data-owning plugins until you understand their uninstall behaviour. Plain-English explanation: Plugins can own database tables, uploaded files, scheduled jobs, email settings and connections to outside services. Make a list before moving so each important feature has an owner and a test on the new host. Remove abandoned or duplicate plugins carefully, but do not click delete until you understand its uninstall behaviour. Some plugins remove their own data when deleted. Test PHP compatibility and updates on a staging copy. Example: A booking plugin stores appointments in custom tables and sends reminders through WP-Cron. Copying only pages and uploads would miss the schedule. The migration plan identifies its tables, cron events, mail credentials and a real test booking. Steps: Export a complete plugin inventory. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on compatibility: php and wordpress version support. Write the result down so you can compare it later. Mark owner, purpose and last maintained version. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test on a staging copy at the target runtime. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify every critical integration after cutover. Finish by checking the result against criticality: checkout, forms, login, seo and backups. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Plugins that own data, scheduled tasks, caches, mail, security rules or external integrations deserve explicit testing. Remove abandoned and duplicate plugins before migration, but do not delete data-owning plugins until you understand their uninstall behaviour. What should I check first? Start with compatibility: php and wordpress version support. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Export a complete plugin inventory. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Updating all plugins during DNS cutover. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Compatibility: PHP and WordPress version support; State: Custom tables, uploads, cron and external credentials; Criticality: Checkout, forms, login, SEO and backups. ### A WordPress backup needs files and database URL: https://applaunch.org/guides/wordpress-backup-files-and-database Question: What must be restored together? Answer: The database contains posts, settings and much plugin state; wp-content holds uploads, themes and plugins. A useful recovery captures both at compatible points, protects credentials, lives off the server and is restored regularly in isolation. Plain-English explanation: WordPress stores posts, users and settings in the database. Uploaded images, themes and plugins live in files, mainly under wp-content. A complete recovery needs both parts from compatible points in time. Keep copies away from the live hosting account and retain several dates. Protect them because they may contain customer details and passwords. Restore regularly to a private test address and check the site as a user. Example: A backup contains the database but not uploads. The restored site has every post title, yet all photographs are missing. Another backup has files but an old database, so recent orders vanish. A matched files-and-database restore avoids both failures. Steps: Define acceptable data loss and restore time. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on database: content, users, options and plugin tables. Write the result down so you can compare it later. Capture database consistently and files completely. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Encrypt and retain off-host generations. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test login, media, links and forms after restore. Finish by checking the result against recovery: matched copy tested on a separate url. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? The database contains posts, settings and much plugin state; wp-content holds uploads, themes and plugins. A useful recovery captures both at compatible points, protects credentials, lives off the server and is restored regularly in isolation. What should I check first? Start with database: content, users, options and plugin tables. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Define acceptable data loss and restore time. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Backing up uploads only. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Database: Content, users, options and plugin tables; Files: wp-content plus required configuration/custom files; Recovery: Matched copy tested on a separate URL. ### WordPress staging site checklist URL: https://applaunch.org/guides/wordpress-staging-site-checklist Question: How do you stop staging affecting production? Answer: Use separate files, database and credentials; block indexing and public access; disable or sandbox mail, payments and webhooks; and refresh data with privacy controls. Staging should reproduce the production runtime while being incapable of real customer side effects. Plain-English explanation: Staging is a private copy used to test updates. It should resemble production enough to reveal real problems but must not send live email, take real payments, call customer webhooks or change production data. Use separate files, database and credentials. Protect access and add noindex, but remember that robots.txt alone is not privacy. Remove or mask customer data when broad staging access is unnecessary. Example: A shop clone uses the payment provider’s sandbox, redirects all email to a test mailbox and has its own database. Updating a plugin can be tested through checkout without charging a customer or changing a live order. Steps: Clone through a documented sanitized process. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on isolation: separate database, storage and secrets. Write the result down so you can compare it later. Replace production URLs safely. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Set non-production integration credentials. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify staging cannot write to production services. Finish by checking the result against search: authentication plus noindex; do not rely on robots.txt alone. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use separate files, database and credentials; block indexing and public access; disable or sandbox mail, payments and webhooks; and refresh data with privacy controls. Staging should reproduce the production runtime while being incapable of real customer side effects. What should I check first? Start with isolation: separate database, storage and secrets. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Clone through a documented sanitized process. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using production payment keys. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Isolation: Separate database, storage and secrets; External effects: Sandbox or disable mail, payments and callbacks; Search: Authentication plus noindex; do not rely on robots.txt alone. ### How to diagnose a slow WordPress site URL: https://applaunch.org/guides/wordpress-slow-site-diagnosis Question: Where is the time being spent? Answer: Measure server response and browser loading separately. A slow initial response points toward PHP, database, plugins or external calls; a fast HTML response with slow visual completion points toward images, scripts, fonts or rendering. Profile before changing caches. Plain-English explanation: Measure where the waiting happens. A slow first response often points to PHP, database queries, plugins or calls to another service. Fast HTML followed by a slow-looking page points more toward large images, JavaScript, CSS or fonts. Compare the same page while logged in and out and with a controlled cache hit and miss. Use staging to disable suspected plugins one at a time. Installing another optimisation plugin before measuring can add conflict without solving the cause. Example: The homepage HTML arrives quickly, but a 7 MB hero image delays the visible page. More PHP workers will not fix that. On another site, HTML itself takes four seconds because a plugin waits for an outside API; image compression is not the answer there. Steps: Test one representative uncached and cached page. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on backend: time to first byte and php/database traces. Write the result down so you can compare it later. Inspect slow queries and external HTTP calls. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Disable suspects only on staging. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Retest the same URL and conditions. Finish by checking the result against cache: compare controlled hit and miss behaviour. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Measure server response and browser loading separately. A slow initial response points toward PHP, database, plugins or external calls; a fast HTML response with slow visual completion points toward images, scripts, fonts or rendering. Profile before changing caches. What should I check first? Start with backend: time to first byte and php/database traces. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Test one representative uncached and cached page. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Installing overlapping cache plugins. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Backend: Time to first byte and PHP/database traces; Frontend: Image, script, CSS and font waterfall; Cache: Compare controlled hit and miss behaviour. ### WordPress cache plugin vs server cache URL: https://applaunch.org/guides/wordpress-cache-plugin-vs-server-cache Question: Which cache is solving which work? Answer: Page cache avoids most WordPress execution for cacheable responses, object cache reuses database-derived objects, OPcache avoids PHP recompilation and browser/CDN caches reuse assets. Configure invalidation and exclusions for login, carts and personalized pages before stacking tools. Plain-English explanation: Different caches save different work. Page cache can reuse a complete public page, object cache can reuse WordPress data, OPcache keeps prepared PHP code and browser or CDN cache reuses images and other files. Choose one clear owner for each layer and test when content changes. Logged-in pages, carts, accounts and checkout often contain private or changing data and must not be served from a public shared page cache. Example: A public blog post is safely cached as one complete page. A customer cart is excluded because its content belongs to one person. OPcache still helps the PHP code used for uncached requests, while the browser keeps the site logo. Steps: Map dynamic and personalized routes. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on page cache: reusable whole responses. Write the result down so you can compare it later. Enable one page-cache owner. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test purge after content changes. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify cookies, checkout and logged-in behaviour. Finish by checking the result against opcache: compiled php bytecode. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Page cache avoids most WordPress execution for cacheable responses, object cache reuses database-derived objects, OPcache avoids PHP recompilation and browser/CDN caches reuse assets. Configure invalidation and exclusions for login, carts and personalized pages before stacking tools. What should I check first? Start with page cache: reusable whole responses. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Map dynamic and personalized routes. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Caching private pages publicly. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Page cache: Reusable whole responses; Object cache: Reusable application objects/query results; OPcache: Compiled PHP bytecode. ### WordPress security hardening that matters URL: https://applaunch.org/guides/wordpress-security-hardening-basics Question: Which controls reduce likely compromise? Answer: Keep core, plugins, themes and the runtime supported; remove unused code; use strong unique accounts and least privilege; protect administrative transport with HTTPS; install only trusted packages; and maintain recoverable backups. Hiding version strings is not a substitute. Plain-English explanation: The most useful WordPress security work is ordinary and continuous: update supported software, remove unused plugins and themes, use strong unique accounts, limit administrator access and install code only from trusted sources. Security is shared. The host protects the platform layer, while the site owner controls accounts, plugins, themes and content. Keep independent tested backups so a damaged site can be rebuilt instead of trusting that no attack will ever succeed. Example: A former contractor still has an administrator account and an abandoned file-manager plugin remains installed. Removing both closes more real risk than hiding the WordPress version number in the page source. Steps: Inventory and remove unused software. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on reduce entry points: fewer maintained plugins, themes and accounts. Write the result down so you can compare it later. Update through staging with rollback. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Review administrator accounts and MFA options. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run a clean restore drill. Finish by checking the result against recover: independent known-good backups and incident plan. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Keep core, plugins, themes and the runtime supported; remove unused code; use strong unique accounts and least privilege; protect administrative transport with HTTPS; install only trusted packages; and maintain recoverable backups. Hiding version strings is not a substitute. What should I check first? Start with reduce entry points: fewer maintained plugins, themes and accounts. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory and remove unused software. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Downloading nulled premium plugins. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Reduce entry points: Fewer maintained plugins, themes and accounts; Contain: Least database, file and user privileges; Recover: Independent known-good backups and incident plan. ### Move WordPress hosting with minimal DNS downtime URL: https://applaunch.org/guides/wordpress-migration-dns-downtime Question: How do you avoid losing late orders or form entries? Answer: Build and test the target first, lower DNS TTL in advance, then control the final write window: freeze changes or synchronize the database immediately before cutover. Keep the old host available until traffic and data consistency are verified. Plain-English explanation: Build the new copy before changing DNS. Test it through a temporary address or local hosts-file entry, then plan a final period when content, forms or orders stop changing on the old copy while the newest database is moved. Lower the DNS time-to-live in advance and keep the old host working while caches change. DNS updates are not instant for every visitor. Retain the previous records and hosting until the new site is proven. Example: A shop copies files and database two days early for testing. At cutover it pauses orders, makes one final database copy, changes the web record and tests checkout. The old host remains available for rollback while DNS answers settle. Steps: Inventory domains, mail, cron and integrations. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on preparation: target tested by hosts-file or temporary url. Write the result down so you can compare it later. Copy files and database to staging. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run a final synchronized cutover. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Check logs, forms, login and TLS from multiple networks. Finish by checking the result against rollback: old service and previous dns values retained. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Build and test the target first, lower DNS TTL in advance, then control the final write window: freeze changes or synchronize the database immediately before cutover. Keep the old host available until traffic and data consistency are verified. What should I check first? Start with preparation: target tested by hosts-file or temporary url. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory domains, mail, cron and integrations. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Changing DNS before testing. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Preparation: Target tested by hosts-file or temporary URL; Write control: Short freeze or explicit final database sync; Rollback: Old service and previous DNS values retained. ### WordPress Multisite vs separate installations URL: https://applaunch.org/guides/wordpress-multisite-vs-separate-sites Question: Do the sites share an operational owner? Answer: Multisite centralizes core, themes, plugins and user administration, but every site also shares some update and failure risks. Separate installations provide stronger isolation and independent release schedules. Choose by who controls the sites and how many sites one problem could affect, not only by site count. Plain-English explanation: Multisite runs several WordPress sites from one shared installation. It can simplify central updates and user management when one organisation controls every site. It also means one broken update or compromise can affect the whole network. Separate installations take more repeated administration but give each site its own release schedule and stronger isolation. Decide from ownership, plugin needs and how many sites one problem could affect—not only from the number of websites. Example: One university team manages 20 department sites using the same approved themes and plugins, so Multisite fits its shared rules. Twenty unrelated clients needing different plugins, update dates and data access are safer as separate installations. Steps: Map owners, data boundaries and plugin requirements. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on multisite: shared codebase, network administration and database. Write the result down so you can compare it later. Check domain and wildcard DNS needs. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test backups and removing one site from the network. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Choose an update policy for the whole network. Finish by checking the result against key question: should one administrator govern every site?. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Multisite centralizes core, themes, plugins and user administration, but every site also shares some update and failure risks. Separate installations provide stronger isolation and independent release schedules. Choose by who controls the sites and how many sites one problem could affect, not only by site count. What should I check first? Start with multisite: shared codebase, network administration and database. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Map owners, data boundaries and plugin requirements. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using Multisite only to save disk. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Multisite: Shared codebase, network administration and database; Separate: Independent updates, failures and hosting resources; Key question: Should one administrator govern every site?. ### How to size hosting for WooCommerce URL: https://applaunch.org/guides/wordpress-woocommerce-hosting-capacity Question: Which traffic cannot be served as a simple cached page? Answer: Cart, account and checkout requests are personalized and usually exercise PHP and the database. Measure concurrent shoppers, catalogue/filter complexity, background jobs and import peaks, then protect checkout correctness before optimizing anonymous cache throughput. Plain-English explanation: WooCommerce includes pages that cannot simply be shared from a public cache. Carts, accounts and checkout run PHP and database work for each shopper. Product filters, stock updates, payment calls and background jobs add more load. Size from simultaneous shoppers and the heaviest real actions, not only monthly page views. Test a complete browse-to-checkout journey on staging with realistic products and plugins. Example: A shop gets many cached product-page visits without trouble but slows when 25 shoppers check out during a sale. The important capacity number is the concurrent dynamic checkout work, not the much larger total of simple page views. Steps: Load-test a realistic browse-to-checkout journey in staging. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on dynamic concurrency: simultaneous cart, account and checkout work. Write the result down so you can compare it later. Profile slow queries and external gateways. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Exclude private routes from public cache. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Verify backup and payment idempotency. Finish by checking the result against background: webhooks, mail, stock sync and scheduled actions. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Cart, account and checkout requests are personalized and usually exercise PHP and the database. Measure concurrent shoppers, catalogue/filter complexity, background jobs and import peaks, then protect checkout correctness before optimizing anonymous cache throughput. What should I check first? Start with dynamic concurrency: simultaneous cart, account and checkout work. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Load-test a realistic browse-to-checkout journey in staging. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Sizing from monthly visits. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Dynamic concurrency: Simultaneous cart, account and checkout work; Database: Catalogue filters, orders and plugin queries; Background: Webhooks, mail, stock sync and scheduled actions. ### WP-Cron vs a real scheduled job URL: https://applaunch.org/guides/wordpress-cron-real-cron Question: Can the site rely on visitor traffic to trigger jobs? Answer: WP-Cron checks scheduled work during requests, so low-traffic sites can run late and busy sites can trigger unnecessary checks. A real scheduler calling WordPress cron at a controlled interval is more predictable, provided overlap, logging and failure are managed. Plain-English explanation: WP-Cron checks scheduled work when somebody visits the site. On a quiet site, a job can run late because nobody visits. On a busy site, many requests may keep checking for work. A real scheduler calls the cron runner at known times. Do not disable WP-Cron until the replacement is working. Monitor important jobs such as order actions, email, backups and cleanup, and prevent long jobs from overlapping unsafely. Example: A low-traffic membership site should send a reminder at 8 a.m., but nobody visits until 11 a.m., so WP-Cron starts it three hours late. A server scheduler running every five minutes makes the timing predictable. Steps: Inventory critical scheduled events. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on wp-cron: triggered by web requests. Write the result down so you can compare it later. Measure delays and runtime. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Configure a controlled scheduler if needed. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Alert on missing mail, backups or queue progress. Finish by checking the result against reliability: observed completion of important jobs. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? WP-Cron checks scheduled work during requests, so low-traffic sites can run late and busy sites can trigger unnecessary checks. A real scheduler calling WordPress cron at a controlled interval is more predictable, provided overlap, logging and failure are managed. What should I check first? Start with wp-cron: triggered by web requests. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory critical scheduled events. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Disabling WP-Cron before adding a replacement. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: WP-Cron: Triggered by web requests; System schedule: Time-driven external invocation; Reliability: Observed completion of important jobs. ### Safe WordPress database cleanup URL: https://applaunch.org/guides/wordpress-database-cleanup-safe Question: Which database rows are safe to remove? Answer: Do not delete by table-name guesswork. Back up and restore first, identify the owning plugin or core feature, measure whether the data affects performance, and test cleanup on a clone. Some “orphaned” options are required for reinstall or recovery. Plain-English explanation: A WordPress database collects revisions, temporary values and plugin data, but rows that look old are not automatically safe to delete. Identify which plugin or core feature owns them and measure whether they actually cause a problem. Back up and restore before cleanup, then work on a clone. Prefer the plugin’s supported cleanup method. Serialized settings can be damaged by direct editing, and a removed plugin may still hold information needed for reinstallation or records. Example: A large options table contains one plugin’s huge autoloaded setting, which is read on every request. Fixing that known item improves pages. Deleting thousands of unknown rows because they “look unused” adds risk without evidence. Steps: Measure tables and large autoloaded options. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on ownership: core, active plugin, removed plugin or unknown. Write the result down so you can compare it later. Map prefixes and keys to owners. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Use supported cleanup paths where available. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Compare site behaviour and query metrics after cleanup. Finish by checking the result against rollback: verified database restore. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Do not delete by table-name guesswork. Back up and restore first, identify the owning plugin or core feature, measure whether the data affects performance, and test cleanup on a clone. Some “orphaned” options are required for reinstall or recovery. What should I check first? Start with ownership: core, active plugin, removed plugin or unknown. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure tables and large autoloaded options. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Deleting every transient during live traffic. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Ownership: Core, active plugin, removed plugin or unknown; Impact: Size, autoload behaviour and query frequency; Rollback: Verified database restore. ### Do not break email when moving a WordPress domain URL: https://applaunch.org/guides/wordpress-domain-email-migration Question: Which DNS records should remain unchanged? Answer: Changing the website A/AAAA or CNAME record does not require replacing MX, SPF, DKIM or DMARC records. Copy the whole zone carefully, change only intended web records, and verify both mailbox delivery and WordPress transactional mail after cutover. Plain-English explanation: Website and email DNS records do different jobs. A or CNAME records normally point web visitors to hosting. MX records route incoming email, while SPF, DKIM and DMARC help other mail systems trust messages. When changing website hosting or nameservers, copy the complete DNS zone and change only intended web records. Test mailbox delivery and WordPress messages such as form confirmations separately. Example: A business moves its website and replaces nameservers without copying MX records. The new site opens, but staff stop receiving email. A record-by-record migration would have kept mail routing unchanged while moving only the website. Steps: Export or inventory the current DNS zone. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on website: a/aaaa/cname records for web host. Write the result down so you can compare it later. Identify which provider owns each record. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Change web records narrowly. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test inbound mailbox and application form delivery. Finish by checking the result against mail authentication: spf, dkim and dmarc txt records. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Changing the website A/AAAA or CNAME record does not require replacing MX, SPF, DKIM or DMARC records. Copy the whole zone carefully, change only intended web records, and verify both mailbox delivery and WordPress transactional mail after cutover. What should I check first? Start with website: a/aaaa/cname records for web host. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Export or inventory the current DNS zone. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Replacing nameservers without copying mail records. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Website: A/AAAA/CNAME records for web host; Mail routing: MX records; Mail authentication: SPF, DKIM and DMARC TXT records. ### WordPress website launch checklist URL: https://applaunch.org/guides/wordpress-launch-checklist Question: What should be checked in the final hour? Answer: Confirm the canonical domain and HTTPS, remove unintended noindex controls, test forms and transactional mail, check mobile critical paths, update and back up, verify restoration, and keep a rollback path. Search visibility must be intentional on both staging and production. Plain-English explanation: Before launch, confirm the real domain uses HTTPS, links and forms work, mobile pages are usable and the site has a current recoverable backup. Remove any staging noindex setting only on production and make sure staging stays private. Test as a logged-out visitor, a normal editor and any customer role. Keep the old site or release available briefly and watch errors, uptime and form delivery after launch. Example: A site looks ready, but the launch crawl finds staging links and the “discourage search engines” box is still enabled. The checklist catches both before announcement, then a real contact-form test confirms email reaches the business. Steps: Crawl the production URL before announcement. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on discovery: canonical url, robots, sitemap and noindex state. Write the result down so you can compare it later. Test as a logged-out user on mobile. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Submit or expose the canonical sitemap. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Monitor errors, uptime and forms after launch. Finish by checking the result against recovery: current backup and retained previous release. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Confirm the canonical domain and HTTPS, remove unintended noindex controls, test forms and transactional mail, check mobile critical paths, update and back up, verify restoration, and keep a rollback path. Search visibility must be intentional on both staging and production. What should I check first? Start with discovery: canonical url, robots, sitemap and noindex state. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Crawl the production URL before announcement. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Launching with staging noindex. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Discovery: Canonical URL, robots, sitemap and noindex state; Conversion: Forms, checkout, mail and analytics consent; Recovery: Current backup and retained previous release. ### Development vs staging vs production environments URL: https://applaunch.org/guides/development-staging-production-environments Question: What should each environment prove? Answer: Development optimizes iteration, staging rehearses production behaviour safely, and production serves real users. Separate credentials, data and deployment permissions; staging is valuable only when its runtime and release path resemble production closely enough to catch meaningful failures. Plain-English explanation: Development is where people build and experiment. Staging is a safe rehearsal for the live setup. Production is the real service used by customers. The names matter less than keeping their data, passwords and deployment permissions separate. Staging should run the same built release and similar settings as production, but it must not charge customers, send real messages or change live data. Production changes should pass the rehearsed path and any required approval. Example: A developer tests new checkout code with fake data. The same release moves to staging and uses the payment sandbox. After tests and approval, that exact built release goes to production with production-only secrets. Steps: Document the purpose and owner of each environment. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on development: fast feedback with disposable test data. Write the result down so you can compare it later. Use separate databases and credentials. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Promote the same built artifact where possible. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Protect production with explicit deployment rules. Finish by checking the result against production: controlled changes, real data and monitored user outcomes. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Development optimizes iteration, staging rehearses production behaviour safely, and production serves real users. Separate credentials, data and deployment permissions; staging is valuable only when its runtime and release path resemble production closely enough to catch meaningful failures. What should I check first? Start with development: fast feedback with disposable test data. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Document the purpose and owner of each environment. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Sharing production secrets with development. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Development: Fast feedback with disposable test data; Staging: Production-like release rehearsal without real side effects; Production: Controlled changes, real data and monitored user outcomes. ### Safer production deployments with GitHub Actions environments URL: https://applaunch.org/guides/github-actions-production-deployment-safety Question: What should gate a production job? Answer: Reference a protected production environment so its reviewers, branch rules and secrets apply only after the job is authorized. Add concurrency to prevent overlapping releases, pin third-party actions and make deployment evidence identify the source commit and target. Plain-English explanation: GitHub Actions environments can place rules around a production job. They can require approval, allow only certain branches and keep production secrets unavailable until the job is authorised. Also prevent two releases changing the same target at once. Record the source commit, built artifact and result so somebody can explain what is running and return to the previous version. Example: A pull request can run tests but cannot read production secrets. After code reaches the protected main branch, a production job waits for approval and a concurrency rule stops another deployment from starting until it finishes. Steps: Create distinct development and production environments. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on authorization: environment protection and allowed refs. Write the result down so you can compare it later. Restrict production branches/tags and reviewers. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Add target-scoped concurrency. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test cancellation and failed-deploy recovery. Finish by checking the result against concurrency: one release mutation per target at a time. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Reference a protected production environment so its reviewers, branch rules and secrets apply only after the job is authorized. Add concurrency to prevent overlapping releases, pin third-party actions and make deployment evidence identify the source commit and target. What should I check first? Start with authorization: environment protection and allowed refs. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Create distinct development and production environments. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Using one secret set for every environment. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Authorization: Environment protection and allowed refs; Secrets: Production values available only to production job; Concurrency: One release mutation per target at a time. ### When to lower DNS TTL before a website migration URL: https://applaunch.org/guides/dns-ttl-before-website-migration Question: How far ahead should TTL change? Answer: Lower the relevant record TTL at least one old-TTL period before cutover so existing caches can expire under the previous policy. Some resolvers may cache longer, so keep both old and new services viable during the transition and retain a rollback plan. Plain-English explanation: TTL tells DNS resolvers how long they may keep an old answer. Lowering it before a move can make later changes appear sooner, but existing caches follow the old TTL until that time expires. Keep both old and new websites working while answers change. Some networks may keep records longer than requested, and a quick rollback still needs the old service to be available. Example: A record has a 24-hour TTL. The owner lowers it to five minutes one day before the move, waits for the old 24-hour period, then changes the address. Lowering it five minutes before cutover would not clear caches already holding the full day. Steps: Inventory authoritative DNS and current records. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on old ttl: wait this long after lowering before relying on it. Write the result down so you can compare it later. Lower only the records being changed. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Verify the target via a temporary hostname. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Monitor answers from multiple resolvers after cutover. Finish by checking the result against overlap: old service stays healthy while caches converge. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Lower the relevant record TTL at least one old-TTL period before cutover so existing caches can expire under the previous policy. Some resolvers may cache longer, so keep both old and new services viable during the transition and retain a rollback plan. What should I check first? Start with old ttl: wait this long after lowering before relying on it. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inventory authoritative DNS and current records. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Lowering TTL five minutes before a 24-hour cache expires. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Old TTL: Wait this long after lowering before relying on it; Cutover: Change only verified target records; Overlap: Old service stays healthy while caches converge. ### Website uptime monitoring beyond “200 OK” URL: https://applaunch.org/guides/website-uptime-monitoring-checklist Question: What does availability mean to a customer? Answer: A homepage returning 200 does not prove login, checkout, forms or APIs work. Monitor a small set of critical journeys from outside the hosting network, validate response content and TLS, and connect each alert to a responder and runbook. Plain-English explanation: A 200 status from the homepage proves only that one page answered. Users may still be unable to log in, submit a form or check out. Monitor a small number of real outcomes from outside the hosting network. Check that the response contains expected content, the HTTPS certificate is valid and speed remains reasonable from useful regions. Every alert needs somebody who knows what to do next. Example: The homepage monitor stays green while the database rejects logins. A second safe monitor signs into a test account and catches the failure. Container monitoring then helps explain it, but the user journey finds it first. Steps: Define the top user outcome. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on reachability: dns, tcp/tls and http response. Write the result down so you can compare it later. Create an external content-aware check. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Add certificate-expiry monitoring. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test the alert and escalation path. Finish by checking the result against experience: latency and failures from relevant regions. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? A homepage returning 200 does not prove login, checkout, forms or APIs work. Monitor a small set of critical journeys from outside the hosting network, validate response content and TLS, and connect each alert to a responder and runbook. What should I check first? Start with reachability: dns, tcp/tls and http response. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Define the top user outcome. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Monitoring from the same host. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Reachability: DNS, TCP/TLS and HTTP response; Correctness: Expected content or safe synthetic transaction; Experience: Latency and failures from relevant regions. ### Website backup RPO and RTO explained URL: https://applaunch.org/guides/website-backup-rpo-rto-explained Question: How much data and downtime can the business accept? Answer: Recovery point objective (RPO) is the maximum data loss measured in time; recovery time objective (RTO) is the maximum time to restore service. A four-hour RPO needs recovery points at least that frequent, while RTO must include provisioning, transfer, database restore, DNS and validation. Plain-English explanation: RPO describes how much recent data the organisation can lose. RTO describes how long the service can remain unavailable. These are business choices that tell the technical team how frequent backups and how fast recovery must be. Recovery time includes finding the problem, creating replacement infrastructure, transferring data, restoring it, updating DNS if needed and checking the service. Measure the whole drill rather than only the file download. Example: A shop accepts at most 15 minutes of lost orders and two hours of downtime. Nightly backups cannot meet the first promise. The team needs more frequent database recovery points and a restore process proven to finish inside two hours. Steps: Ask owners for concrete loss and outage tolerances. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on rpo: maximum acceptable history lost. Write the result down so you can compare it later. Design capture frequency and off-site retention. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Measure a full isolated restore. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Revise objectives or architecture from evidence. Finish by checking the result against retention: history long enough to predate delayed discovery. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Recovery point objective (RPO) is the maximum data loss measured in time; recovery time objective (RTO) is the maximum time to restore service. A four-hour RPO needs recovery points at least that frequent, while RTO must include provisioning, transfer, database restore, DNS and validation. What should I check first? Start with rpo: maximum acceptable history lost. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Ask owners for concrete loss and outage tolerances. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Calling nightly backups continuous recovery. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: RPO: Maximum acceptable history lost; RTO: Maximum acceptable recovery duration; Retention: History long enough to predate delayed discovery. ### Static site vs WordPress vs custom PHP URL: https://applaunch.org/guides/static-site-vs-wordpress-vs-php Question: What is the simplest architecture that meets the workflow? Answer: Use a static site when content changes can follow a build-and-publish process and no server-side features are needed. Use WordPress when non-developers need an established editing screen and plugin library. Use custom PHP when special business rules or integrations justify maintaining your own application code. Plain-English explanation: A static site serves prepared files and is simple when content changes through a build or editor workflow. WordPress gives non-developers a mature content screen and plugins. Custom PHP supports special business logic but needs ongoing engineering. Choose the simplest option that supports the people editing the site and the features users need. More flexible technology also creates more code, updates and security work. Example: A designer portfolio with five rarely changed pages fits static hosting. A news team publishing daily without developers may prefer WordPress. A booking system with unusual rules and integrations may justify a custom PHP application. Steps: List who edits content and how often. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on static: small attack surface and simple serving. Write the result down so you can compare it later. List changing data, accounts and integrations. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Assign security and update ownership. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Try the hardest workflow before choosing hosting. Finish by checking the result against custom php: tailored behaviour with full engineering responsibility. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Use a static site when content changes can follow a build-and-publish process and no server-side features are needed. Use WordPress when non-developers need an established editing screen and plugin library. Use custom PHP when special business rules or integrations justify maintaining your own application code. What should I check first? Start with static: small attack surface and simple serving. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? List who edits content and how often. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Choosing a content management system for one page that never changes. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Static: Small attack surface and simple serving; WordPress: Editing screen and plugin library with an update burden; Custom PHP: Tailored behaviour with full engineering responsibility. ### Why automatic SSL certificate renewal fails URL: https://applaunch.org/guides/ssl-certificate-renewal-failures Question: Can the certificate authority still validate the domain? Answer: Renewal commonly fails because DNS no longer points at the validating service, HTTP challenges are redirected or blocked incorrectly, DNS challenge credentials expired, or the renewal job stopped. Monitor expiry independently so automation failure is detected weeks before users see warnings. Plain-English explanation: HTTPS certificates expire, so most sites renew them automatically. Renewal can fail when DNS points elsewhere, a challenge path is blocked, credentials expire or the scheduled job stops. Monitor the certificate seen by an outside visitor, not only a file on the server. That proves the new certificate was actually loaded and served. Alert weeks before expiry so there is time to fix validation. Example: The server writes a renewed certificate file, but the reverse proxy was never reloaded and still serves the old one. A disk check says success; an external expiry check catches the real public certificate. Steps: Inspect the last renewal attempt and exact challenge error. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on domain control: challenge reaches the expected validator. Write the result down so you can compare it later. Verify authoritative DNS and port/path routing. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run a safe staging or dry-run renewal. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Confirm the served certificate actually changed. Finish by checking the result against detection: external expiry alert with sufficient lead time. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Renewal commonly fails because DNS no longer points at the validating service, HTTP challenges are redirected or blocked incorrectly, DNS challenge credentials expired, or the renewal job stopped. Monitor expiry independently so automation failure is detected weeks before users see warnings. What should I check first? Start with domain control: challenge reaches the expected validator. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Inspect the last renewal attempt and exact challenge error. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Checking only the certificate file on disk. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Domain control: Challenge reaches the expected validator; Automation: Renewal job runs and deploys new certificate; Detection: External expiry alert with sufficient lead time. ### Build a redirect map before changing website URLs URL: https://applaunch.org/guides/website-migration-redirect-map Question: Where should every valuable old URL land? Answer: Map each important old URL to the closest equivalent new resource and use a single permanent redirect hop. Do not send every removed page to the homepage; keep content that still satisfies the intent or return an honest gone/not-found response. Plain-English explanation: When URLs change, old bookmarks and search results need a clear destination. Map each valuable old page to the closest new page and use one permanent redirect. Sending every missing page to the homepage confuses visitors and search engines. Build the list from the old sitemap, analytics, server logs and a site crawl. Test for loops, chains and pages accidentally left behind after launch. Example: Old /services/web-design moves to /website-design, so it receives a direct permanent redirect. An old event page with no useful replacement returns a real not-found or gone response instead of pretending the homepage is the same content. Steps: Export routes from sitemap, analytics, logs and crawl data. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on coverage: traffic, backlinks and indexed old urls included. Write the result down so you can compare it later. Assign exact destinations and owners. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test the map before DNS cutover. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Crawl old URLs after launch and monitor 404s. Finish by checking the result against quality: one hop without loops or chains. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Map each important old URL to the closest equivalent new resource and use a single permanent redirect hop. Do not send every removed page to the homepage; keep content that still satisfies the intent or return an honest gone/not-found response. What should I check first? Start with coverage: traffic, backlinks and indexed old urls included. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Export routes from sitemap, analytics, logs and crawl data. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Wildcarding every path to home. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Coverage: Traffic, backlinks and indexed old URLs included; Relevance: Destination satisfies the same intent; Quality: One hop without loops or chains. ### How to choose a website hosting location URL: https://applaunch.org/guides/choose-website-hosting-location Question: Which users and systems exchange the most latency-sensitive traffic? Answer: Put dynamic compute near the dominant users or dependent data, then use caching for globally reusable assets. Region choice also affects data processing, backups, support and service availability, so document the constraint rather than claiming one location is universally fastest. Plain-English explanation: Put dynamic website work near the people or databases it talks to most often. Static images can be cached around the world, but a page that makes several database calls still pays for distance between the application and database. Region choice may also affect contracts, data handling, backup locations and available services. Test from real audience regions instead of choosing only from a map. Example: Most customers are in the UK and the database is in London. Putting the app in Australia adds a long round trip for every database query even if a CDN serves images nearby. Keeping app and database together in Europe gives a better fit. Steps: Measure current traffic by coarse region. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on users: geography of real interactive traffic. Write the result down so you can compare it later. Map synchronous service dependencies. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test candidate endpoints from user regions. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Record the decision and revisit as audience shifts. Finish by checking the result against governance: data, contract and recovery requirements. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Put dynamic compute near the dominant users or dependent data, then use caching for globally reusable assets. Region choice also affects data processing, backups, support and service availability, so document the constraint rather than claiming one location is universally fastest. What should I check first? Start with users: geography of real interactive traffic. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Measure current traffic by coarse region. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Choosing from headquarters location only. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Users: Geography of real interactive traffic; Dependencies: Database, APIs and storage round trips; Governance: Data, contract and recovery requirements. ### How to compare website hosting total cost URL: https://applaunch.org/guides/website-hosting-total-cost Question: What does the monthly number exclude? Answer: Normalize the required resources and billing period, then add backups, bandwidth or request overages, domains, paid support, migration effort and operator time. A cheaper unmanaged server can cost more when no one is assigned to patch and recover it. Plain-English explanation: Compare more than the plan price. Include storage and traffic charges, backups, domains, support, monitoring, migration work and the time somebody spends on updates and incidents. Use the same expected workload and normal renewal period for each option. A cheap unmanaged server can cost more when the team must learn server administration or recover from avoidable downtime. Example: Provider A costs £6 but needs separate £4 backups and two hours of monthly admin. Provider B costs £12 with the needed backup and platform work included. The £6 headline does not describe the cheaper operated service. Steps: Define the workload before comparing providers. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on platform: plan, storage, traffic and paid add-ons. Write the result down so you can compare it later. Use the same 12-month assumptions. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Value operator hours consistently. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Document exit and restore paths. Finish by checking the result against switching: migration, data export and contract constraints. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Normalize the required resources and billing period, then add backups, bandwidth or request overages, domains, paid support, migration effort and operator time. A cheaper unmanaged server can cost more when no one is assigned to patch and recover it. What should I check first? Start with platform: plan, storage, traffic and paid add-ons. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Define the workload before comparing providers. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Comparing promotional price with normal renewal. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Platform: Plan, storage, traffic and paid add-ons; Operations: Updates, monitoring, backup tests and incidents; Switching: Migration, data export and contract constraints. ### What context to give an AI coding assistant URL: https://applaunch.org/guides/ai-coding-prompt-context-checklist Question: What information changes the implementation? Answer: Give the desired outcome, in-scope files or components, current behaviour, constraints, acceptance tests and relevant error evidence. Let the assistant inspect code structure where possible; never paste secrets, customer data or unrelated files simply to provide “more context.” Plain-English explanation: An AI coding tool needs the goal, the current problem, important rules and a way to prove success. Give it the relevant files or let it inspect the project. More text is not always better; unrelated code can hide the useful details. Describe what users should see after the change and what must not change. Include exact error evidence where safe, but never paste passwords, customer records or production keys. Example: Instead of “fix login,” say that expired sessions return a blank page, name the relevant route, require redirecting to login, preserve the original destination and list the test command. The assistant now has an outcome and proof. Steps: State the user problem in one paragraph. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on outcome: observable behaviour after the change. Write the result down so you can compare it later. Name hard safety and compatibility constraints. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Attach the smallest useful error or design evidence. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Require a proportionate verification result. Finish by checking the result against proof: tests or user journeys that must pass. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Give the desired outcome, in-scope files or components, current behaviour, constraints, acceptance tests and relevant error evidence. Let the assistant inspect code structure where possible; never paste secrets, customer data or unrelated files simply to provide “more context.” What should I check first? Start with outcome: observable behaviour after the change. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? State the user problem in one paragraph. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Prompting with a vague “make it better.” Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Outcome: Observable behaviour after the change; Boundaries: Allowed systems, deployment targets and non-goals; Proof: Tests or user journeys that must pass. ### How to review AI-generated code before deployment URL: https://applaunch.org/guides/review-ai-generated-code-before-deploy Question: What must a human or trusted gate verify? Answer: Treat generated code like an untrusted contribution: understand the diff, check data and authorization boundaries, run targeted and broad tests, inspect dependencies and verify the real user path. Passing syntax is evidence of compilation, not correctness. Plain-English explanation: AI-generated code should be reviewed like code from an unknown contributor. Read the full change, confirm it matches the request and check permissions, data changes, secrets and new dependencies. Run a test that proves the original problem or requirement, then test failure and unauthorised cases. Compilation shows that syntax is acceptable; it does not prove that users are safe or the behaviour is correct. Example: An AI adds an admin delete button and a working API call, but the server route checks only whether the user is logged in. A security review catches that normal users could call it directly even though the button is hidden. Steps: Read the entire diff in context. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on intent: diff matches requested behaviour and scope. Write the result down so you can compare it later. Run static checks and targeted tests. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Exercise the original bug or feature end to end. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Deploy gradually with observability. Finish by checking the result against runtime: critical path plus failure and rollback tests. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Treat generated code like an untrusted contribution: understand the diff, check data and authorization boundaries, run targeted and broad tests, inspect dependencies and verify the real user path. Passing syntax is evidence of compilation, not correctness. What should I check first? Start with intent: diff matches requested behaviour and scope. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Read the entire diff in context. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Reviewing only the assistant summary. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Intent: Diff matches requested behaviour and scope; Risk: Auth, secrets, data mutation and dependency changes; Runtime: Critical path plus failure and rollback tests. ### Why an AI API key must stay server-side URL: https://applaunch.org/guides/ai-api-key-server-side Question: Can frontend code keep a long-lived secret? Answer: No. Anything shipped to a browser can be read and reused by the user or an attacker. Call the AI provider from a backend that authenticates your user, validates requests, enforces budget and rate limits, and stores credentials in a secret manager or server environment. Plain-English explanation: Browser code is sent to the user, so anything inside it can be read. Hiding or scrambling an AI API key in JavaScript does not make it private. Keep the provider key on a trusted server. Your server should identify the user, check request size and allowed actions, apply spending and rate limits, then call the AI provider. Rotate any key that was ever shipped publicly. Example: A website calls the model provider directly with a key in its bundle. Somebody copies it and sends thousands of requests outside the site. Moving the call behind an authenticated server endpoint lets the owner limit each account and revoke abuse. Steps: Remove provider keys from bundles and history. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on client: public code and short-lived user/session tokens only. Write the result down so you can compare it later. Create an authenticated server endpoint. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Validate input size and allowed operations. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Rotate exposed keys and monitor usage. Finish by checking the result against abuse control: per-user limits, logging and revocation. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? No. Anything shipped to a browser can be read and reused by the user or an attacker. Call the AI provider from a backend that authenticates your user, validates requests, enforces budget and rate limits, and stores credentials in a secret manager or server environment. What should I check first? Start with client: public code and short-lived user/session tokens only. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Remove provider keys from bundles and history. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Obfuscating a key in JavaScript. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Client: Public code and short-lived user/session tokens only; Backend: Provider credential and policy enforcement; Abuse control: Per-user limits, logging and revocation. ### AI-generated app production checklist URL: https://applaunch.org/guides/ai-generated-app-production-checklist Question: What separates a prototype from an operated service? Answer: Production readiness requires someone to understand and own the code, reproducible builds, protected secrets, validated data flows, access control, error monitoring, backups, accessibility and a rollback path. Visual polish cannot compensate for unknown authorization or recovery behaviour. Plain-English explanation: A generated prototype can look finished while its login, data rules and recovery are unknown. Production needs an owner who understands the code, repeatable builds, protected secrets, access checks, monitoring, backups and rollback. Inventory every external service and package. Test invalid input and users attempting actions they should not have. A polished screen is only one part of an operated application. Example: A generated dashboard works in the builder, but uses one public database key that can read every customer row. Before launch, the team adds server-side access rules, separates environments, records dependencies and proves backup restore. Steps: Document components and data stores. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on ownership: maintainer can explain architecture and change it safely. Write the result down so you can compare it later. Audit generated dependencies and licenses. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Threat-model sensitive actions. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run restore and rollback drills before launch. Finish by checking the result against operations: monitoring, backups, deploy and rollback. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Production readiness requires someone to understand and own the code, reproducible builds, protected secrets, validated data flows, access control, error monitoring, backups, accessibility and a rollback path. Visual polish cannot compensate for unknown authorization or recovery behaviour. What should I check first? Start with ownership: maintainer can explain architecture and change it safely. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Document components and data stores. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Deploying from an ephemeral editor. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Ownership: Maintainer can explain architecture and change it safely; Controls: Auth, validation, secrets and least privilege; Operations: Monitoring, backups, deploy and rollback. ### A test plan for AI-assisted code changes URL: https://applaunch.org/guides/ai-coding-test-plan Question: Which tests give confidence rather than coverage theatre? Answer: Start with the acceptance behaviour, add a regression test that fails before the fix, then cover boundary and failure cases at the lowest useful level. Finish with the real integrated path when routing, data or external systems are involved. Plain-English explanation: Begin with the behaviour a person or system needs. Create a regression test that fails on the old bug, then cover empty, invalid, maximum and unauthorised cases. Use the smallest useful test level but finish with the real connected path when interfaces matter. A large number of generated tests is not the goal. Tests should fail for meaningful broken behaviour and give enough information to fix it. Example: A file upload bug rejects names with spaces. The first test proves that exact filename fails before the fix and passes after. Additional tests cover empty files, oversized files and users without permission, followed by one browser upload. Steps: Write observable acceptance criteria. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on regression: proves the original defect or requirement. Write the result down so you can compare it later. Make the regression fail against old behaviour. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Test error and rollback paths. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run the repository’s broad release gate. Finish by checking the result against integration: real component interfaces and user path. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Start with the acceptance behaviour, add a regression test that fails before the fix, then cover boundary and failure cases at the lowest useful level. Finish with the real integrated path when routing, data or external systems are involved. What should I check first? Start with regression: proves the original defect or requirement. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Write observable acceptance criteria. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Testing implementation details only. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Regression: Proves the original defect or requirement; Boundary: Invalid, empty, maximum and unauthorized cases; Integration: Real component interfaces and user path. ### How to catch hallucinated library APIs in AI code URL: https://applaunch.org/guides/ai-coding-hallucinated-library-api Question: Does the installed version expose this exact interface? Answer: Check the lockfile and installed type definitions or source, then confirm against official versioned documentation. A method may exist in a newer release, another language SDK or a blog example but not in the project you are changing. Plain-English explanation: AI tools sometimes produce a method that looks right but does not exist in the installed package. The method may belong to a newer release, another programming language or no real library at all. Check package.json and the lockfile, then search installed types or source and official documentation for that exact version. Do not add random packages just to make invented code compile. Example: Generated code calls client.responses.streamText(), but the locked SDK exposes a different interface. Reading the installed type definitions reveals the real method. The team adapts the code without an unnecessary major upgrade. Steps: Read package.json and lockfile. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on version: exact locked package release. Write the result down so you can compare it later. Search installed declarations/source. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Run the smallest compile/runtime proof. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Upgrade only if the change is justified and tested. Finish by checking the result against evidence: types, source or official versioned docs. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Check the lockfile and installed type definitions or source, then confirm against official versioned documentation. A method may exist in a newer release, another language SDK or a blog example but not in the project you are changing. What should I check first? Start with version: exact locked package release. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Read package.json and lockfile. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Installing a new package to make invented code compile. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Version: Exact locked package release; Interface: Export, signature and runtime environment; Evidence: Types, source or official versioned docs. ### Why small diffs make AI refactors safer URL: https://applaunch.org/guides/ai-code-refactor-small-diffs Question: Can reviewers explain every changed behaviour? Answer: Small cohesive diffs reduce the number of interacting assumptions, make tests diagnostic and keep rollback practical. Split formatting or mechanical renames from logic changes, preserve public interfaces unless intentionally changed, and commit only after the relevant gate passes. Plain-English explanation: Small changes are easier to understand, test and undo. Separate formatting and file moves from behaviour changes, and avoid upgrading dependencies in the same commit as a large refactor. After each step, review the diff and run the relevant test. If something fails, there are fewer possible causes. This is especially useful with AI, which can confidently rewrite more code than the task needs. Example: A service needs clearer function names and new retry behaviour. The team first makes a mechanical rename with unchanged tests, then adds the retry in a second change with failure tests. Reviewers can see exactly where behaviour changed. Steps: Capture baseline tests and behaviour. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on scope: one explicit behaviour or mechanical transformation. Write the result down so you can compare it later. Apply one transformation. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Review diff and run targeted checks. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Repeat before the broad release gate. Finish by checking the result against verification: failures point to a small set of assumptions. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Small cohesive diffs reduce the number of interacting assumptions, make tests diagnostic and keep rollback practical. Split formatting or mechanical renames from logic changes, preserve public interfaces unless intentionally changed, and commit only after the relevant gate passes. What should I check first? Start with scope: one explicit behaviour or mechanical transformation. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Capture baseline tests and behaviour. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Combining dependency upgrades and refactors. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Scope: One explicit behaviour or mechanical transformation; Review: Every changed file has a reason; Verification: Failures point to a small set of assumptions. ### How to use AI for SEO content without publishing slop URL: https://applaunch.org/guides/ai-generated-seo-content-quality Question: Would the page deserve to exist without search traffic? Answer: AI-assisted content must still provide accurate, original value to a real audience. Plan one page per distinct intent, verify claims from primary sources, add calculations or operational experience, disclose authorship/process where appropriate, and remove pages that merely paraphrase existing results. Plain-English explanation: AI can help research and organise a draft, but a page still needs a real question, accurate sources and something useful beyond a generic summary. One page should answer one distinct need rather than repeat keyword variations. Add calculations, tested examples, screenshots or operating experience. Name the publisher, show review dates and correct errors. Search traffic should be the result of helping the right audience, not the only reason the page exists. Example: Instead of publishing ten versions of “best Minecraft RAM,” one guide explains player count, mods, exploration and a worked sizing example. Related guides cover genuinely different questions such as CPU bottlenecks and world storage. Steps: Write the searcher’s decision before the title. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on intent: one real question with a satisfying direct answer. Write the result down so you can compare it later. Research primary sources and record dates. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Add evidence unavailable from generic summary. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Run duplicate and factual editorial review. Finish by checking the result against trust: named publisher, dates, sources and correction path. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? AI-assisted content must still provide accurate, original value to a real audience. Plan one page per distinct intent, verify claims from primary sources, add calculations or operational experience, disclose authorship/process where appropriate, and remove pages that merely paraphrase existing results. What should I check first? Start with intent: one real question with a satisfying direct answer. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Write the searcher’s decision before the title. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Generating keyword variations as separate pages. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Intent: One real question with a satisfying direct answer; Original value: Test, calculation, comparison or expert operating detail; Trust: Named publisher, dates, sources and correction path. ### Set cost and abuse limits for an AI feature URL: https://applaunch.org/guides/ai-feature-cost-limits Question: What stops one user or loop consuming the budget? Answer: Enforce limits on the server: authenticate callers, cap request and response size, rate-limit per user and tenant, set spend alerts and hard budgets, and define what the product does when the provider is slow or unavailable. Client-side limits are user experience, not enforcement. Plain-English explanation: AI requests can vary greatly in cost. Limit input size, output size, tool calls and total running time on the server. Add per-user allowances and a global budget so one account, bug or repeated loop cannot spend everything. Decide what users see when the provider is slow, unavailable or the budget is reached. Client-side warnings improve the experience, but server-side rules provide the actual protection. Example: A coding feature allows an agent to call tools repeatedly. A bug makes it loop. The server caps total steps and time, records the failed run and stops billing instead of trusting the browser to cancel it. Steps: Model worst-case cost per accepted request. Start here before buying anything or changing several settings at once. It gives you a clear starting point based on per request: input, output, tool and timeout bounds. Write the result down so you can compare it later. Choose identity-aware quotas. Use the same files, versions and settings that the real project will use. A quick test with an empty or different setup can look successful while completely missing the problem you are trying to solve. Log usage without sensitive prompt leakage. Try the busiest realistic situation, not the easiest one. Include the people, data, traffic or background work you genuinely expect, then watch for slowdowns and errors rather than relying on a single headline number. Test timeout, budget exhaustion and provider failure. Finish by checking the result against global: spend alert, hard stop and incident override. Keep the old setting or release available until you know the change works and can be reversed safely. Common questions: What is the simple answer? Enforce limits on the server: authenticate callers, cap request and response size, rate-limit per user and tenant, set spend alerts and hard budgets, and define what the product does when the provider is slow or unavailable. Client-side limits are user experience, not enforcement. What should I check first? Start with per request: input, output, tool and timeout bounds. That is usually more useful than choosing from a marketing label or copying somebody else’s setting. How can I make the change safely? Model worst-case cost per accepted request. Then change one thing at a time, keep a backup or old version, and use the same real-world test after each change. What is the easiest mistake to avoid? Rate-limiting only by shared IP. Avoiding that one mistake makes the rest of the comparison much more trustworthy. Decision signals: Per request: Input, output, tool and timeout bounds; Per identity: Rate and daily/monthly allowance; Global: Spend alert, hard stop and incident override. ## Free Portfolio Maker and Hosting URL: https://applaunch.org/free-portfolio Build a polished one-page portfolio with HTML, CSS and JavaScript. AppLaunch gives you an editor, 100 MB of storage, a free subdomain and HTTPS—without asking for a card. Included at £0: Price: Free forever; Website: One static portfolio site; Address: One AppLaunch subdomain; Security: HTTPS included; Storage: 100 MB; Code: HTML, CSS and JavaScript; Domains: Connect a domain you already own; Payment: No card required. The editor supports index.html, styles.css, script.js, image uploads, draft previews and publishing. Optional one-time add-ons are Unlimited Pages, Domain Forwarding, Remove Branding, Analytics and Contact Forms. Static portfolios do not run WordPress, databases or server-side code. ### Free Portfolio FAQ - Is the AppLaunch portfolio maker really free? Yes. The free portfolio plan costs £0, does not require a payment card and includes one static portfolio site on an AppLaunch subdomain. Optional add-ons are separate one-time purchases. - What can I build my portfolio with? You can edit index.html, styles.css and script.js, upload images, preview a draft and publish the finished site. It is a code-based portfolio maker rather than a drag-and-drop website builder. - Does free portfolio hosting include HTTPS? Yes. Your AppLaunch portfolio subdomain is served over HTTPS. - Can I use my own domain for a free portfolio? Yes. You can connect a custom domain you already own at no extra hosting cost. Domain Forwarding is a separate optional add-on. - How much storage do I get? The free portfolio includes 100 MB of storage. It is designed for a focused personal, student, creative or professional portfolio. - Can I add more pages later? Yes. The optional Unlimited Pages add-on expands the free one-page portfolio when you need a larger site. - Can I run WordPress or server-side code? No. Free portfolio hosting is for static HTML, CSS, JavaScript and assets. Use an AppLaunch WordPress, PHP or Docker plan when you need a CMS, database or server-side runtime. ## AppLaunch - Website, App and Game Hosting URL: https://applaunch.org/ Summary: Launch WordPress, PHP, Docker, Minecraft, and free portfolio hosting from one AppLaunch account with billing, support, and service tools in one place. ## Pricing - AppLaunch Hosting Plans URL: https://applaunch.org/pricing Summary: Compare AppLaunch hosting plans for WordPress, PHP + MySQL, Docker containers, Minecraft servers, and portfolio hosting. ## Game Hosting - AppLaunch URL: https://applaunch.org/game-hosting Summary: Game server hosting from AppLaunch, starting with guided Minecraft hosting, server software choices, backups, ports, and dashboard controls. ## Terraria Hosting | Vanilla & tModLoader | AppLaunch URL: https://applaunch.org/game-hosting/terraria Summary: Host a PC Terraria or tModLoader world with console, Workshop mods, files, SSH/SFTP, databases and backups. Development preview. ## WordPress Hosting with SSL, Backups & MySQL | AppLaunch URL: https://applaunch.org/wordpress-hosting Summary: Host WordPress with one-click installation, NVMe storage, MySQL databases, SSL, SSH and SFTP access, backups, custom domains and AppLaunch support. ## PHP Hosting with MySQL, SSL & SFTP | AppLaunch URL: https://applaunch.org/php-hosting Summary: Run PHP 8 applications with MySQL databases, NVMe storage, SSL, custom domains, SSH and SFTP access, backups and clear AppLaunch controls. ## Docker Hosting for Containers & Compose | AppLaunch URL: https://applaunch.org/docker-hosting Summary: Deploy Docker containers with Compose, GitHub auto-deploy, environment variables, persistent volumes, public ports, SSL, domains, logs and backups. ## Minecraft Server Hosting Plans & Prices | AppLaunch URL: https://applaunch.org/minecraft-server-hosting Summary: Compare live Minecraft server hosting prices, RAM, shared CPU and NVMe storage for Vanilla, Paper, Spigot, Forge and Fabric servers in Europe. ## How much RAM does a Minecraft server need? - AppLaunch Guides URL: https://applaunch.org/guides/how-much-ram-minecraft-server-needs Summary: Estimate Minecraft server RAM from player count, software, view distance and mods, then keep enough spare memory for safe restarts. ## Minecraft server CPU vs RAM: which matters more? - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-cpu-vs-ram Summary: Diagnose whether a Minecraft server needs faster CPU time, more memory or configuration changes instead of buying the wrong upgrade. ## Paper vs Spigot vs Vanilla for a Minecraft server - AppLaunch Guides URL: https://applaunch.org/guides/paper-vs-spigot-vs-vanilla-server Summary: Compare Vanilla, Spigot and Paper by compatibility, plugins, behaviour changes and maintenance before choosing server software. ## How view distance affects Minecraft server performance - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-view-distance-server-performance Summary: Understand view distance, simulation distance and loaded-chunk growth with a simple square-area estimate. ## Minecraft server slots do not measure performance - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-player-slots-explained Summary: Learn why max-players is an admission limit rather than a capacity guarantee and how to choose a defensible player target. ## How often should you back up a Minecraft server? - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-backup-frequency Summary: Choose Minecraft backup frequency from acceptable progress loss, change rate, restore time and storage cost. ## Should you pre-generate Minecraft world chunks? - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-pre-generate-world-chunks Summary: Decide whether world pre-generation is worth the storage and setup time for a Minecraft server. ## Minecraft port forwarding vs hosted servers - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-port-forwarding-vs-hosting Summary: Compare home port forwarding with paid Minecraft hosting across security, uptime, bandwidth and maintenance. ## Minecraft Java vs Bedrock server hosting - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-java-vs-bedrock-server Summary: Choose the correct Minecraft server edition from player devices, mod/plugin requirements and network expectations. ## How to size a modded Minecraft server - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-modded-server-sizing Summary: Size modded Minecraft hosting with pack-specific tests instead of unreliable mod-count rules. ## Fabric vs Forge for a modded Minecraft server - AppLaunch Guides URL: https://applaunch.org/guides/fabric-vs-forge-server Summary: Compare Fabric and Forge by pack compatibility, mod availability and upgrade burden rather than brand preference. ## Minecraft TPS and MSPT explained - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-tps-mspt-explained Summary: Read ticks per second and milliseconds per tick correctly to diagnose Minecraft server lag. ## A Minecraft server lag troubleshooting checklist - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-lag-troubleshooting Summary: Separate network, client and server lag, then test entities, chunks, plugins, CPU and memory in a useful order. ## Minecraft server security checklist - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-security-checklist Summary: Protect a public Minecraft server with authentication, least access, patching, backups and controlled plugin sources. ## How to use a Minecraft server allowlist - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-whitelist-vs-allowlist Summary: Use Minecraft allowlisting as admission control while keeping authentication, permissions and backups separate. ## How a domain points to a Minecraft server - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-domain-srv-record Summary: Understand A, AAAA and SRV records for a memorable Minecraft server address without confusing DNS with port forwarding. ## Minecraft server DDoS protection basics - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-ddos-protection-basics Summary: Plan DDoS exposure, address protection and incident response for a public Minecraft community. ## How much storage does a Minecraft server need? - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-storage-estimate Summary: Estimate Minecraft storage from measured world growth, plugins, logs and backup retention instead of guessing from player count. ## How to audit Minecraft server plugins before launch - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-plugin-audit Summary: Reduce plugin conflicts and security risk by recording each plugin, checking its source, reviewing permissions and testing before launch. ## How to update a Minecraft server without losing the world - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-update-without-losing-world Summary: Use a clone, full backup and compatibility inventory to update Minecraft safely with a rehearsed rollback. ## When a Minecraft network needs a Velocity proxy - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-proxy-velocity Summary: Decide whether multiple Minecraft servers need a proxy and account for forwarding security and extra failure modes. ## What does it really cost to run a Minecraft server? - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-cost-checklist Summary: Compare Minecraft server costs using resources, backups, bandwidth, administration and failure recovery rather than headline price. ## How to choose a Minecraft server location - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-location-latency Summary: Choose a Minecraft region from player geography, measured latency and route stability rather than the operator’s location alone. ## How to test a Minecraft backup restore - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-backup-restore-test Summary: Prove a Minecraft backup by restoring it into isolation and checking worlds, player data, plugins and join behaviour. ## Minecraft server launch checklist - AppLaunch Guides URL: https://applaunch.org/guides/minecraft-server-launch-checklist Summary: Check software, access, backups, performance, moderation and player instructions before opening a Minecraft server. ## Docker Compose production checklist - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-production-checklist Summary: Turn a development Compose file into a production deployment with fixed code versions, restart rules, secrets, health checks and recovery. ## Docker Compose health checks that test readiness - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-healthcheck-guide Summary: Write useful Compose health checks and use service_healthy for dependencies without mistaking process startup for readiness. ## Why Docker Compose depends_on does not always mean ready - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-depends-on-not-wait Summary: Use Compose dependency conditions and application retries to avoid web containers racing their databases. ## Docker volumes vs bind mounts in production - AppLaunch Guides URL: https://applaunch.org/guides/docker-volume-vs-bind-mount Summary: Choose named volumes, bind mounts or files built into the image based on ownership, portability and backup needs. ## Docker Compose secrets vs environment variables - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-secrets-vs-environment Summary: Keep credentials out of Compose files and understand when mounted secrets are safer than ordinary environment variables. ## Docker Compose networking explained - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-networking-explained Summary: Use service-name DNS, intentional published ports and separate networks to connect Compose services safely. ## Choosing a Docker Compose restart policy - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-restart-policy Summary: Compare no, on-failure, always and unless-stopped against application exit behaviour and operator intent. ## Why latest is a risky Docker image tag - AppLaunch Guides URL: https://applaunch.org/guides/docker-image-tags-production Summary: Deploy traceable Docker images with fixed content identifiers or versioned tags and keep rollback evidence. ## Can Docker Compose deploy with zero downtime? - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-zero-downtime-reality Summary: Understand the limits of single-host Compose and design honest maintenance, proxy and database migration strategies. ## How to back up a database in Docker Compose - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-backup-database-volume Summary: Choose logical database dumps or coordinated volume snapshots and prove restoration outside the live stack. ## Docker Compose CPU and memory limits - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-resource-limits Summary: Set container resource limits from measured busy periods and understand forced stops, processor slowdowns and host safety margins. ## Why use a multi-stage Docker build? - AppLaunch Guides URL: https://applaunch.org/guides/docker-multi-stage-build Summary: Separate build tools from the runtime image to reduce size, attack surface and accidental secret leakage. ## Speed up Docker builds without stale results - AppLaunch Guides URL: https://applaunch.org/guides/docker-build-cache-speed Summary: Order Dockerfile layers, use cache mounts and narrow build context while preserving reproducibility. ## Stop Docker container logs filling the disk - AppLaunch Guides URL: https://applaunch.org/guides/docker-container-logs-disk-full Summary: Set log rotation, centralize useful events and alert on filesystem usage before containers fail. ## Docker Compose environment files without surprises - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-environment-files Summary: Separate interpolation from container environment and validate the fully rendered Compose configuration before deployment. ## Reverse proxy and HTTPS for a Docker Compose app - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-reverse-proxy-https Summary: Route domains to internal services, terminate TLS and publish only the edge ports a Compose application needs. ## Run database migrations safely with Docker Compose - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-database-migrations Summary: Use one-shot migration jobs, compatible schema changes and clear failure handling instead of every replica racing at startup. ## What to monitor in a Docker Compose stack - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-monitoring-basics Summary: Build a small monitoring set around user outcomes, container lifecycle, saturation and disk instead of collecting every metric. ## Docker Compose security checklist - AppLaunch Guides URL: https://applaunch.org/guides/docker-compose-security-checklist Summary: Reduce container risk with trusted fixed image versions, limited access, protected secrets, narrow networks and regular updates. ## Managed Docker hosting vs a VPS - AppLaunch Guides URL: https://applaunch.org/guides/managed-docker-hosting-vs-vps Summary: Compare the control and operating work of deploying Compose to a managed platform or administering your own virtual server. ## Which PHP version should you use in production? - AppLaunch Guides URL: https://applaunch.org/guides/choose-php-version-production Summary: Choose a supported PHP branch from application compatibility and security support, then test migration before switching production. ## PHP 8.4 upgrade checklist - AppLaunch Guides URL: https://applaunch.org/guides/php-8-4-upgrade-checklist Summary: Test PHP 8.4 compatibility, deprecations, extensions and rollback before changing a production application. ## PHP OPcache in production: what to tune - AppLaunch Guides URL: https://applaunch.org/guides/php-opcache-production-settings Summary: Use OPcache to avoid repeated PHP parsing while sizing memory and choosing safe code-change validation behaviour. ## Why changing upload_max_filesize may not fix PHP uploads - AppLaunch Guides URL: https://applaunch.org/guides/php-upload-limit-not-working Summary: Trace PHP upload limits across post_max_size, web-server limits, temporary storage and the active php.ini. ## How to choose a PHP memory_limit - AppLaunch Guides URL: https://applaunch.org/guides/php-memory-limit-sizing Summary: Set PHP memory per process from measured workloads and total worker concurrency without exhausting the host. ## How to size PHP-FPM workers - AppLaunch Guides URL: https://applaunch.org/guides/php-fpm-worker-sizing Summary: Estimate how many PHP-FPM requests can run together from measured memory, CPU and response time instead of copying pm.max_children values. ## MySQL utf8mb4 and collation: a practical guide - AppLaunch Guides URL: https://applaunch.org/guides/mysql-utf8mb4-collation-guide Summary: Choose utf8mb4, understand comparison rules and migrate character data without silently changing semantics. ## How to tell if a MySQL query needs an index - AppLaunch Guides URL: https://applaunch.org/guides/mysql-index-missing-slow-query Summary: Use EXPLAIN, rows examined and real query patterns to design selective indexes without indexing every column. ## MySQL backups: mysqldump is only half the job - AppLaunch Guides URL: https://applaunch.org/guides/mysql-backup-mysqldump-restore-test Summary: Create consistent MySQL dumps, store them safely and prove schema, data, routines and application restoration. ## Fix MySQL “Too many connections” at the cause - AppLaunch Guides URL: https://applaunch.org/guides/mysql-connection-too-many-connections Summary: Diagnose connection leaks, slow queries, pool sizing and requests running together before raising max_connections. ## Secure PHP MySQL connections with PDO - AppLaunch Guides URL: https://applaunch.org/guides/php-mysql-connection-pdo Summary: Use prepared statements, explicit error handling, utf8mb4 and least-privilege credentials in a PHP database layer. ## How to run reliable PHP cron jobs - AppLaunch Guides URL: https://applaunch.org/guides/php-cron-job-hosting Summary: Make scheduled PHP work idempotent, observable and separate from web requests with locking and explicit runtime configuration. ## PHP sessions across multiple web servers - AppLaunch Guides URL: https://applaunch.org/guides/php-session-storage-multiple-servers Summary: Choose sticky sessions or shared session storage and account for locking, expiry and failure. ## How to estimate MySQL database hosting size - AppLaunch Guides URL: https://applaunch.org/guides/mysql-database-size-hosting Summary: Forecast MySQL storage from measured data growth, indexes, logs, temporary work and backup retention. ## PHP hosting vs a VPS: which should you choose? - AppLaunch Guides URL: https://applaunch.org/guides/php-shared-hosting-vs-vps Summary: Compare managed PHP hosting and VPS control across extensions, web stack, security updates, backups and operator time. ## How to debug a PHP 500 error safely - AppLaunch Guides URL: https://applaunch.org/guides/php-500-error-production-debugging Summary: Correlate request logs, PHP-FPM errors and recent changes without displaying sensitive stack traces to visitors. ## Use the MySQL slow query log without drowning in data - AppLaunch Guides URL: https://applaunch.org/guides/mysql-slow-query-log-guide Summary: Capture slow or high-work queries for a bounded period, aggregate patterns and validate improvements with EXPLAIN. ## Safer MySQL schema migrations for live PHP apps - AppLaunch Guides URL: https://applaunch.org/guides/mysql-schema-migration-zero-downtime Summary: Use additive changes, compatible deployments and measured backfills to reduce lock and rollback risk. ## Composer install for a production PHP deployment - AppLaunch Guides URL: https://applaunch.org/guides/php-composer-production-deploy Summary: Build repeatable PHP dependencies from a committed lockfile without development packages or changes on the live server. ## When a PHP deployment needs a database backup - AppLaunch Guides URL: https://applaunch.org/guides/php-mysql-backup-before-deploy Summary: Tie backups to migration risk and recovery objectives instead of taking a dump mechanically before every code upload. ## PHP and MySQL application launch checklist - AppLaunch Guides URL: https://applaunch.org/guides/php-mysql-launch-checklist Summary: Verify runtime, database, security, backups, scheduled jobs, observability and rollback before launch. ## What does good WordPress hosting need? - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-hosting-requirements Summary: Evaluate WordPress hosting by supported PHP and database software, HTTPS, backups, access and operational responsibility. ## WordPress memory limit vs PHP memory_limit - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-memory-limit-vs-php-memory Summary: Understand the two memory settings and fix high usage instead of raising constants until the server fails. ## Audit WordPress plugins before moving hosts - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-plugin-audit-before-hosting-move Summary: Inventory plugin purpose, support, data, cron and runtime requirements before a WordPress migration. ## A WordPress backup needs files and database - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-backup-files-and-database Summary: Back up WordPress uploads, themes, plugins, configuration and database with matched recovery points. ## WordPress staging site checklist - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-staging-site-checklist Summary: Create an isolated WordPress staging copy without sending real mail, taking payments or becoming indexed. ## How to diagnose a slow WordPress site - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-slow-site-diagnosis Summary: Separate page generation, database, external calls, assets and cache misses before installing another optimization plugin. ## WordPress cache plugin vs server cache - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-cache-plugin-vs-server-cache Summary: Understand page, object, opcode and browser caching so layers complement rather than conflict. ## WordPress security hardening that matters - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-security-hardening-basics Summary: Prioritize trusted software, updates, least privilege, secure administration and tested backups over cosmetic tricks. ## Move WordPress hosting with minimal DNS downtime - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-migration-dns-downtime Summary: Lower DNS TTL, copy twice, freeze writes and verify the target before changing records. ## WordPress Multisite vs separate installations - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-multisite-vs-separate-sites Summary: Choose Multisite only when shared administration and controlled plugin/theme governance outweigh isolation needs. ## How to size hosting for WooCommerce - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-woocommerce-hosting-capacity Summary: Size WooCommerce from concurrent dynamic actions, catalogue queries, imports and checkout reliability rather than page views alone. ## WP-Cron vs a real scheduled job - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-cron-real-cron Summary: Understand traffic-triggered WP-Cron and when a system scheduler gives more predictable WordPress background execution. ## Safe WordPress database cleanup - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-database-cleanup-safe Summary: Measure autoloaded options, revisions and orphaned plugin data on a clone before deleting anything. ## Do not break email when moving a WordPress domain - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-domain-email-migration Summary: Separate web DNS from mail records and test forms, transactional delivery and SPF/DKIM during a WordPress move. ## WordPress website launch checklist - AppLaunch Guides URL: https://applaunch.org/guides/wordpress-launch-checklist Summary: Verify search visibility, security, performance, backups, forms, analytics and rollback before removing the coming-soon page. ## Development vs staging vs production environments - AppLaunch Guides URL: https://applaunch.org/guides/development-staging-production-environments Summary: Give each deployment environment a clear purpose, isolated secrets and data policy instead of using names without boundaries. ## Safer production deployments with GitHub Actions environments - AppLaunch Guides URL: https://applaunch.org/guides/github-actions-production-deployment-safety Summary: Use environment approvals, branch restrictions, concurrency and scoped secrets to reduce accidental releases. ## When to lower DNS TTL before a website migration - AppLaunch Guides URL: https://applaunch.org/guides/dns-ttl-before-website-migration Summary: Plan DNS cache duration, cutover timing and rollback without claiming TTL makes every resolver update instantly. ## Website uptime monitoring beyond “200 OK” - AppLaunch Guides URL: https://applaunch.org/guides/website-uptime-monitoring-checklist Summary: Monitor DNS, TLS, critical user journeys and regional latency with actionable ownership. ## Website backup RPO and RTO explained - AppLaunch Guides URL: https://applaunch.org/guides/website-backup-rpo-rto-explained Summary: Turn backup frequency and restore speed into explicit recovery objectives for sites and applications. ## Static site vs WordPress vs custom PHP - AppLaunch Guides URL: https://applaunch.org/guides/static-site-vs-wordpress-vs-php Summary: Choose a website architecture from editing workflow, dynamic features, maintenance and hosting needs. ## Why automatic SSL certificate renewal fails - AppLaunch Guides URL: https://applaunch.org/guides/ssl-certificate-renewal-failures Summary: Diagnose DNS, challenge routing, port access, clock and rate-limit problems before a certificate expires. ## Build a redirect map before changing website URLs - AppLaunch Guides URL: https://applaunch.org/guides/website-migration-redirect-map Summary: Preserve visitors and search signals with one-to-one permanent redirects and post-launch crawl checks. ## How to choose a website hosting location - AppLaunch Guides URL: https://applaunch.org/guides/choose-website-hosting-location Summary: Balance visitor latency, data obligations, integrations and operations rather than choosing the nearest region blindly. ## How to compare website hosting total cost - AppLaunch Guides URL: https://applaunch.org/guides/website-hosting-total-cost Summary: Compare hosting with backups, traffic, support, migrations, administration and outage risk included. ## What context to give an AI coding assistant - AppLaunch Guides URL: https://applaunch.org/guides/ai-coding-prompt-context-checklist Summary: Provide goals, constraints, interfaces, evidence and verification commands without dumping irrelevant repositories or secrets. ## How to review AI-generated code before deployment - AppLaunch Guides URL: https://applaunch.org/guides/review-ai-generated-code-before-deploy Summary: Review behaviour, security boundaries, failure handling, tests and diffs rather than trusting plausible-looking output. ## Why an AI API key must stay server-side - AppLaunch Guides URL: https://applaunch.org/guides/ai-api-key-server-side Summary: Keep model provider credentials out of browsers and mobile bundles with a controlled backend and usage limits. ## AI-generated app production checklist - AppLaunch Guides URL: https://applaunch.org/guides/ai-generated-app-production-checklist Summary: Move a generated prototype into production with ownership, dependency, security, accessibility and recovery checks. ## A test plan for AI-assisted code changes - AppLaunch Guides URL: https://applaunch.org/guides/ai-coding-test-plan Summary: Build tests from the requested behaviour, regression risk and real interfaces instead of asking an AI to “add tests.” ## How to catch hallucinated library APIs in AI code - AppLaunch Guides URL: https://applaunch.org/guides/ai-coding-hallucinated-library-api Summary: Verify package versions, exports and official documentation before accepting plausible methods or configuration. ## Why small diffs make AI refactors safer - AppLaunch Guides URL: https://applaunch.org/guides/ai-code-refactor-small-diffs Summary: Separate mechanical change from behaviour change and keep verification evidence attributable. ## How to use AI for SEO content without publishing slop - AppLaunch Guides URL: https://applaunch.org/guides/ai-generated-seo-content-quality Summary: Use AI for structure and research assistance while adding original evidence, editorial ownership and intent-level deduplication. ## Set cost and abuse limits for an AI feature - AppLaunch Guides URL: https://applaunch.org/guides/ai-feature-cost-limits Summary: Control model usage with authentication, input/output caps, rate limits, budgets and degraded behaviour. ## Free Docker Compose Production Checker | AppLaunch URL: https://applaunch.org/tools/docker-compose-checker Summary: Check Docker Compose YAML for risky defaults, exposed ports, likely hard-coded secrets, mutable image tags, missing healthchecks, resource limits and persistence. ## Free Portfolio Maker & Website Hosting | AppLaunch URL: https://applaunch.org/free-portfolio Summary: Build a free portfolio website with HTML, CSS and JavaScript, 100 MB storage, an AppLaunch subdomain, HTTPS, custom domain support and no card required. ## Business Webpage Early Access - AppLaunch URL: https://applaunch.org/business-webpage Summary: Request early access to an AppLaunch business webpage with hosting, support, domain planning, and simple launch help from one place. ## Rail application hosting — Coming soon | AppLaunch URL: https://applaunch.org/rail-hosting Summary: Explore Rail, AppLaunch’s planned application hosting service. Rail is coming soon; compare currently available hosting and contact us about your project. ## Domains - AppLaunch URL: https://applaunch.org/domains Summary: Connect existing domains to supported AppLaunch services today. New domain search and registration are shown as coming soon. ## About AppLaunch - Hosting Built for Launch URL: https://applaunch.org/about Summary: Learn about AppLaunch, a hosting platform focused on speed, security, simplicity, and real support for websites and services. ## Contact AppLaunch URL: https://applaunch.org/contact Summary: Contact AppLaunch for sales, support, feedback, privacy, legal, or general hosting questions. ## Consumer Terms of Service - AppLaunch URL: https://applaunch.org/terms Summary: Read AppLaunch consumer terms for hosting, subscriptions, cooling-off, cancellation, refunds, suspension, backups, and liability. ## Business Terms of Service - AppLaunch URL: https://applaunch.org/business-terms Summary: Read AppLaunch business terms for commercial hosting, payment, customer data, suspension, warranties, and liability. ## Privacy Notice - AppLaunch URL: https://applaunch.org/privacy Summary: Read how AppLaunch processes account, billing, hosted service, support, analytics, security, and AI-related data. ## Young Users Guide - AppLaunch URL: https://applaunch.org/young-users Summary: Plain-language AppLaunch account, purchase, privacy, safety, and support rules for users aged 13 to 17 and their parents or legal guardians. ## Legal Notice and Document Hub - AppLaunch URL: https://applaunch.org/legal Summary: Find AppLaunch operator information, legal contacts, terms, privacy documents, service policies, and complaint routes. ## Cookies and Similar Technologies - AppLaunch URL: https://applaunch.org/cookies Summary: See browser storage used by AppLaunch for authentication, security, preferences, payments, and aggregate site analytics. ## Acceptable Use and Fair Use - AppLaunch URL: https://applaunch.org/acceptable-use Summary: Read AppLaunch prohibited-use, fair-resource, moderation, suspension, and abuse-reporting rules. ## Cancellation and Refund Policy - AppLaunch URL: https://applaunch.org/refunds Summary: Read AppLaunch subscription cancellation, consumer cooling-off, cash refund, and discretionary goodwill rules. ## Hosting Service Schedule - AppLaunch URL: https://applaunch.org/service-schedule Summary: Read product scope for AppLaunch WordPress, PHP, Docker, Minecraft, and free Portfolio hosting. ## Data Processing Addendum - AppLaunch URL: https://applaunch.org/data-processing Summary: Read AppLaunch UK GDPR processor terms covering security, subprocessors, transfers, rights assistance, and deletion. ## Subprocessor List - AppLaunch URL: https://applaunch.org/subprocessors Summary: Review the service providers AppLaunch uses for infrastructure, payments, email, AI, repository integrations, and support metadata. ## Backup and Data Retention Policy - AppLaunch URL: https://applaunch.org/backups Summary: Read AppLaunch backup coverage, daily and weekly retention, restore, deletion, and customer-backup responsibilities. ## Complaints and Appeals - AppLaunch URL: https://applaunch.org/complaints Summary: Submit AppLaunch service, billing, privacy, suspension, abuse, or intellectual-property complaints and appeals. ## Responsible Disclosure - AppLaunch URL: https://applaunch.org/responsible-disclosure Summary: Read AppLaunch good-faith security research, testing limits, vulnerability reporting, and response policy. ## Status - AppLaunch URL: https://applaunch.org/status Summary: Check AppLaunch service status for hosting, billing, dashboard, support, domain tools, and planned product areas.