One place for hosting & domains

      January 2023

      Secrets Management with Ansible


      Ansible stands out for its capabilities in automating server provisioning and management. Ansible’s playbooks, its ability to group and organize resources, and numerous other features make it a great asset for administering servers.

      However, Ansible’s operations often necessitate that your playbooks leverage secrets like server passwords, access tokens, and API keys.

      To bring security to the convenience of your Ansible setup, you should use a secrets management process. Secrets management continues to let Ansible automate your server tasks, with all the access it needs. At the same time, secrets management keeps your secrets safely out of plain text files and other vulnerable locations.

      In this tutorial, learn the most useful methods for implementing secrets management with your Ansible setup. The tutorial covers a range of methods, from simple to scalable, and helps you choose the right fit.

      Before You Begin

      1. If you have not already done so, create a Linode account. See our Getting Started with Linode guide.

      2. Follow our guide on Getting Started With Ansible: Basic Installation and Setup. Specifically, follow the sections on setting up a control node and managed nodes, configuring Ansible, and creating an Ansible inventory.

      3. Refer to our guide Automate Server Configuration with Ansible Playbooks for an overview of Ansible playbooks and their operations.

      Secrets in Ansible

      A secret refers to a key or other credential that allows access to a resource or system. Secrets include things like access tokens, API keys, and database & system passwords.

      When managing nodes with Ansible, you often need to provide it with secrets. Typically, you can provide these secrets within Ansible playbooks, but doing so exposes them to possible interception and exploitation.

      To secure your secrets, you should implement secrets management with your Ansible playbooks. Secrets management refers to the ways in which secrets are stored safely, with different methods balancing between accessibility and security.

      Managing Secrets in Ansible

      Several options exist for managing secrets with your Ansible playbooks. The option that fits your needs depends on your particular setup. How accessible you need your secrets to be and how secure you want to make them determine which solutions work best for you.

      The upcoming sections outline some of the most useful options for managing secrets with Ansible. These attempt to cover a range of use cases, from interactive and manual, to automated and integrated.

      All of the examples that follow use an Ansible setup with one control node and two managed nodes. The managed nodes are given the example IP addresses 192.0.2.1 and 192.0.2.2 throughout, and are listed in an ansiblenodes group in the control node’s Ansible inventory.

      Using Prompts to Manually Enter Secrets

      Ansible playbooks include the option to prompt users for variables. This is actually an option for managing secrets within your Ansible setup.

      With this option, you configure your Ansible playbook to prompt users to manually input secrets. The secrets never need to be persisted on the system, allowing you to safeguard them otherwise. This method is the easiest of the options covered here.

      Of course, this option comes with some significant drawbacks. By not storing the secrets, you also prevent Ansible from accessing them automatically, reducing the ability to integrate your playbooks into automated processes. Additionally, leaving the secrets to manual entry introduces its own risks, as users can mishandle secrets.

      Here is an example Ansible playbook from our Automate Server Configuration with Ansible Playbooks guide. This playbook adds a new non-root user to the managed nodes.

      The playbook uses the vars_prompt option to prompt the user to input a password for the new user. Ansible then hashes the password and deploys the new user to each of the managed nodes.

      Note

      This playbook assumes you have an SSH public key on your control node. The public key allows for secure passwordless connections to the new user in the future. Learn more in our guide Using SSH Public Key Authentication.

      This tutorial also assumes that your control node’s SSH key is secured by a password, and hence uses the --ask-pass option in some of the Ansible playbook commands below. If your SSH key is not secured by a password, remove the --ask-pass option from the Ansible playbook commands shown in this tutorial.

      File: add_limited_user.yml
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      ---
      - hosts: ansiblenodes
        remote_user: root
        vars:
          limited_user_name: 'example-user'
        vars_prompt:
          - name: limited_user_password
            prompt: Enter a password for the new non-root user
        tasks:
          - name: "Create a non-root user"
            user: name={{ limited_user_name }}
                  password={{ limited_user_password | password_hash }}
                  shell=/bin/bash
          - name: Add an authorized key for passwordless logins
            authorized_key: user={{ limited_user_name }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          - name: Add the new user to the sudoers list
            lineinfile: dest=/etc/sudoers
                        regexp="{{ limited_user_name }} ALL"
                        line="{{ limited_user_name }} ALL=(ALL) ALL"
                        state=present

      To run the playbook, first make sure you’re in the same directory as the playbook, then execute the following command:

      Ansible Control Node

      ansible-playbook --ask-pass add_limited_user.yml

      Ansible prompts for the SSH password first, then for a password for the new user. The output should resemble what is shown below:

      SSH password:
      Enter a password for the new non-root user:
      
      PLAY [ansiblenodes] ************************************************************
      
      TASK [Gathering Facts] *********************************************************
      ok: [192.0.2.2]
      ok: [192.0.2.1]
      
      TASK [Create a non-root user] **************************************************
      changed: [192.0.2.1]
      changed: [192.0.2.2]
      
      TASK [Add remote authorized key to allow future passwordless logins] ***********
      ok: [192.0.2.1]
      ok: [192.0.2.2]
      
      TASK [Add normal user to sudoers] **********************************************
      ok: [192.0.2.1]
      ok: [192.0.2.2]
      
      PLAY RECAP *********************************************************************
      192.0.2.1              : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
      192.0.2.2              : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

      Using the Ansible Vault to Manage Secrets

      Ansible has a tool, Ansible Vault, that can facilitate secrets management. The Vault encrypts information, which you can then use within your Ansible playbooks.

      With some setup, Ansible Vault can make secrets both secure and accessible. Secrets are encrypted, meaning that no one can get to them without your password. The secrets are, at the same time, made accessible to Ansible. A password file can give Ansible everything it needs to run in an automated setup.

      The vault password can either be entered manually or automatically through a password file. You can even use an external password manager, and implement a script or other solution to retrieve the password.

      This example of Ansible Vault deploys rclone to the managed nodes and configures it to connect to a Linode Object Storage instance. The secrets are the access keys for the object storage instance.

      To follow along, you need to set up a Linode Object Storage instance with access keys and at least one bucket. You can learn how to do so in our guide Object Storage – Get Started.

      1. Create a file with the access keys for your Linode Object Storage instance. You can do so with the following command, just replace the text in arrow brackets with your corresponding object storage keys:

        Ansible Control Node

        echo "s3_access_token: <S3_ACCESS_TOKEN>" > s3_secrets.enc
        echo "s3_secret_token: <S3_SECRET_TOKEN>" >> s3_secrets.enc
        ansible-vault encrypt s3_secrets.enc

        Ansible Vault prompts you to create a vault password before encrypting the file’s contents.

        New Vault password:
        Confirm New Vault password:
        Encryption successful
      2. Create a password file in the same directory you intend to create the Ansible playbook in. The file needs to contain only the password for your encrypted secrets file. The example in this next command assumes your password is examplepassword:

        Ansible Control Node

        echo "examplepassword" > example.pwd
      3. Create a new Ansible playbook with the following contents. This playbook connects to the non-root users created using the playbook in the previous section of this tutorial. The playbook then installs rclone and creates a configuration file for it. The playbook also inserts the access keys from the s3_secrets.enc file into the configuration file.

        File: set_up_rclone.yml
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        
        ---
        - hosts: ansiblenodes
          remote_user: 'example-user'
          become: yes
          become_method: sudo
          vars:
            s3_region: 'us-southeast-1'
          tasks:
            - name: "Install rclone"
              apt:
                pkg:
                  - rclone
                state: present
                update_cache: yes
            - name: "Create the directory for the rclone configuration"
              file:
                path: "/home/example-user/.config/rclone"
                state: directory
            - name: "Create the rclone configuration file"
              copy:
                dest: "/home/example-user/.config/rclone/rclone.conf"
                content: |
                  [linodes3]
                  type = s3
                  env_auth = false
                  acl = private
                  access_key_id = {{ s3_access_token }}
                  secret_access_key = {{ s3_secret_token }}
                  region = {{ s3_region }}
                  endpoint = {{ s3_region }}.linodeobjects.com          
      4. Run the Ansible playbook. The playbook command here adds the variables from the secrets file using the -e option, and gets the password for decrypting them from the --vault-password-file. The --ask-become-pass option has Ansible prompt for the limited user’s sudo password.

        Ansible Control Node

        ansible-playbook -e @s3_secrets.enc --vault-password-file example.pwd --ask-pass --ask-become-pass set_up_rclone.yml

        The result should resemble:

        SSH password:
        BECOME password[defaults to SSH password]:
        
        PLAY [ansiblenodes] ************************************************************
        
        TASK [Gathering Facts] *********************************************************
        ok: [192.0.2.2]
        ok: [192.0.2.1]
        
        TASK [Install rclone] **********************************************************
        changed: [192.0.2.1]
        changed: [192.0.2.2]
        
        TASK [Create the directory for the rclone configuration] ***********************
        changed: [192.0.2.2]
        changed: [192.0.2.1]
        
        TASK [Create the rclone configuration file] ************************************
        changed: [192.0.2.2]
        changed: [192.0.2.1]
        
        PLAY RECAP *********************************************************************
        192.0.2.1              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
        192.0.2.2              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
      5. To verify that everything is working as expected, log into either of the managed nodes as the non-root user. Then use the following command to list the buckets on your Linode Object Storage instance:

        Ansible Managed Node

        You should see something like the following for each bucket, where ansible-test-bucket is the name of the bucket:

        -1 2022-12-08 00:00:00        -1 ansible-test-bucket

      Using a Secrets Manager

      Dedicated solutions exist for managing secrets, and many password managers are capable of doing so for your Ansible playbooks. In terms of their underlying methods, many of these tools function similarly to Ansible Vault. Despite being external tools, several are supported by official or community plugins for Ansible.

      The primary advantage of an external secrets management solution is using a tool already adopted more widely among your team or organization. Ansible Vault may offer a default integration with Ansible, but you are not likely using it more widely for password management within your organization.

      One of the more popular solutions for secret management is HashiCorp’s Vault. HashiCorp’s Vault is a centralized secrets management system with a dynamic infrastructure to keep passwords, keys, and other secrets secure.

      Ansible maintains a plugin for interacting with HashiCorp’s Vault, the hashi_vault plugin.

      The following steps walk you through an example using HashiCorp’s Vault with Ansible. The example accomplishes the same ends as the example in the previous section, so you can more easily compare the two.

      1. Follow along with our guide on Setting Up and Using a Vault Server. By the end, you should have HashiCorp’s Vault installed, a vault server running and unsealed, and be logged into the vault.

      2. Ensure that the key-value (kv) engine is enabled for the secret path:

        Vault Server

        vault secrets enable -path=secret/ kv
        Success! Enabled the kv secrets engine at: secret/
      3. Add the access keys for your Linode Object Storage instance to the secret/s3 path in the vault. Replace the text in arrow brackets below with your corresponding keys:

        Vault Server

        vault kv put secret/s3 s3_access_token=<S3_ACCESS_TOKEN> s3_secret_token=<S3_SECRET_TOKEN>
        Success! Data written to: secret/s3
      4. On your Ansible control node, install hvac via pip in order to use the hashi_vault plugin referenced in the Ansible playbook below.

        Ansible Control Node

      5. Create a new Ansible playbook with the contents shown below. This parallels the playbook built in the previous section, which installs and configures rclone to connect to a Linode Object Storage instance. This version simply fetches the secrets from a HashiCorp vault instead of an Ansible vault:

        Replace both instances of <HASHI_VAULT_IP> below with the IP address for your HashiCorp Vault server. Similarly, replace both instances of <HASHI_VAULT_TOKEN> with your login token for the HashiCorp Vault server.

        File: another_rclone_setup.yml
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        
        ---
        - hosts: ansiblenodes
          remote_user: 'example-user'
          become: yes
          become_method: sudo
          vars:
            s3_region: 'us-southeast-1'
          tasks:
            - name: "Install rclone"
              apt:
                pkg:
                  - rclone
                state: present
                update_cache: yes
            - name: "Create the directory for the rclone configuration"
              file:
                path: "/home/example-user/.config/rclone"
                state: directory
            - name: "Create the rclone configuration file"
              copy:
                dest: "/home/example-user/.config/rclone/rclone.conf"
                content: |
                  [linodes3]
                  type = s3
                  env_auth = false
                  acl = private
                  access_key_id = {{ lookup('hashi_vault', 'secret=secret/s3:s3_access_token token=<HASHI_VAULT_TOKEN> url=http://<HASHI_VAULT_IP>:8200')}}
                  secret_access_key = {{ lookup('hashi_vault', 'secret=secret/s3:s3_secret_token token=<HASHI_VAULT_TOKEN> url=http://<HASHI_VAULT_IP>:8200')}}
                  region = {{ s3_region }}
                  endpoint = {{ s3_region }}.linodeobjects.com          
      6. Run the Ansible playbook, providing the appropriate passwords when prompted:

        Ansible Control Node

        ansible-playbook --ask-pass --ask-become-pass another_rclone_setup.yml

        The result should resemble:

        SSH password:
        BECOME password[defaults to SSH password]:
        
        PLAY [ansiblenodes] ********************************************************
        
        TASK [Gathering Facts] *****************************************************
        ok: [192.0.2.2]
        ok: [192.0.2.1]
        
        TASK [Install rclone] ******************************************************
        changed: [192.0.2.2]
        changed: [192.0.2.1]
        
        TASK [Create the directory for the rclone configuration] *******************
        changed: [192.0.2.2]
        changed: [192.0.2.1]
        
        TASK [Create the rclone configuration file] ********************************
        changed: [192.0.2.1]
        changed: [192.0.2.2]
        
        PLAY RECAP *****************************************************************
        192.0.2.1              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
        192.0.2.2              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
      7. Just like the previous section, you can verify the setup by logging into one of the managed nodes and running an rclone ls command, such as rclone lsd linodes3:.

      Conclusion

      You now have some options to ensure that your Ansible setup has secure secrets. Choosing between these options comes down to scale and accessibility. Manual entry is simple to start with, but only suits smaller projects and teams. Ansible Vault is in many ways ideal, but an external solution may better fit your team and organization.

      To keep learning about Ansible and efficiently automating your server tasks, read more of our guides on Ansible.

      More Information

      You may wish to consult the following resources for additional information
      on this topic. While these are provided in the hope that they will be
      useful, please note that we cannot vouch for the accuracy or timeliness of
      externally hosted materials.



      Source link

      API v4.142.1



      Changed Linode Clone (POST /linode/instances/{linodeId}/clone)
      Cloned Linodes can now be created with an assigned private IPv4 address when cloning to a new Linode.



      Source link

      How to Create an Eye-Catching Photography Portfolio Website (In 4 Steps)


      Photography is a popular and engaging hobby, especially with the variety and convenience of advanced camera options. Whether you’re into dark rooms and film or high-end digital lenses, turning your photography hobby into an online business might be on your radar.

      That’s where WordPress and the time-saving functionality of website builders come in. When you combine the content management options of WordPress with drag-and-drop site design capability, it’s easy to turn your big ideas into a professional photography site.

      This article will cover four steps for creating a photography website with WordPress. So take that lens cap off your camera, friend, and let’s get started!

      Why You Should Consider Starting a Photography Portfolio Website

      As a photographer, it’s worth sharing your work online on a portfolio website. This site will serve as a collection of your different photos in one place, advertising your skills to a wide range of users.

      Although you may be tempted to use social media to build your photography business, it can help to have a dedicated website for your brand. Along with showcasing your beautiful images, you’ll be able to add a contact form. This is an easy way for prospective clients to get in touch:

      Photography website contact form

      Plus, you can organize your website into different galleries. For example, wedding photographers might want to add photo collections for specific couples:

      Photography portfolio galleries

      A website can also be a great place to showcase your personal style. If your work is colorful and bright, you could display the same qualities in your graphic design. A well-designed landing page can even increase leads and conversions:

      Photography portfolio landing page

      Without a website, you may struggle to connect with new clients. Ultimately, it’ll be more difficult to advertise and distribute your services. Therefore, when you’re ready to grow your business, you’ll want to create an online portfolio.

      3 Tips for Building Your Photography Portfolio Website

      Building a site can be a daunting task. To help you get started, here are a few tips to create the best photography portfolio website!

      1. Stick to Your Brand

      One of the first steps in designing a photography website is determining your style or niche. Whatever your focus might be, knowing it ahead of time will help you create your site and target your specific audience. With this in mind, take a few minutes to set some goals for your site and then write them down.

      Since there are many photographers, you’ll want your website to have some personality. By defining your brand niche, you can tell visitors why you’re the best option for their needs.

      For example, Jenn Emerling is a professional photographer specializing in destination weddings. Instead of being a standard, run-of-the-mill wedding photographer, she defines herself as an “artist who happens to shoot weddings”:

      Jenn Emerling photography portfolio website

      Her vibrant, multi-colored website, powered by WordPress and DreamHost, has proven to be a huge success. By focusing on her unique approach, Jenn was able to attract dream clients while reflecting her authentic artistic voice.

      2. Highlight Your Best Work

      When creating an online portfolio, your photos should be the center of attention. Since you’re a unique photographer, your website will also have a custom layout and web design. However, make sure that this structure properly highlights your work.

      At the very least, you should have a dedicated page for your portfolio. Although you may be tempted to include hundreds of photos for prospective clients to browse, it’s better to showcase 10-20 of your best pieces.

      If you’re having trouble narrowing down your work, consider diversifying your portfolio. You’ll want visitors to immediately understand your main niche without displaying the same type of photo over and over. Alternatively, you can also browse competitors’ portfolios to see their images, as well as any holes that you can fill.

      3. Use the Right Content Management System

      Although options like Adobe Portfolio are designed explicitly for creating portfolio websites, we’d recommend a more versatile platform.

      Since it powers over 30% of all websites, WordPress is the most popular Content Management System (CMS). It is a flexible software that can give anyone full control over their online presence:

      WordPress website

      Outside of those numbers, WordPress’s practical, open-source software is another reason we suggest it for a photography portfolio website. You can find thousands of free themes and plugins in its directories to extend your site. Whether you need to build an image gallery or contact form, WordPress can help you create a truly unique website for your photography business.

      One more plus? WordPress software is free. You can afford to run a self-hosted website even as a brand-new photographer.

      Get Content Delivered Straight to Your Inbox

      Subscribe to our blog and receive great content just like this delivered straight to your inbox.

      How to Create an Eye-Catching Photography Portfolio Website (In 4 Steps)

      Once you’ve defined your niche and collected some of your best photographs, it’s time to build your website. Fortunately, we’re here to guide you through setting up and designing a site with WordPress!

      Step 1: Choose Your Domain Name and Web Host

      No matter what website you build, a good first step is finding a hosting provider. Essentially, web hosts give you the server space and resources you need to store and grow your site online.

      Although choosing a web host might seem overwhelming at first, there are a few features you can look for:

      • Storage: If you plan on using the same host for your website and photos, you’ll want to investigate the amount of available storage. There may even be additional storage as an add-on to handle your larger, high-quality images.
      • Software: You’ll also want to consider whether you need a one-click solution to get started with WordPress. This is an excellent option for beginners who don’t want to hire a developer.
      • Support: The last thing you want is for your clients to be unable to access your site while trying to view your photos. Make sure your web host has 24/7 support and provides a downtime guarantee. You’ll also want to read up on its site backup and restoration options in case something happens.
      • Extras: Some hosts come with extra features you might want to consider. These include premium themes, plugins, staging sites, or website builders that can streamline your design process.

      No matter what type of hosting you ultimately decide you need, here at DreamHost, we offer a wide range of WordPress plans. Each package comes with a free SSL certificate, automated backups, and a free domain name. Plus, we’ll automatically install WordPress for you:

      DreamHost WordPress hosting

      Once you’ve signed up for a hosting plan, you’ll be able to register a domain name. This is the web address that potential clients will use to find your portfolio:

      DreamHost domain name registration

      Most photographers choose to include their full names within their domain. Alternatively, you can incorporate target keywords for your niche if your name is already taken. For example, Jenn Emerling is a wedding photographer, so her URL is ‘jennemerlingweddings.com’.

      Step 2: Install a Dedicated Photography Theme

      Installing a theme enables you to customize the look of your WordPress site. What’s more, it’s as easy as uploading a file or clicking a button. There are a lot of photography themes out there, however, so deciding which one is best for you might be the hardest part.

      If you’re using DreamHost as your WordPress hosting service, you’ll have access to our Website Builder. As a photographer, you can drag and drop elements in a front-end view of your website. In addition, you’ll be able to choose from photography-specific custom templates and view your changes live as you make them.

      Getting started is easy. You simply need to select “WP Website Builder” as an option when purchasing your DreamHost plan:

      Enable DreamHost Website Builder

      Once you’ve completed your purchase with the website builder selected, sign in to WordPress. You’ll see a new Inspirations tab once you visit your dashboard. This will take you to a setup page:

      DreamHost website builder

      Next, you’ll be able to choose from a menu of theme categories. Our website builder contains many photography themes designed to showcase your skills:

      WordPress photography themes

      Once you’ve selected the theme you want, you’ll be guided through choosing some custom content options. You can use preset page layouts and menus. You’ll also be able to test your theme’s responsiveness on mobile devices:

      Edit WordPress theme

      You might notice additional content in your WordPress dashboard now as well. There are some tutorial videos, for example, in case you need extra support along the way. Plus, if you want to spice things up later and change your theme, the Inspirations menu will lead you through that process.

      Step 3: Select Plugins to Enhance Your Site

      Now that you’ve selected a theme, it’s time to install some plugins. WordPress plugins are add-on packages of code that can enhance and extend the platform’s functionality. You’ll want to familiarize yourself with the best way to manage them to ensure you keep your site safe and secure.

      Photography blogs and websites often display and watermark high-quality images. To do this, you can install a photography plugin like Envira Gallery. This tool includes options for watermarking your photos, which may be an important part of your security strategy:

      Envira Gallery plugin

      With Envira Gallery, you can also set up an online store, create video galleries, and import content from Instagram. Combining this tool with our website builder makes it easy to display your work dynamically online.

      You may also want to create image galleries with password protection or tie your e-commerce options to a file download manager. With MemberPress, you can protect your content with access rules:

      MemberPress plugin

      This plugin will enable you to turn your photography portfolio into a membership site easily. You can direct visitors to purchase subscriptions before viewing or downloading specific photos. This paywall can be an effective option if you’re looking to monetize your website.

      Step 4: Create Compelling Content

      When it comes to Search Engine Optimization (SEO), there is more to think about than just keywords. To secure better page rankings, it’s important to encourage other people to talk about you.

      Gaining backlinks and social media shares are both effective ways to improve SEO and acquire new clients. To encourage this sharing, you’ll need to create compelling content. This could include tutorials, downloads, infographics, videos, or podcasts.

      Adding a blog to your page is also a great way to build a following and establish yourself as a trusted name in the industry. A beautiful example of this can be seen on the Mostly Lisa website. Visitors can be inspired by these extensive how-to articles on taking high-quality photos:

      Photography portfolio blog

      Ultimately, adding a photography blog can make your portfolio feel more credible and engaging for potential clients. Plus, this blog content can easily be shared on social media or referenced by other websites.

      How to Promote Your Photography Business

      Now that your photography has a home on the web, you might wonder how to get more eyeballs on your work. Self-promotion can sometimes be challenging, but with WordPress and your professional theme, you have plenty to showcase!

      There are a few ways to approach promoting your new site, including:

      • Social media: Promoting your work on social media can reap significant benefits. We recommend staying on a posting schedule, so viewers know they can regularly expect new content. This can develop a loyal, engaged audience interested in your work.
      • Testimonials: Research shows that more than 80% of consumers seek recommendations from family and friends before making purchases. This makes customer testimonials a powerful tool on your website.
      • Call to action: If your goal is to gain clients or fill up your email subscriber list, you might want to learn how to write a good Call to Action (CTA). It will clearly guide your site’s visitors toward the action you want them to take.

      At the end of the day, there are many ways to build a following online. By creating a well-designed photography website and regularly posting on social media, you’ll be able to gain new clients in no time!

      Feature Your Photos Online

      If you plan on pursuing photography professionally, you’ll need to get your photos online. Whether your focus is nature, weddings, family portraits, or street photography, you can show off your images with a WordPress photography theme and our Website Builder. These tools can help you easily and quickly create a platform where clients can see and purchase your services.

      To review, here’s how you can build a photography portfolio website:

      1. Choose your domain name and web host.
      2. Install a dedicated photography theme.
      3. Select plugins like Envira Gallery and MemberPress to enhance your site.
      4. Create compelling content.

      If you’re just starting your photography business, you’re probably looking for a budget-friendly hosting provider. Here at DreamHost, our shared hosting plans are designed to maximize WordPress performance without breaking the bank!

      Power Your Website with DreamHost

      We make sure your website is fast, secure and always up so your visitors trust you.

      shared hosting



      Source link