---
title: "Implement Config Mgmt in Site Factory Pt 3"
date: "2023-06-22T09:50:14+00:00"
summary:
image:
type: "article"
url: "/site-factory/help/90611-implement-config-mgmt-site-factory-pt-3"
id: "d5111a07-5ddd-4b0f-b38e-5d958925dd6d"
---

Table of contents will be added

Goal
----

Learn about configuration management and the end-to-end deployment workflow that enables success with Site Factory!

Overview
--------

This is the final segment of a three-part guide covering on how to create a Drupal 10 codebase for Acquia Cloud Site Factory (ACSF). With this end-to-end approach, you can quickly install new Drupal sites or update existing sites so they will inherit the managed configuration in your codebase. We will be working with Acquia's Cloud IDE to simplify the development and deployment process.

This guide has been divided into three parts:

1.  [Set up Cloud IDE, Install Drupal 10, and Prepare your Codebase for Site Factory](/tutorial/preparing-codebase-site-factory-part-1)
2.  [Create a Custom Profile and test New Site Creation with Site Factory](/tutorial/create-custom-profile-use-site-factory-part-2)
3.  **Implementing Configuration Management and Proving out the Site Factory Deployment Workflow**

I hope this last phase will help you gain a deeper understanding of the process and feel more confident in your ability to successfully deploy your code changes to ACSF.

1.  Making changes to your Codebase: Config Ignore minimal configuration
    --------------------------------------------------------------------
    
    In order to have configuration differences between your ACSF sites, you will need to list inside the Config Ignore module the configuration files that you wish to be different between your sites.
    
    For example, If you want to have different site names and different blocks added to the Block Layout admin page of each site, you should add the following configurations names to your Config Ignore module:
    
    *   system.site
    *   block.block.\* (will ignore all config entities that starts with block.block)
    
    In your Cloud IDE site, go to the Config Ignore admin page ( /admin/config/development/configuration/ignore) and add the following:
    
        system.site
        block.block.*
        webform.webform.*
        system.menu.*
        system.theme
        views.view.*
        taxonomy.*
    
    ![Admin panel showing configuration settings with a list of entity names to ignore, including system.site and block.block.](https://acquia.widen.net/content/f8c6ccc0-b82b-4f8b-815f-8d484132b30c/web/url_8661d2639ff74e3e9ed64b34fff6949b.png)
    
    Save your changes.
    
    ### Export the configuration changes
    
    After you make changes to your codebase, it’s a good idea to check for Database updates:
    
        Signorelli IDE:~/project (main) $ drush updb
        [success] No pending updates.
    
    Export the new Drupal configuration:
    
        drush cex
    
        Signorelli IDE:~/project (main) $ drush cex
        [notice] Differences of the active config to the export directory:
        +------------+------------------------+-----------+
        | Collection | Config | Operation |
        +------------+------------------------+-----------+
        | | config_ignore.settings | Update |
        +------------+------------------------+-----------+
        The .yml files in your export directory (/home/ide/project/config/default) will be deleted and replaced with the active config. (yes/no) [yes]:
        > yes
        [success] Configuration successfully exported to /home/ide/project/config/default.
        /home/ide/project/config/default
        Signorelli IDE:~/project (main *) $ 
    
    ### Deploy your codebase changes to ACSF
    
    First, you need to push your new codebase changes to your repository:
    
        git add -A
        git commit -m "BLT-003: Config Ignore minimal configuration."
        git push
    
    Deploy your codebase to ACSF:
    
        blt artifact:deploy
    
    I named this new deployed code: **1.0.1-d10acsf**
    
        Signorelli IDE:~/project (main) $ blt artifact:deploy
        Would you like to create a tag? (y/n) y
        Enter a valid commit message [BLT-003: Config Ignore minimal configuration.] 
        Enter the tag name for the deployment artifact, e.g., 1.0.0-build 1.0.1-d10acsf
    
    Go to the ACSF Console UI of one of your lower environments and navigate to Administration -> Update code:
    
    ![Web interface showing Acquia Site Factory's administration page with options for code management and deployment, including updating code and viewing site update status.](https://acquia.widen.net/content/445233a8-93d2-4228-8546-8c86cb707576/web/url_fe16a0378db1a04c3c5fbb5afa7a6676.png)
    
    In the Site Update page, use the dropdown to select your new codebase (**1.0.1-d10acsf**):
    
    ![Website update interface showing options for start time and site update action, with buttons for "Code only" and "Code and databases."](https://acquia.widen.net/content/9451133a-79b8-4a1f-b456-72bc4dde00be/web/url_2b4a80c492579852645cd26e59711c62.png)
    
    Click the Update button and wait until the update process finishes:
    
    ![Dashboard showing a successful site update with 1 task completed, 0 warnings, and 0 errors. Logs available for viewing.](https://acquia.widen.net/content/7045c22b-f11d-4d17-8b13-ef6ffa3c18cf/web/url_8be03405480c7224f608a139c3950516.png)
    
    ### Check for configuration differences: Create your second ACSF site
    
    It’s recommended that you always create a new site to test that your codebase is working fine, and that it doesn’t create configuration differences.
    
    Create a new ACSF site using your new codebase. Go to Sites and select your group:
    
    ![Dashboard interface of Acquia Site Factory, showing "Sites" tab, site list with user details, and options to sort, create groups, or add users.](https://acquia.widen.net/content/ad155252-c0a3-4eb5-8851-d5cede26c2f2/web/url_b3bd2be71e63bbff979ee8be1eedc8da.png)
    
    Click the “Create a new Site” button:
    
    Give a name to your new site (Example: site2), and click the “Create Site” button:
    
    ![Web interface for creating a new site on Acquia Site Factory. Input field for site URL and "Create Site" button are visible.](https://acquia.widen.net/content/ceee8d41-0a56-46c3-98f2-80e60814b1a3/web/url_7f61fb7120678203f8c6b8dec40c843a.png)
    
    ![Confirmation page showing "Site creation complete" with a button labeled "Go to Site" and an email notification message.](https://acquia.widen.net/content/9e6e4f7e-a4ea-467e-8711-a7bdf845ea20/web/url_f31a6aefd175a359c6dbd041b9ab5d2a.png)
    
    ### Create a new Drush alias for your new ACSF site
    
    Go back to your Cloud IDE and create a new Drush alias for your new ACSF site using the aliases.sh bash script. Execute the aliasgenerator.sh bash script and follow the instructions:
    
        ./aliasgenerator.sh
    
        Signorelli IDE:~/project (main) $ ./aliasgenerator.sh
         
         
        
        | Drush Alias Generator |
        
         
         
         |---------------------|
         | Main Menu |
         |---------------------|
         | 1 - New Drush Alias |
         | 2 - Exit |
         |---------------------|
        Select a number from the Main Menu: 1
        Selected: New Drush Alias
        -------------------------
        Make sure to enter the name of a site you already created in your ACSF account.
        Example: If the ACSF URL assigned to your new site is site1.acquiatam2.acsitefactory.com
        Enter site1
        Provide the name of the site you want to create a Drush alias: site2
        Is this site name correct?: "site2" (Yes/No/Cancel = y/n/c)
        y
        Generating the drush alias for site2..
        Ready! Going back to the Main Menu...
         |---------------------|
         | Main Menu |
         |---------------------|
         | 1 - New Drush Alias |
         | 2 - Exit |
         |---------------------|
        Select a number from the Main Menu: 2
        Selected: Exit
        --------------
        Exiting this script...
    
    Check that your new site doesn’t have configuration differences:
    
        drush @site2.01test cex
    
        Signorelli IDE:~/project (main) $ drush @site2.01test cex
        [notice] The active configuration is identical to the configuration in the export directory (../config/default).
        ../config/default
        Connection to acquiatam201test.ssh.enterprise-g1.acquia-sites.com closed.
        Signorelli IDE:~/project (main) $
    
    ### Testing your new codebase: Change the site name of your second site
    
    Login to your new ACSF site using drush uli:
    
        drush @site2.01test uli
    
    Go to the “Basic site settings” admin page (/admin/config/system/site-information) and change the name of your new site:
    
    ![Change the name of your new site.](https://acquia.widen.net/content/6a52ce2c-18e7-4905-80a7-46b131ff4e1e/web/url_9fc90764f424a093eb42ffb4f24833a4.png)
    
    Save your changes.
    
    Check that this new change in your second site didn’t create a configuration difference:
    
        drush @site2.01test cex
    
        Signorelli IDE:~/project (main) $ drush @site2.01test cex
        [notice] The active configuration is identical to the configuration in the export directory (../config/default).
        ../config/default
        Connection to acquiatam201test.ssh.enterprise-g1.acquia-sites.com closed.
        Signorelli IDE:~/project (main) $
    
2.  Making changes to your Codebase: Install a new module
    -----------------------------------------------------
    
    I will install the Shield module to demonstrate the process of adding a new module to your codebase.
    
    ### Install the new module with Composer
    
    Go to your Cloud IDE instance and execute the following composer command to install the Shield module:
    
        composer require 'drupal/shield:^1.7'
    
    Enable the Shield module:
    
        drush en shield
    
    Go to the Shield module configuration page to make sure the module was installed and enabled successfully (/admin/config/system/shield):
    
    ![Webpage showing "Shield" settings in a system configuration panel, with options for enabling shield, authentication message, and credential provider selection.](https://acquia.widen.net/content/765af7c9-18f4-4fe5-9cee-8a75699c6e23/web/url_9fe1d6be9f2994a627203e0d899ef8df.png)
    
    ### Add the Shield module to the Config Ignore module
    
    If you wish to have the ability to use different Shield credentials per site, you will need to add the Shield configuration file to the Config Ignore module.
    
    Open a new Terminal window in your Cloud IDE instance and execute “drush cex” to find out the filename of the Shield configuration file. Respond NO to the prompt as we don’t want to export the configuration changes at this moment:
    
        drush cex
    
        Signorelli IDE:~/project (main) $ drush cex
        [notice] Differences of the active config to the export directory:
        +------------+-----------------+-----------+
        | Collection | Config | Operation |
        +------------+-----------------+-----------+
        | | shield.settings | Create |
        | | core.extension | Update |
        +------------+-----------------+-----------+
        The .yml files in your export directory (/home/ide/project/config/default) will be deleted and replaced with the active config. (yes/no) [yes]:
        > no
        In ConfigExportCommands.php line 155:
         
         Cancelled.
        Signorelli IDE:~/project (main) $
    
    Go to the Config Ignore admin page of your Cloud IDE site and add “shield.settings” to the end of the list (/admin/config/development/configuration/ignore):
    
    ![Admin interface showing configuration settings with a list of entity names to ignore, including system, block, and theme. Red arrow points to "shield_settings."](https://acquia.widen.net/content/727da055-dc2c-449e-825a-7cd53d9f5626/web/url_c2ae079605f21410a58c893e8059c1fd.png)
    
    ### Export your new Drupal configuration
    
    After installing a new module, it’s always recommended to see if there are pending database changes:
    
        drush updb
    
        Signorelli IDE:~/project (main) $ drush updb
        [success] No pending updates.
        Signorelli IDE:~/project (main) $ 
    
    Run the following BLT command each time there is a core update or if a new module was installed:
    
        blt recipes:acsf:init:drush
    
    Export the new Drupal configuration:
    
        drush cex
    
        Signorelli IDE:~/project (main *) $ drush cex
        [notice] Differences of the active config to the export directory:
        +------------+-------------------------+-----------+
        | Collection | Config | Operation |
        +------------+-------------------------+-----------+
        | | core.extension | Update |
        | | config_ignore.settings | Update |
        +------------+-------------------------+-----------+
        The .yml files in your export directory (/home/ide/project/config/default) will be deleted and replaced with the active config. (yes/no) [yes]:
        > yes
        [success] Configuration successfully exported to /home/ide/project/config/default.
        /home/ide/project/config/default
        Signorelli IDE:~/project (main *) $
    
    ### Add your new module to your profile’s .info.yml file
    
    Every time you add a new module to your codebase, you will need to add it to your profile’s .info.yml file.  
    Open your profile’s .info.yml file (/home/ide/project/docroot/profiles/custom/tamprofile/acsfprofile.info.yml) and under the “install” section, add the new installed module (shield):
    
        name: acsfprofile
        type: profile
        base profile: minimal
        description: 'ACSF Profile'
        core: 9.x
        core_version_requirement: '^9 || ^10'
        install:
         - acsf
         - acsf_duplication
         - acsf_theme
         - acsf_variables
         - automated_cron
         - big_pipe
         - block
         - block_content
         - breakpoint
         - ckeditor5
         - comment
         - config
         - config_filter
         - config_ignore
         - config_split
         - contact
         - contextual
         - datetime
         - dblog
         - dynamic_page_cache
         - editor
         - field
         - field_ui
         - file
         - filter
         - help
         - history
         - image
         - link
         - menu_link_content
         - menu_ui
         - mysql
         - node
         - options
         - page_cache
         - path
         - path_alias
         - search
         - shield  - shortcut
         - system
         - taxonomy
         - text
         - toolbar
         - tour
         - update
         - user
         - views_ui
         - views
         - acsfprofile
        theme:
         - olivero
         - claro
    
    Save your changes.
    
    ### Deploy your new codebase changes to ACSF
    
    First, you need to push your new codebase changes to your repository:
    
        git add -A
        git commit -m "BLT-004: Added the Shield module."
        git push
    
    Deploy your codebase to ACSF:
    
        blt artifact:deploy
    
    I named this new deployed code: **1.0.2-d10acsf**
    
        Signorelli IDE:~/project (main) $ blt artifact:deploy
        Would you like to create a tag? (y/n) y
        Enter a valid commit message [BLT-004: Added the Shield module.] 
        Enter the tag name for the deployment artifact, e.g., 1.0.0-build 1.0.2-d10acsf
    
    Go to the ACSF Console UI of one of your lower environments and go to Administration -> Update code:
    
    ![Web interface showing "Code management and deployment" options, including "Update code," under the "Administration" tab in Acquia Site Factory.](https://acquia.widen.net/content/45ec7d46-f306-476b-9bb8-c045623aef6f/web/url_f2c9e1579204a68bfc7a2ba44eb79025.png)
    
    In the Site Update page, use the dropdown to select your new codebase (**1.0.2-d10acsf**):
    
    ![Screenshot of a webpage with a blue header, search bar, and article titled "My snazzy and snappy new article."](https://acquia.widen.net/content/b07ec7ce-eef6-4a9d-9484-8cc790214349/web/url_3581079411d70cfd95b918ba98ce1cf5.png)
    
    Click the Update button and wait until the update process finishes:
    
    ![Site update progress bar at 100%, showing 2 tasks completed, none in progress, with no warnings or errors.](https://acquia.widen.net/content/4f3c60e9-3571-4969-a44d-c9a5ffd66aba/web/url_716919c2eefd93338766b74862a9cbaa.png)
    
    ### Check the changes in your existing ACSF sites
    
    After you pushed your new codebase to the test environment and updated all the existing sites in there, you should always check that the changes were applied successfully to your sites.
    
    Go to the Config Ignore module admin page of one of your ACSF sites to check if it has the new “shield.settings” on the list:
    
    ![Webpage screenshot showing configuration settings under "Ignore" tab, listing entity names like system.site and shield.settings. URL bar indicates a non-secure connection.](https://acquia.widen.net/content/1bac1779-7e7b-4a7a-a2a3-c50e67bd2a12/web/url_edbdb415a2187c41578957184eb3822b.png)
    
    ### Enable the Shield module and check for Configuration Differences
    
    Let’s activate and configure the Shield module on one of your ACSF sites. Go to the Shield module admin page ( /admin/config/system/shield), check the “Enable Shield” checkbox and assign a user and password under the Credentials section. Click the “Save configuration” button to save the changes:
    
    ![Admin panel screenshot showing Shield settings with enabled toggle, authentication message, and user credentials (admin/pass123) highlighted.](https://acquia.widen.net/content/cef9a064-810c-4892-beeb-05a60d3760a1/web/url_1a8f685c15feef92820538fea13ff231.png)
    
    You should get the Shield “Sign In” prompt right after you hit the “Save configuration” button:
    
    ![Login page with fields for username and password, displaying a warning about a non-private connection. Options to cancel or sign in.](https://acquia.widen.net/content/31cda6ee-a945-4741-a237-ff81837972e6/web/url_a3b557799027e2a2dafcf5659dc6df99.png)
    
    Enter your Shield credentials to test everything is working fine.
    
    ### Check for configuration differences
    
    Now that one of your sites has the Shield module activated, you should check if there are any configuration differences. Go to your Cloud IDE terminal and execute “drush cex” against your ACSF site that has the Shield module activated:
    
        Signorelli IDE:~/project (main) $ drush @site2.01test cex
        [notice] The active configuration is identical to the configuration in the export directory (../config/default).
        ../config/default
        Connection to acquiatam201test.ssh.enterprise-g1.acquia-sites.com closed.
        Signorelli IDE:~/project (main) $ 
    
    We don’t have any configuration differences. That means we configured the Config Ignore module correctly to ignore any configuration changes of the Shield module across your ACSF sites.
    
    ### Create a new ACSF site to test your new codebase
    
    It’s recommended that you always create a new site to test that your codebase is working fine and that it doesn’t create configuration differences.
    
    Create a new ACSF site using your new codebase. Go to Sites and select your group:
    
    ![Dashboard of Acquia Site Factory showing site management options, including "Sites," "Users," and "Administration" tabs, with sorting and filtering features.](https://acquia.widen.net/content/93d54939-ddc0-435d-bbb3-a5011e2c5a61/web/url_12c33c55c3e9ccb8e4ffe226dae99c07.png)
    
    Click the “Create a new Site” button. Give a name to your new site (Example: site3), and click the “Create Site” button:
    
    ![Flowchart illustrating a hierarchical folder structure with documents branching from three main folders, showing file organization.](https://acquia.widen.net/content/2e8d642a-7009-49a1-a54d-4db132fb9ad4/web/url_82c6dca13cd687ba57eb2481cc429eae.png)
    
    ![Confirmation screen for site creation on Acquia Site Factory, with a button labeled "Go to Site."](https://acquia.widen.net/content/5d289384-8b33-4141-acaf-b5a39d42be35/web/url_1b65d98f3c4a2af27230ed9dbb91419e.png)
    
    ### Create a new Drush alias for your new ACSF site
    
    Go back to your Cloud IDE and create a new Drush alias for your new ACSF site using the aliasgenerator.sh bash script. Execute the aliasgenerator.sh bash script and follow the instructions:
    
        ./aliasgenerator.sh
    
        Signorelli IDE:~/project (main) $ ./aliasgenerator.sh
         
         
        
        | Drush Alias Generator |
        
         
         
         |---------------------|
         | Main Menu |
         |---------------------|
         | 1 - New Drush Alias |
         | 2 - Exit |
         |---------------------|
        Select a number from the Main Menu: 1
        Selected: New Drush Alias
        -------------------------
        Make sure to enter the name of a site you already created in your ACSF account.
        Example: If the ACSF URL assigned to your new site is site1.acquiatam2.acsitefactory.com
        Enter site1
        Provide the name of the site you want to create a Drush alias: site2
        Is this site name correct?: "site3" (Yes/No/Cancel = y/n/c)
        y
        Generating the drush alias for site3..
        Ready! Going back to the Main Menu...
         |---------------------|
         | Main Menu |
         |---------------------|
         | 1 - New Drush Alias |
         | 2 - Exit |
         |---------------------|
        Select a number from the Main Menu: 2
        Selected: Exit
        --------------
        Exiting this script...
    
    Check that your new site doesn’t have configuration differences:
    
        drush @site3.01test cex
    
        Signorelli IDE:~/project (main) $ drush @site3.01test cex
        [notice] The active configuration is identical to the configuration in the export directory (../config/default).
        ../config/default
        Connection to acquiatam201test.ssh.enterprise-g1.acquia-sites.com closed.
        Signorelli IDE:~/project (main) $
    
    If you see the above message stating that there are no configuration changes in your newly installed ACSF site, that means you configured your codebase correctly.
    
3.  Pushing your changes to prod
    ----------------------------
    
    After you have tested your new codebase changes in your lower environments (test or dev) and created a new test site to make sure your codebase doesn’t generate any configuration differences, you should be ready to update the code in your prod environment.
    
    The prod environment is where you have all your live sites, that’s why it’s so important to test your new codebase changes thoroughly before you push a new codebase to your prod environment.
    
    Login to the ACSF Console UI of your prod environment and go to Administration -> Update code:
    
    ![Web interface showing "Administration" tab with "Code management and deployment" options, including "Update code" for site updates. Sidebar menu on the left.](https://acquia.widen.net/content/111bd95a-c94b-4a63-84ed-ed352e13ff78/web/url_6aa07f6148a21e4fef7bf2bbc9285ae3.png)
    
    In the Site Update page, use the dropdown to select your new codebase (**1.0.2-d10acsf**):
    
    ![Acquia Site Factory interface showing site update options, including start time and site update actions, with a dropdown menu highlighted.](https://acquia.widen.net/content/8e5159fe-6507-4cfb-a41f-d86518b9e4f3/web/url_e4df6fa10638902be2008d2b20ea38dc.png)
    
    Click the Update button and wait until the update process finishes:
    
    ![Wait until the update process finishes.](https://acquia.widen.net/content/7fe32aa3-c790-47a2-a452-196ca7cbd326/web/url_0b16f14cb208eb38d2d9116098f3133f.png)
    
    ### Check the changes in your existing ACSF sites
    
    After you pushed your new codebase to the test environment and updated all the existing sites in there, you should always check that the changes were applied successfully to your sites.
    
4.  Restart your Cloud IDE workspace using your repository
    ------------------------------------------------------
    
    In this last section, I will explain how to restart your Cloud IDE development workspace using your repository with all your latest codebase changes.
    
    ### Reset your workspace
    
    Go to your Cloud IDE instance, open the Get Started page (Help -> Get Started), and click the “Reset workspace” button:
    
    ![Webpage interface for creating a new site, showing fields for site name and URL, with a "Create Site" button.](https://acquia.widen.net/content/6f09bcbc-b289-4fa5-b447-e8160274a238/web/url_d3d759ff20fa9f93f3541f5eeb6882bf.png)
    
    You can also execute the following command to restart your Cloud IDE workspace:
    
        /ide/reset-workspace.py
    
    Respond “y” to the prompt to execute the reset-workspace.py script:
    
        Signorelli IDE:~/project (main) $ /ide/reset-workspace.py
        This will reset the '/home/ide/project' workspace and 'drupal' database without an option to recover.
        Do you want to continue? [y/n] y
        ✓ The 'drupal' database is reset.
        ✓ The '/home/ide/project' workspace is reset.
        Signorelli IDE:~/project $ 
    
    ![Screenshot of Acquia Cloud IDE setup guide, featuring configuration instructions and terminal commands for resetting a Drupal development environment.](https://acquia.widen.net/content/a0b36678-48dd-41f8-8446-a7ba1251b373/web/url_4ff02781c8234ae891c8d33956b749ef.png)
    
    ### Clone your repository
    
    In your Cloud IDE, open a new terminal window and make sure you are inside the project folder:
    
        cd ~/project
    
    Clone your repository down using the following git command syntax:
    
        git clone YourRemoteRepositoryURL .
    
    Make sure to add the final period “.” so you clone your repository inside the project folder. Example:
    
        git clone https://github.com/astralmemories/d10acsf.git .
    
    ![Screenshot of Acquia Cloud IDE interface, showing a welcome message, configuration steps, and a terminal window with Git commands.](https://acquia.widen.net/content/1df20ad6-a63f-4e46-a114-0190d6c0cac9/web/url_e83e022b5276f27c58e9fbd76c85e5af.png)
    
    Execute "composer install" to generate the vendor folder with all the necessary dependencies:
    
        composer install
    
        Signorelli IDE:~/project (main) $ composer install
        Installing dependencies from lock file (including require-dev)
        Verifying lock file contents can be installed on current platform.
        Package operations: 158 installs, 0 updates, 0 removals
         - Installing cweagans/composer-patches (1.7.3): Extracting archive
        Gathering patches for root package.
        No patches supplied.
        Gathering patches for dependencies. This might take a minute.
         - Installing drupal/core-composer-scaffold (10.0.7): Extracting archive
         - Installing composer/installers (v2.2.0): Extracting archive
         - Installing symfony/polyfill-ctype (v1.27.0): Extracting archive
         - Installing symfony/yaml (v6.2.7): Extracting archive
         - Installing symfony/process (v6.2.8): Extracting archive
         - Installing symfony/polyfill-mbstring (v1.27.0): Extracting archive
         - Installing symfony/deprecation-contracts (v3.2.1): Extracting archive
         - Installing symfony/http-foundation (v6.2.8): Extracting archive
         - Installing psr/event-dispatcher (1.0.0): Extracting archive
         - Installing symfony/event-dispatcher-contracts (v3.2.1): Extracting archive
         - Installing symfony/event-dispatcher (v6.2.8): Extracting archive
         - Installing symfony/var-dumper (v6.2.8): Extracting archive
         - Installing psr/log (3.0.0): Extracting archive
         - Installing symfony/error-handler (v6.2.7): Extracting archive
         - Installing symfony/http-kernel (v6.2.8): Extracting archive
         - Installing psr/container (2.0.2): Extracting archive
         - Installing symfony/service-contracts (v3.2.1): Extracting archive
         - Installing symfony/filesystem (v6.2.7): Extracting archive
         - Installing symfony/var-exporter (v6.2.8): Extracting archive
         - Installing symfony/dependency-injection (v6.2.8): Extracting archive
         - Installing symfony/polyfill-intl-normalizer (v1.27.0): Extracting archive
         - Installing symfony/polyfill-intl-grapheme (v1.27.0): Extracting archive
         - Installing symfony/string (v6.2.8): Extracting archive
         - Installing symfony/console (v6.2.8): Extracting archive
         - Installing symfony/config (v6.2.7): Extracting archive
         - Installing symfony/polyfill-php81 (v1.27.0): Extracting archive
         - Installing symfony/polyfill-php80 (v1.27.0): Extracting archive
         - Installing symfony/finder (v6.2.7): Extracting archive
         - Installing composer/semver (3.3.2): Extracting archive
         - Installing acquia/drupal-environment-detector (1.6.0): Extracting archive
         - Installing zumba/amplitude-php (1.0.7): Extracting archive
         - Installing webmozart/assert (1.11.0): Extracting archive
         - Installing webmozart/path-util (2.3.0): Extracting archive
         - Installing twig/twig (v3.5.1): Extracting archive
         - Installing symfony/translation-contracts (v3.2.1): Extracting archive
         - Installing symfony/twig-bridge (v6.2.8): Extracting archive
         - Installing loophp/phposinfo (1.8.0): Extracting archive
         - Installing dflydev/dot-access-data (v3.0.2): Extracting archive
         - Installing grasmash/expander (3.0.0): Extracting archive
         - Installing grasmash/yaml-expander (3.0.2): Extracting archive
         - Installing grasmash/yaml-cli (3.1.0): Extracting archive
         - Installing psr/http-message (1.0.1): Extracting archive
         - Installing psr/http-client (1.0.1): Extracting archive
         - Installing ralouphie/getallheaders (3.0.3): Extracting archive
         - Installing psr/http-factory (1.0.1): Extracting archive
         - Installing guzzlehttp/psr7 (2.4.4): Extracting archive
         - Installing guzzlehttp/promises (1.5.2): Extracting archive
         - Installing guzzlehttp/guzzle (7.5.0): Extracting archive
         - Installing enlightn/security-checker (v1.10.0): Extracting archive
         - Installing webflo/drupal-finder (1.2.2): Extracting archive
         - Installing nikic/php-parser (v4.15.4): Extracting archive
         - Installing psy/psysh (v0.11.12): Extracting archive
         - Installing league/container (4.2.0): Extracting archive
         - Installing consolidation/config (2.1.2): Extracting archive
         - Installing consolidation/site-alias (4.0.0): Extracting archive
         - Installing consolidation/site-process (5.2.0): Extracting archive
         - Installing phootwork/lang (v3.2.1): Extracting archive
         - Installing phootwork/collection (v3.2.1): Extracting archive
         - Installing phpowermove/docblock (v4.0): Extracting archive
         - Installing consolidation/self-update (2.0.5): Extracting archive
         - Installing consolidation/output-formatters (4.2.3): Extracting archive
         - Installing consolidation/log (3.0.0): Extracting archive
         - Installing consolidation/annotated-command (4.7.1): Extracting archive
         - Installing consolidation/robo (4.0.3): Extracting archive
         - Installing consolidation/filter-via-dot-access-data (2.0.2): Extracting archive
         - Installing chi-teck/drupal-code-generator (2.6.2): Extracting archive
         - Installing drush/drush (11.5.1): Extracting archive
         - Installing symfony/validator (v6.2.8): Extracting archive
         - Installing symfony/serializer (v6.2.8): Extracting archive
         - Installing symfony/routing (v6.2.8): Extracting archive
         - Installing symfony/psr-http-message-bridge (v2.1.4): Extracting archive
         - Installing symfony/polyfill-iconv (v1.27.0): Extracting archive
         - Installing symfony/polyfill-php72 (v1.27.0): Extracting archive
         - Installing symfony/polyfill-intl-idn (v1.27.0): Extracting archive
         - Installing symfony/mime (v6.2.7): Extracting archive
         - Installing pear/pear_exception (v1.0.2): Extracting archive
         - Installing pear/console_getopt (v1.4.3): Extracting archive
         - Installing pear/pear-core-minimal (v1.10.11): Extracting archive
         - Installing pear/archive_tar (1.4.14): Extracting archive
         - Installing masterminds/html5 (2.7.6): Extracting archive
         - Installing doctrine/lexer (1.2.3): Extracting archive
         - Installing egulias/email-validator (3.2.5): Extracting archive
         - Installing psr/cache (3.0.0): Extracting archive
         - Installing doctrine/annotations (1.13.3): Extracting archive
         - Installing asm89/stack-cors (v2.1.1): Extracting archive
         - Installing drupal/core (10.0.7): Extracting archive
         - Installing consolidation/comments (1.0.2): Extracting archive
         - Installing acquia/blt (13.7.0): Extracting archive
         - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive
         - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
         - Installing phpstan/phpstan (1.10.10): Extracting archive
         - Installing oomphinc/composer-installers-extender (2.0.1): Extracting archive
         - Installing phpstan/extension-installer (1.2.0): Extracting archive
         - Installing symfony/http-client-contracts (v3.2.1): Extracting archive
         - Installing symfony/http-client (v6.2.8): Extracting archive
         - Installing stecman/symfony-console-completion (v0.12.0): Extracting archive
         - Installing symfony/polyfill-php73 (v1.27.0): Extracting archive
         - Installing seld/signal-handler (2.0.1): Extracting archive
         - Installing seld/phar-utils (1.2.1): Extracting archive
         - Installing seld/jsonlint (1.9.0): Extracting archive
         - Installing react/promise (v2.9.0): Extracting archive
         - Installing justinrainbow/json-schema (5.2.12): Extracting archive
         - Installing composer/pcre (3.1.0): Extracting archive
         - Installing composer/xdebug-handler (3.0.3): Extracting archive
         - Installing composer/spdx-licenses (1.5.7): Extracting archive
         - Installing composer/metadata-minifier (1.0.0): Extracting archive
         - Installing composer/class-map-generator (1.0.0): Extracting archive
         - Installing composer/ca-bundle (1.3.5): Extracting archive
         - Installing composer/composer (2.5.4): Extracting archive
         - Installing acquia/acquia-cms-starterkit (1.0.9): Extracting archive
         - Installing drupal/acsf (2.73.0): Extracting archive
         - Installing drupal/acsf_variables (2.73.0)
         - Installing drupal/acsf_theme (2.73.0)
         - Installing drupal/acsf_duplication (2.73.0)
         - Installing acquia/blt-acsf (v1.1.0): Extracting archive
         - Installing phpstan/phpdoc-parser (1.15.3): Extracting archive
         - Installing slevomat/coding-standard (8.8.0): Extracting archive
         - Installing phpcompatibility/php-compatibility (9.3.5): Extracting archive
         - Installing sirbrillig/phpcs-variable-analysis (v2.11.10): Extracting archive
         - Installing drupal/coder (8.3.17): Extracting archive
         - Installing acquia/coding-standards (v2.0.0): Extracting archive
         - Installing drupal/memcache (2.5.0): Extracting archive
         - Installing acquia/memcache-settings (v1.2.0): Extracting archive
         - Installing drupal/config_filter (1.10.0): Extracting archive
         - Installing drupal/config_ignore (2.4.0): Extracting archive
         - Installing drupal/config_split (1.9.0): Extracting archive
         - Installing drupal/core-recommended (10.0.7)
         - Installing drupal/shield (1.7.0): Extracting archive
         - Installing mglaman/phpstan-drupal (1.1.29): Extracting archive
         - Installing phpstan/phpstan-deprecation-rules (1.1.3): Extracting archive
         - Installing sebastian/version (3.0.2): Extracting archive
         - Installing sebastian/type (3.2.1): Extracting archive
         - Installing sebastian/resource-operations (3.0.3): Extracting archive
         - Installing sebastian/recursion-context (4.0.5): Extracting archive
         - Installing sebastian/object-reflector (2.0.4): Extracting archive
         - Installing sebastian/object-enumerator (4.0.4): Extracting archive
         - Installing sebastian/global-state (5.0.5): Extracting archive
         - Installing sebastian/exporter (4.0.5): Extracting archive
         - Installing sebastian/environment (5.1.5): Extracting archive
         - Installing sebastian/diff (4.0.4): Extracting archive
         - Installing sebastian/comparator (4.0.8): Extracting archive
         - Installing sebastian/code-unit (1.0.8): Extracting archive
         - Installing sebastian/cli-parser (1.0.1): Extracting archive
         - Installing phpunit/php-timer (5.0.3): Extracting archive
         - Installing phpunit/php-text-template (2.0.4): Extracting archive
         - Installing phpunit/php-invoker (3.1.1): Extracting archive
         - Installing phpunit/php-file-iterator (3.0.6): Extracting archive
         - Installing theseer/tokenizer (1.2.1): Extracting archive
         - Installing sebastian/lines-of-code (1.0.3): Extracting archive
         - Installing sebastian/complexity (2.0.2): Extracting archive
         - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
         - Installing phpunit/php-code-coverage (9.2.26): Extracting archive
         - Installing phar-io/version (3.2.1): Extracting archive
         - Installing phar-io/manifest (2.0.3): Extracting archive
         - Installing myclabs/deep-copy (1.11.1): Extracting archive
         - Installing doctrine/instantiator (2.0.0): Extracting archive
         - Installing phpunit/phpunit (9.6.6): Extracting archive
        Package webmozart/path-util is abandoned, you should avoid using it. Use symfony/filesystem instead.
        Generating autoload files
        85 packages you are using are looking for funding.
        Use the `composer fund` command to find out more!
        PHP CodeSniffer Config installed_paths set to ../../acquia/coding-standards/src/Standards,../../drupal/coder/coder_sniffer,../../phpcompatibility/php-compatibility,../../sirbrillig/phpcs-variable-analysis,../../slevomat/coding-standard
        Scaffolding files for drupal/core:
         - Copy [project-root]/.editorconfig from assets/scaffold/files/editorconfig
         - Copy [project-root]/.gitattributes from assets/scaffold/files/gitattributes
         - Copy [web-root]/.csslintrc from assets/scaffold/files/csslintrc
         - Copy [web-root]/.eslintignore from assets/scaffold/files/eslintignore
         - Copy [web-root]/.eslintrc.json from assets/scaffold/files/eslintrc.json
         - Copy [web-root]/.ht.router.php from assets/scaffold/files/ht.router.php
         - Skip [web-root]/.htaccess: overridden in acquia/drupal-recommended-project
         - Copy [web-root]/example.gitignore from assets/scaffold/files/example.gitignore
         - Copy [web-root]/index.php from assets/scaffold/files/index.php
         - Copy [web-root]/INSTALL.txt from assets/scaffold/files/drupal.INSTALL.txt
         - Copy [web-root]/README.md from assets/scaffold/files/drupal.README.md
         - Copy [web-root]/robots.txt from assets/scaffold/files/robots.txt
         - Copy [web-root]/update.php from assets/scaffold/files/update.php
         - Copy [web-root]/web.config from assets/scaffold/files/web.config
         - Copy [web-root]/sites/README.txt from assets/scaffold/files/sites.README.txt
         - Copy [web-root]/sites/development.services.yml from assets/scaffold/files/development.services.yml
         - Copy [web-root]/sites/example.settings.local.php from assets/scaffold/files/example.settings.local.php
         - Copy [web-root]/sites/example.sites.php from assets/scaffold/files/example.sites.php
         - Copy [web-root]/modules/README.txt from assets/scaffold/files/modules.README.txt
         - Copy [web-root]/profiles/README.txt from assets/scaffold/files/profiles.README.txt
         - Copy [web-root]/themes/README.txt from assets/scaffold/files/themes.README.txt
        Updating BLT template files...
        > blt blt:update --ansi --no-interaction
        phpstan/extension-installer: Extensions installed
        > composer/composer: installed
        > mglaman/phpstan-drupal: installed
        > phpstan/phpstan-deprecation-rules: installed
        Signorelli IDE:~/project (main) $
    
    ### Install a new site with BLT
    
    Now you should be able to install a new site using the existing configuration on disk:
    
        blt setup --no-interaction
    
    ![Terminal screenshot showing installation logs and commands for Drupal and Drush tasks, including configuration imports and status messages.](https://acquia.widen.net/content/0b857210-71e1-4cef-8641-2dd6bc94251a/web/url_81103dc2d6b7abe45dfc151226db065c.png)
    
    You should have no configuration differences between the new site’s database and the existing configuration on disk:
    
        drush config:status
    
        Signorelli IDE:~/project (main *) $ drush config:status
        [notice] No differences between DB and sync directory.
    
    Try to access your new Cloud IDE with “drush uli”:
    
        drush uli
    
    If you get the following error message, it’s probably because you are missing the .htaccess file from the docroot folder:
    
    !["Error message: 'Not Found'. The requested URL was not found on this server. Apache/2.4.41 (Ubuntu) server details included."](https://acquia.widen.net/content/f7fa5fb6-c4f4-45ac-afc6-44138dfcbb13/web/url_69ec4da1e1450f06939a2b7e134c5b47.png)
    
    Look inside your docroot folder:
    
        Signorelli IDE:~/project/docroot (main) $ ls -lA
        total 72
        -rw-r--r-- 1 ide ide 315 Apr 6 13:21 autoload.php
        drwxr-xr-x 12 ide ide 4096 Mar 24 16:45 core
        -rw-r--r-- 1 ide ide 1025 Apr 6 09:44 .csslintrc
        -rw-r--r-- 1 ide ide 151 Apr 6 09:44 .eslintignore
        -rw-r--r-- 1 ide ide 41 Apr 6 09:44 .eslintrc.json
        -rw-r--r-- 1 ide ide 1495 Apr 6 09:44 example.gitignore
        -rw-r--r-- 1 ide ide 173 Apr 6 09:32 .gitignore
        -rw-r--r-- 1 ide ide 2471 Apr 6 09:44 .ht.router.php
        -rw-r--r-- 1 ide ide 549 Apr 6 09:44 index.php
        -rw-r--r-- 1 ide ide 94 Apr 6 09:44 INSTALL.txt
        drwxr-xr-x 4 ide ide 4096 Apr 6 09:44 modules
        drwxr-xr-x 4 ide ide 4096 Apr 6 09:44 profiles
        -rw-r--r-- 1 ide ide 3205 Apr 6 09:44 README.md
        -rw-r--r-- 1 ide ide 1706 Apr 6 09:44 robots.txt
        drwxr-xr-x 5 ide ide 4096 Apr 6 09:44 sites
        drwxr-xr-x 3 ide ide 4096 Apr 6 09:44 themes
        -rw-r--r-- 1 ide ide 804 Apr 6 09:44 update.php
        -rw-r--r-- 1 ide ide 4039 Apr 6 09:44 web.config
        Signorelli IDE:~/project/docroot (main) $ 
    
    Open the .gitignore file located inside the docroot folder, you should see that the .htaccess file is listed to be ignored:
    
    ![Visual Studio Code interface showing a file explorer, open `.gitignore` file, and terminal with directory listing. A red arrow points to `INSTALL.txt`.](https://acquia.widen.net/content/5342d837-d9a8-4248-8d6b-6a8bc1d76c52/web/url_619a9cf796d9ad9193860081b7831156.png)
    
    Remove the docroot/.gitignore file:
    
        rm /home/ide/project/docroot/.gitignore 
    
    Copy the htaccess file that’s located inside the project/docroot/core/assets/scaffold/files/ folder to the docroot folder as .htaccess:
    
        cp /home/ide/project/docroot/core/assets/scaffold/files/htaccess /home/ide/project/docroot/.htaccess
    
    Go back to the project folder and clear Drupal’s cache:
    
        cd ~/project
        drush cr
    
    Try to access your new Cloud IDE with “drush uli”:
    
        drush uli
    
    With the new **.htaccess** file you should be able to access the site without errors:
    
    ![API tool interface showing a DELETE request with X-CSRF-Token in headers, including key-value pairs for authorization.](https://acquia.widen.net/content/677288b2-2ebd-43dd-9d6d-6db6682e9d34/web/url_576ecca397c25da99dcc09229979b5be.png)
    
    ### Copy a site from ACSF to Cloud IDE with BLT
    
    Edit your **blt/blt.yml** file and modify the value of the drush -> aliases -> remote key with the ACSF website that you wish to copy down to your Cloud IDE, for this tutorial, I will use the **site2.01test** site:
    
        project:
         machine_name: d10acsf
         profile:
         name: acsfprofile
         prefix: BLT
        cloud:
         appId: 48efba74-75af-43ef-8455-32e6f043c375
        git:
         default_branch: master
         remotes:
         cloud: '[email protected]:acquiatam2.git'
        deploy:
         tag_source: true
        drush:
         aliases:
         remote: site2.01test  local: self
         ci: self
         default_alias: '${drush.aliases.local}'
    
    Save your changes.
    
    Copy the database from the remote site stipulated in your blt/blt.yml file with the following BLT command:
    
        blt drupal:sync:db
    
    If you want to pull down the assets, execute the following drush command:
    
    [https://docs.acquia.com/cloud-platform/manage/files/transfer-files/rsync/](/node/56358)
    
        drush rsync @site2.01test:%files docroot/sites/default/files
    
    “site2” is the alias of an existing site and “.01test” is the environment where that site lives.
    
        Signorelli IDE:~/project (main *) $ drush rsync @site2.01test:%files docroot/sites/default/files
        Copy new and override existing files at docroot/sites/default/files. The source is acquiatam2.01test@acquiatam201test.ssh.enterprise-g1.acquia-sites.com:/var/www/html/acquiatam2.01test/docroot/sites/g/files/utfjsx5000431test/files/? (yes/no) [yes]:
        > yes
        Signorelli IDE:~/project (main *) $
    
    Clear the cache of your new cloned site:
    
        drush cr
    
    Open your local Cloud IDE website to see your new cloned site. On the Menu, navigate to “Manage Drupal Application” -> “Open Drupal Application”:
    
    ![IDE interface showing a file explorer with project files and a menu option to "Open Drupal Application."](https://acquia.widen.net/content/57a710e8-07c9-46c1-b4f1-e2e4ab2606b4/web/url_df6df0859a069990e7fbc8d1d8849ead.png)
    
    Because we cloned the “site2” site, we should see the Shield module username and password prompt as we previously activated and configured the Shield module on the “site2” ACSF site:
    
    ![Dark sign-in page with fields for username and password, warning about non-private connection. Buttons for "Cancel" and "Sign in" are visible.](https://acquia.widen.net/content/f063df1c-0b22-4424-8daf-701740558255/web/url_a629cb6a8c87aca0b47bee60e9aaa366.png)
    
    In my case, my shield credentials for site2 is **admin** and **pass123**:
    
    ![Drupal 10 site welcome page, inviting users to the community. Features a brief description of Drupal's open-source platform and collaborative values.](https://acquia.widen.net/content/40043d1d-33a6-4b52-b1bb-ea548a14ef8f/web/url_d6668a3034f8d09da4d78d23603472d3.png)
    
    Access your new cloned site with “drush uli”:
    
        drush uli
    
    Make sure everything looks fine. It’s always a good idea to check for configuration differences:
    
        Signorelli IDE:~/project (main *) $ drush cex
        [notice] The active configuration is identical to the configuration in the export directory (/home/ide/project/config/default).
        /home/ide/project/config/default
        Signorelli IDE:~/project (main *) $ drush config:status
        [notice] No differences between DB and sync directory.
        Signorelli IDE:~/project (main *) $
    
    Push your new codebase changes to your repository which includes the new **.htaccess** file in your docroot folder. The next time you restart your Cloud IDE workspace using your repository it shouldn't fail due to the missing **.htaccess** file.
    
    First, execute the following BLT command to download and extract the updated Acquia Cloud Site Factory Connector:
    
    [https://docs.acquia.com/site-factory/workflow/deployments/acsf-init/#executing-acsf-init-after-module-or-drupal-core-updates](/node/57356)
    
        blt recipes:acsf:init:drush
    
    Commit and push your codebase changes to your repository:
    
        git add -A
        git commit -m "BLT-005: Removed .gitignore and added a new .htaccess."
        git push
    

Congratulations on successfully completing this three-step guide! First, we navigated through the process of creating a new Drupal 10 codebase that is configured for ACSF. Then, we created a custom Drupal installation profile. And in this last phase, we went through a detailed explanation of configuration management and deployment workflow on Site Factory. I sincerely hope you found this guide helpful.