Category: ROCKEN Documentation

  • DigitalOcean: VPC Peering

    In DigitalOcean, each of the projects is organized with two separate VPCs:

    • Public VPC: Hosts resources accessible from the internet (e.g., Docker Swarm nodes, load balancers).

    • Private VPC: Hosts internal resources (e.g., databases, internal load balancers).

    To enable secure communication between the public and private VPCs within the same project, we use VPC Peering. This setup ensures private, low-latency communication without exposing private resources to the internet.

    Name

    Source VPC

    Target VPC

    Source CIDR block

    Target CIDR block

    Firewall Rules

    rocken-private-vpc-prod-to-rocken-public-vpc-prod

    rocken-private-vpc-prod

    rocken-public-vpc-prod

    10.10.1.0/24

    10.10.2.0/24

    rocken-public-vpc-staging-to-rocken-private-vpc-staging

    rocken-private-vpc-staging

    rocken-public-vpc-staging

    10.10.3.0/24

    10.10.4.0/24

    rocken-public-vpc-qa-to-rocken-private-vpc-qa

    rocken-private-vpc-qa

    rocken-public-vpc-qa

    10.10.5.0/24

    10.10.6.0/24

    Steps to Add a New Peering Connection

    Step 1: Create the VPC Peering Connection

    1. Go to the Networking section in the DigitalOcean Control Panel.

    2. Click on the VPC tab.

    3. Click Create Peering Connection.

    4. In the configuration form:

      • VPC Network: Choose source VPC for peering.

      • Peer to VPC Network: Select the destination VPC from the dropdown.

      • Add a descriptive name for the peering connection (e.g., public-to-private-peering-prod).

    5. Confirm and save the configuration.

    Step 2: Configure Firewall Rules

    1. Go to the Networking section in the DigitalOcean Control Panel.

    2. Click on the Firewalls tab.

    3. Іelect the required firewall.

    4. Update the rules to allow traffic from the source or destination VPC.

    Step 3: Update Route Tables on Droplets

    1. Login to the target Droplet

    2. Use the following commands to restart network stack

      sudo systemctl restart systemd-networkd
    3. On Droplets created before 2 October 2024, or Droplets using custom base images, VPC peering routes must be added manually

      VPC_GATEWAY_IP=$(curl -s 169.254.169.254/metadata/v1/interfaces/private/0/ipv4/gateway)
      
      ip route replace 10.0.0.0/8 via ${VPC_GATEWAY_IP} dev eth1 mtu 1500 metric 101
      ip route replace 172.16.0.0/12 via ${VPC_GATEWAY_IP} dev eth1 mtu 1500 metric 101
      ip route replace 192.168.0.0/16 via ${VPC_GATEWAY_IP} dev eth1 mtu 1500 metric 101

    Refer to the official DigitalOcean documentation for more info – https://docs.digitalocean.com/products/networking/vpc/how-to/update-peering-routes/

    Step 6: Document the Peering Connection

    1. Record the following details for future reference:

      • Source VPC and Target VPC IDs.

      • The CIDR blocks of both VPCs.

      • Name of the peering connection.

      • Any updated firewall rules or routes.

  • DigitalOcean Infrastructure

    Prod Environment (CRM)

    Load Balancer Name

    IP Address

    Connected Resource

    elasticsearch-lb-prod (internal)

    10.10.1.2

    elasticsearch-01-prod

    elasticsearch-02-prod

    elasticsearch-03-prod

    docker-swarm-lb-prod

    188.166.195.147

    docker-swarm-manager-01-prod

    docker-swarm-manager-02-prod

    docker-swarm-manager-03-prod

    Server Name

    vCPU

    RAM

    Disk

    IP Address

    Description

    elasticsearch-01

    2

    8

    160

    64.226.123.170

    ELK Cluster

    elasticsearch-02

    2

    8

    160

    164.90.225.78

    elasticsearch-03

    2

    8

    160

    142.93.100.123

    docker-swarm-manager-01-prod

    4

    8

    160

    104.248.143.135

    Docker Swarm Cluster

    docker-swarm-manager-02-prod

    4

    8

    160

    207.154.240.163

    docker-swarm-manager-03-prod

    4

    8

    160

    138.68.69.192

    Database Server Name

    vCPU

    RAM

    Disk

    Endpoint

    redis-db-prod

    1

    2

    30

    • redis-db-prod-do-user-8527978-0.j.db.ondigitalocean.com

    • private-redis-db-prod-do-user-8527978-0.j.db.ondigitalocean.com

    postgresql-db-prod

    2

    4

    180

    • postgresql-db-prod-do-user-8527978-0.j.db.ondigitalocean.com

    • postgresql-db.prod.rockengroup.com

    postgresql-ro-db-prod

    1

    2

    180

    • postgresql-db-ro.prod.rockengroup.com

    Stage Environment (CRM)

    Server Name

    vCPU

    RAM

    Disk

    IP Address

    Description

    stage-crm-swarm-manager-01

    4

    8

    80

    64.226.90.188

    ubuntu-fra1-staging-elasticsearch-01

    4

    8

    160

    209.38.208.110

    ubuntu-fra1-staging-storybook

    1

    1

    25

    165.22.87.75

    Database Server Name

    vCPU

    RAM

    Disk

    Endpoint

    db-redis-fra1-staging-01

    1

    1

    10

    • db-redis-fra1-staging-01-do-user-8527978-0.b.db.ondigitalocean.com

    • private-db-redis-fra1-staging-01-do-user-8527978-0.b.db.ondigitalocean.com

    db-postgresql-fra1-01

    1

    1

    10

    • db-postgresql-fra1-staging-01-do-user-8527978-0.b.db.ondigitalocean.com

    • private-db-postgresql-fra1-staging-01-do-user-8527978-0.b.db.ondigitalocean.com

  • DNS

    This document provides an overview of the key DNS entities used in managing domain names, including details about registrars, domain names, and name servers (NS).

    Domain Name

    Status

    Registrar

    Expiration Date

    Name Servers

    DNS Hosting Provider

    rockcapital.ch

    Parked

    101domain.com

    05 Jan 2026

    NS1.101DOMAIN.COM NS2.101DOMAIN.COM

    rocken.ai

    Parked

    06 Sep 2026

    rocken.biz

    Parked

    10 Nov 2025

    rocken.com.de

    Parked

    15 Nov 2025

    rocken.de

    Parked

    27 Jan 2026

    rocken.net

    Parked

    10 Nov 2025

    rocken.uk

    Parked

    15 Nov 2025

    rocken.world

    Parked

    15 Nov 2025

    news-rocken.ch

    Parked

    hostpoint.ch

    (sami.gashi@bluewin.ch)

    14.11.2025

    ns.hostpoint.ch ns2.hostpoint.ch ns3.hostpoint.ch

    rocken.eu

    Parked

    08.12.2025

    rocken.fr

    Parked

    08.12.2025

    rocken.io

    Active

    08.12.2025

    ns1.trendhosting-net.ch tux13.trendhosting-net.ch

    trendhosting (rocken)

    rocken.at

    Parked

    swizzonic.ch

    25/02/2025

    ns1223.ispapi.net ns2179.ispapi.net ns3183.ispapi.net

    rockengroup.ch

    Active

    25/09/2025

    ns1.trendhosting-net.ch tux13.trendhosting-net.ch

    trendhosting (rockengroup)

    rockenjobs.ch

    Active

    13/03/2025

    rockengroup.com

    Active

    25/09/2025

    ns1.digitalocean.com
    ns2.digitalocean.com ns3.digitalocean.com

    digitalocean

    rockentalent.ch

    Parked

    13/03/2025

    ns1.rockentalent.ch ns2.rockentalent.ch

    rocken.co.uk

    Parked

    01/04/2025

    dns1.undefined-dns.xyz dns2.undefined-dns.xyz

    rocken.us

    Parked

    25/03/2025

    rockengroup.de

    Parked

    21/09/2025

    rockenjobs.com

    Parked

    13/03/2025

    rockenjobs.de

    Parked

    09/03/2025

    rockentalent.com

    Parked

    13/03/2025

    rockentalent.de

    Parked

    09/03/2025

    rocken.ch

    Active

    hostpoint.ch

    (toni.zeciri@rockengroup.com)

    ns1.digitalocean.com
    ns2.digitalocean.com ns3.digitalocean.com

    digitalocean

    rocken.jobs

    Active

    ns.hostpoint.ch ns2.hostpoint.ch ns3.hostpoint.ch

    hostpoint

  • PostgreSQL: Disaster Recovery Plan

    This document outlines the disaster recovery setup for the PostgreSQL cluster deployed as a managed database on DigitalOcean. The configuration ensures high availability, data integrity, and quick recovery in the event of an incident.

    Common Failure Scenarios and Recovery Steps

    1: Primary Node Failure

    Impact

    • The primary node becomes unavailable, affecting write operations.

    Recovery Steps

    1. Promote an existing read-only node to become the primary node of the database cluster.

      doctl databases replica promote <database-cluster-id> <replica-name> [flags]
    2. Update DNS record in prod.rockengroup.comdomain with a new connection strings if the primary node changes due to failover.

    3. Provision a new read-only node to maintain redundancy.

    2: Cluster Failure

    Impact

    • Both the primary and read-only nodes are unavailable, resulting in a complete loss of database access.

    Recovery Steps

    1. Initiate the restoration process through DigitalOcean interface. Use the PostgreSQL: Digital Ocean restore DB document for restoring

    2. Ensure the restored databases are consistent and free of corruption.

    3. Update connection string in prod.rockengroup.com domain to point to the newly restored cluster.

    4. Set up a new read-only node for redundancy.

    3. Data Failure

    Impact

    • Data corruption or accidental deletion affects database integrity.

    Recovery Steps

    1. Use Snapshooter (PostgreSQL: Snapshooter restore DB) to restore the database to a point-in-time before the data failure occurred:

      • go to backup-snapshooter-prod Space and find necessary DB archive

        image-20241220-094624.png

      • download MANUAL_RESTORE.txt file and follow its recommendations to restore the DB .

    2. Check the restored data for consistency and completeness.

  • Story 2.4.2.3. RT. Interview. Mapping Hard-Skills with Categories

    Content

    General info

    This feature aims to enhance the applicant experience by presenting only relevant hard skills based on the job category of their application. By mapping hard skills to their corresponding categories, applicants will see skills directly related to their job application first, followed by less relevant categories. This improves clarity and reduces the overwhelming number of skills displayed, increasing accuracy and engagement during the application process.

    Problem:

    When applying during the interview process, Applicants see all our Skills and often do not know which to select because there are too many.

    Solution:

    Display suggestions with relevant Hard skills to the Job they applied. Therefore, the Skills will be mapped with the categories we have. After, the first that have been mapped to the category will be displayed first.

    For example, regarding a person that applied for an IT-Job, it should look like the following:

    Hardskills (relevante Kategorien gemäss deiner Bewerbung)

    • IT

    • Projektmanagement

    Hardskills (weniger relevante Kategorien)

    • ………. (all other Hardskill Categories)

    ………

    (Jobcategory/Skill Category)

    • Banking & Assurance – Branche / Produkte / Lösungen, Sales

    • Einkauf und Supply Chain Management – Einkauf / Supply Chain, Sales

    • Finanzen – Finanzen, Sales, Projektmanagement

    • Healthcare – (ALL)

    • Human Resources – HR

    • IT – IT, Projektmanagement

    • Marketing & Design – Marketing

    • Recht / Beratung – Legal

    • Sales & Trading – Sales, Finanzen

    • Technik / Engineering / Produktion – Technik / Engineering / Produktion, KVP Kontinuierlicher Verbesserungsprozess

    The system will suggest relevant hard skills to candidates during the interview process. These suggestions will appear as clickable tags (chips) displayed above the search bar. These tags will be generated based on the job category of the application and the candidate’s experience. Candidates can select these suggested skills by clicking on the tags, and the selected skills will be added to their profile with a default confidence level, which they can adjust. This enhancement simplifies the skill selection process, improves accuracy, and ensures better matching with job requirements.

    User story

    As a Talent Profile (candidate),
    I want to see relevant skill suggestions as clickable tags during the interview process,
    So that I can quickly and accurately add skills matched to the job category of my application.

    Visual design:

    https://www.figma.com/design/I5CXH7H3ICD0vfA1kPbcVf/Rocken-Design?node-id=43746-43924&t=Nxh6fnAACkdYzdPl-1

    https://www.figma.com/design/I5CXH7H3ICD0vfA1kPbcVf/Rocken-Design?node-id=43746-44254&t=Nxh6fnAACkdYzdPl-1

    #

    Acceptance Criteria

    01

    Scenario: hints are displayed under the search bar
    Given the candidate is in the hard skills selection step
    When the system matches skills based on job category (check attachment)
    Then hints with suggested skills are displayed.

    Mapping Categories and S…

    image-20250109-080653.png

    02

    Scenario: Candidate selects a skill from the hints
    Given the candidate clicks on a hint
    When the hint is selected
    Then the skill is added to the list below with ability to select level
    AND hints is removed from suggestion section
    AND new skill should be highlighted

    image-20250109-080505.png

    03

    Scenario: hint suggestions update dynamically
    Given the job category or candidate profile is updated
    When the system recalculates relevant skills
    Then the displayed hints are updated accordingly.

    04

    Scenario: hints display relevant skills
    Given the candidate’s job application and experience
    When the system generates skill suggestions
    Then the hints are specific to the application and job category.

    05

    Scenario: Candidate can modify skill confidence
    Given the candidate adds a skill from the hints
    When they adjust the confidence level
    Then the updated level is saved correctly
    AND the new row is not highlighted anymore

    06

    Scenario: Skill suggestion hint reappears after removal
    Given the candidate removes a selected skill
    When the skill is deleted from the selected skills
    Then the corresponding suggestion tag reappears under the search bar.

    limit 15 suggestions

    autoupdate suggested skilss after selection

  • Redis

    Redis is deployed as a service in DigitalOcean with primary and standby nodes. It functions as a cache for a PostgreSQL database and does not include critical data.

    Steps to Create a Redis Service in DigitalOcean:

    1. Navigate to Managed Databases:

      • Go to the "Databases" section in the control panel.

      • Click on "Create Database."

    2. Select Redis:

      • Choose Redis as the database engine.

      • Select the version: Redis 7 (Caching).

    3. Configure Cluster Settings:

      • Choose the region (FRA1), node size, set Eviction policy as allkeys-lru`

      • Enable high availability by selecting primary and standby nodes.

      • Add trusted sources (IP addresses) that can access the Redis cluster.

    4. Assign a name to Redis cluster (according to naming convention) and click "Create Database."

    Redis Cluster Details:

    Name

    Endpoint

    Port

    vCPU

    RAM

    Disk

    Version

    redis-db-prod

    redis-db.prod.rockengroup.com

    25061

    1

    2

    30

    Caching 7

    The communication between the application and the Redis cluster is exclusively routed through the internal VPC, with access to the public endpoint restricted.

  • Redis: Disaster Recovery Plan

    Since Redis functions as a cache for a PostgreSQL database and does not include critical data, the disaster recovery plan prioritizes service availability and quick recovery.

    Architecture

    Primary-Standby Nodes: Redis operates with a primary node and a standby replica for high availability. Standby nodes  automatically replace the primary node in the case of a failure, ensuring your data stays available.

    Common Failure Scenarios and Recovery Steps

    1. Primary Node Failure:

    Impact:

    • The cluster remains operational.

    • Standby node is automatically promoted to replace it

    Recovery Steps:

    • Follow DigitalOcean instruction to fix the issue

    2. Region Failure:

    Impact:

    • The cluster becomes unavailable.

    Recovery Steps:

    • Deploy Redis cluster in another DigitalOcean region

    • Set new username/password in the application variables

  • Elasticsearch: Deployment Instructions

    1. Navigate to the Deployment Directory

      • Navigate to the directory where the Docker Compose file will be stored:
        /root/elasticsearch.

      • If the directory does not exist, create it:

        mkdir -p /root/elasticsearch
        mkdir -p /root/elasticsearch/certs
    2. Prepare the docker-compose.yml File

      • Place the docker-compose.yml file in the directory.

      • Modify the file as needed to suit deployment requirements.

    3. Copy Self-Signed Certificates

      • Copy your self-signed certificates to a folder named certs inside the deployment directory

    4. Run the Docker Compose File (Initial Attempt)
      Run the following command to start the deployment:

      docker-compose up -d

    The first run may fail because the certs folder must be placed in the elastic-config Docker volume.

    1. Prepare the .env File

      • Copy the .env file to the /root/elasticsearch directory.

      • Modify the file as needed to suit deployment requirements.

    2. Deploy the Elasticsearch Cluster

      • Start the containers with the following command:

        docker-compose up -d

    Ensure all necessary files (docker-compose.yml, .env, certificates) are correctly configured before deployment.

    Ensure all necessary files (docker-compose.yml, .env, certificates) are correctly configured before deployment.


    Useful Docker Commands:

    • Get container logs (in real-time, last 200 lines):

      docker logs -f -n200 elasticsearch-docker-node-1
    • Get detailed information about the container:

      docker inspect elasticsearch-docker-node-1
    • View resource usage statistics:

      docker stats elasticsearch-docker-node-1
    • Stopping and Removing Containers

      docker-compose down

  • Story 2.2.1.3. RT. Banner on login page about updating website

    Content

    General info

    This story focuses on implementing a banner on the RockenTalent login page for candidates, informing them about an upcoming platform update. The banner must be responsive to work seamlessly on both desktop and mobile views, and include a close (X) button for user convenience. It aims to communicate scheduled downtime, the improvements coming to the platform, and to assure users that the wait will be worthwhile.

    User story

    As a Rocken Talent user,
    I want to see a banner on the login page that informs me about the upcoming platform update,
    So that I am aware of the planned downtime and the new features being introduced.

    Visual design:

    https://www.figma.com/design/I5CXH7H3ICD0vfA1kPbcVf/Rocken-Design?node-id=59892-476&t=ArrGyYnB7TaeKLGa-4

     

     

    Acceptance criteria

     

    01

    Scenario: Banner is displayed on the login page
    Given I open the Rocken Talent login page
    When the update information is configured
    Then I see a banner with the provided text displayed above the login form.

    image-20241217-154934.png

    02

    Scenario: The banner text matches the provided content
    Given I see the banner
    Then it contains the following text:

    • Header: "Rocken Talent: Bald noch besser!"

    • Body: "Von Montag, 23.12.24, 17:00 Uhr bis nach Weihnachten ist Rocken Talent kurz offline, um die Plattform für Dich zu verbessern. Nach Weihnachten erstrahlt Rocken Talent mit neuem Look – besser, schneller und moderner!"

    • Closing Line: "Danke für das Verständnis – das Warten lohnt sich."

    Von Montag, 23.12.24, 17:00 Uhr bis nach Weihnachten ist Rocken Talent kurz offline, um die Plattform für Dich zu verbessern. Nach Weihnachten erstrahlt Rocken Talent mit neuem Look – besser, schneller und moderner!

    03

    Scenario: Banner is responsive on desktop and mobile
    Given I view the login page on a desktop or mobile device
    When the banner is displayed
    Then the banner adapts its layout to fit the screen size appropriately.

    image-20241217-155020.png

    04

    Scenario: Banner has a close button
    Given I see the banner on the login page
    When I click the "X" button on the banner
    Then the banner closes and does not reappear unless I refresh or reload the page.

    05

    Scenario: Close button functionality
    Given I close the banner
    When I refresh the page
    Then the banner reappears for the user to ensure visibility of the message.

    06

    Scenario: No impact on login functionality
    Given I interact with the banner
    When I log in to Rocken Talent
    Then the login process works as expected, and the banner does not interfere with form inputs.