Deploy Bitbucket & Jira on Azure(Docker)

This guide helps you deploy Bitbucket and Jira on Azure using Docker, with a shared PostgreSQL database.

1️⃣ Set Up Azure Resources

Create an Azure Resource Group and provision two virtual machines:

2️⃣ Configure PostgreSQL Database

Set up a managed PostgreSQL database on Azure and create separate databases for Bitbucket and Jira.

Once connected to PostgreSQL, create two separate databases:

CREATE DATABASE bitbucket_db;
CREATE DATABASE jira_db;
Then, create a dedicated user for each application:

CREATE USER bitbucket_user WITH PASSWORD 'StrongBitbucketPassword';
CREATE USER jira_user WITH PASSWORD 'StrongJiraPassword';
Grant permissions so each user can only access its respective database:

GRANT ALL PRIVILEGES ON DATABASE bitbucket_db TO bitbucket_user;
GRANT ALL PRIVILEGES ON DATABASE jira_db TO jira_user;

3️⃣ Install Docker on Both VMs

Ensure Docker and Docker Compose are installed on both virtual machines.

Enable Git LFS to handle large file repositories:
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose
sudo systemctl enable docker && sudo systemctl start docker
# Install Git LFS
sudo apt update
sudo apt install git-lfs -y
# Enable Git LFS
git lfs install
mkdir -p /opt/atlassian/bitbucket /opt/atlassian/jira
chown -R 2001:2001 /opt/atlassian/bitbucket # For Bitbucket
chown -R 2002:2002 /opt/atlassian/jira # For Jira

4️⃣ Deploy Bitbucket on Bitbucket VM

On the Bitbucket VM, configure and deploy Bitbucket using Docker Compose:

Inside /opt/atlassian/, create docker-compose.yml:
version: '3'
services:
  bitbucket:
    image: atlassian/bitbucket:latest
    ports:
      - "7990:7990"
      - "7999:7999"
    environment:
      - 'JDBC_URL=jdbc:postgresql://my-postgres-db.postgres.database.azure.com:5432/bitbucket_db'
      - 'JDBC_USER=bitbucket_user'
      - 'JDBC_PASSWORD=StrongBitbucketPassword'
      - 'BITBUCKET_LFS_ENABLED=true' # Enable Git LFS
      volumes:
      - /opt/atlassian/bitbucket:/var/atlassian/application-data/bitbucket
      restart: unless-stopped
    networks:
      - atlassian
networks:
  atlassian:

5️⃣ Deploy Jira on Jira VM

On the Jira VM, configure and deploy Jira using Docker Compose:

Inside /opt/atlassian/, create docker-compose.yml:
version: '3'
services:
  jira:
    image: atlassian/jira-software:latest
    ports:
      - "8080:8080"
    environment:
      - 'JDBC_URL=jdbc:postgresql://my-postgres-db.postgres.database.azure.com:5432/jira_db'
      - 'JDBC_USER=jira_user'
      - 'JDBC_PASSWORD=StrongJiraPassword'
    volumes:
      - /opt/atlassian/jira:/var/atlassian/application-data/jira
    restart: unless-stopped
    networks:
      - atlassian
networks:
  atlassian:

6️⃣ Access Your Applications

cd /opt/atlassian
docker-compose up -d

✅ Bitbucket → http://your-azure-ip:7990

✅ Jira → http://your-azure-ip:8080

7️⃣ Secure Your Setup

Ensure that only trusted IPs can access your services by configuring firewall rules.

8️⃣ Configure Bitbucket & Jira

Go to the web interface and complete the setup:

9️⃣ Link Bitbucket & Jira

In Bitbucket, go to Administration → Jira Integration and add your Jira server URL.

Now, Jira issues will be linked to commits, branches, and pull requests! 🎯

✅ Done!

Your Bitbucket & Jira are now running on separate VMs with a shared PostgreSQL database on Azure! 🎉

On a local machine where you use Git, initialize and track large files:
# Initialize Git LFS
git lfs install

# Track Source Engine-specific model, texture, and map files
git lfs track "*.mdl" "*.vtx" "*.vvd" "*.phy" "*.ani" "*.dx80.vtx" "*.dx90.vtx" "*.sw.vtx" "*.xbox.vtx" \
"*.vmt" "*.vtf" "*.vmf" "*.vmm" "*.bsp" "*.nav" "*.lin" "*.ain"

# Track Source Engine scripts and config files
git lfs track "*.qc" "*.qci" "*.txt" "*.cfg" "*.res" "*.lst" "*.kv" "*.vcd" "*.fgd"

# Track general 3D model formats
git lfs track "*.obj" "*.fbx" "*.dae" "*.smd" "*.dmx" "*.blend" "*.max" "*.3ds" "*.stl" "*.lwo" "*.abc"

# Track texture, material, and shader files
git lfs track "*.tga" "*.dds" "*.png" "*.jpg" "*.jpeg" "*.bmp" "*.psd" "*.exr" "*.hdr" "*.tiff" "*.tif" "*.vmat"

# Track audio and video formats used in Source
git lfs track "*.wav" "*.mp3" "*.ogg" "*.bik" "*.mp4"

# Track compression and archives
git lfs track "*.zip" "*.rar" "*.7z" "*.tar" "*.gz" "*.bz2" "*.xz"

# Track Source tool and engine asset files
git lfs track "*.pak" "*.vpk" "*.gma" "*.cache" "*.bin"

# Track development files and scripts
git lfs track "*.sln" "*.vcproj" "*.vcxproj" "*.user" "*.props" "*.filters" "*.bat" "*.sh" "*.cmd" \
"*.patch" "*.diff" "*.cmake" "*.mak"

# Track source control and metadata files
git lfs track "*.log" "*.sdf" "*.ipch" "*.ncb"

# Verify tracked files
cat .gitattributes

# Commit the changes
git add .gitattributes
git commit -m "Enable Git LFS tracking for Source Engine development"
git push origin main

🔹 Why Do You Need a Database?

Without a database, Bitbucket and Jira cannot function because they rely on PostgreSQL to store and retrieve data dynamically.

Think of PostgreSQL as the "brain" that remembers everything—without it, your Bitbucket repositories and Jira issues wouldn't persist after a restart.

🔹 What Does the Database Do?

For Bitbucket:

For Jira:

🚀 Summary

Service Azure VM CPU/RAM SSD Ports Open
Bitbucket bitbucket-vm 4 vCPU / 16GB RAM 1TB 7990, 7999, 22
Jira jira-vm 4 vCPU / 16GB RAM 500GB 8080, 22
PostgreSQL Azure Managed DB Cloud Cloud 5432

🔹 Configure DNS (Point Domain to Azure VMs)

  1. Go to your DNS provider (GoDaddy, Namecheap, Cloudflare, etc.).
  2. Create an A Record for each service:
Service Record Type Host Value (VM Public IP)
Bitbucket A bitbucket.yourcompany.com <Bitbucket_VM_Public_IP>
Jira A jira.yourcompany.com <Jira_VM_Public_IP>

💡 Save changes and wait for DNS propagation (can take a few minutes to hours).

3️⃣ Install Nginx as a Reverse Proxy (For SSL & Routing)

Run these steps on each VM (Bitbucket & Jira):

sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx

4️⃣ Configure Nginx for SSL (Let’s Encrypt)

Open the Nginx config file:

sudo nano /etc/nginx/sites-available/default

Replace the content with this (Bitbucket example):

server {
  listen 80;
  server_name bitbucket.yourcompany.com;
    
location / {
  proxy_pass http://127.0.0.1:7990;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  }
}
    

For Jira, replace 7990 with 8080 and use jira.yourcompany.com.

Save and exit (CTRL + X, then Y, then ENTER).

Restart Nginx:

sudo systemctl restart nginx

5️⃣ Get a Free SSL Certificate (Let's Encrypt)

Run this command on each VM:

sudo certbot --nginx -d bitbucket.yourcompany.com

For Jira, run:

sudo certbot --nginx -d jira.yourcompany.com

Follow the prompts and choose "redirect HTTP to HTTPS".

6️⃣ Test and Auto-Renew SSL

Check if SSL works by visiting:

Set up auto-renewal:

sudo systemctl enable certbot.timer

✅ Done!

Your Bitbucket and Jira instances are now securely accessible over HTTPS with a domain. 🎉

Source Engine development files and Visual Studio 2008 project files

File Extension Description
.sln Visual Studio Solution file, used to manage multiple projects.
.vcproj Visual Studio 2008 project file, contains project configurations.
.vcxproj Visual Studio 2010+ project file, for newer versions of Visual Studio.
.ncb Visual Studio IntelliSense database, stores code autocomplete data.
.sdf Visual Studio database file for IntelliSense and project data.
.user User-specific settings for Visual Studio projects.
.pdb Program Database file, contains debugging symbols for compiled binaries.
.exe Executable file, the compiled game or tools used in development.
.dll Dynamic Link Library, contains compiled code for game logic or engine functions.
.lib Static library file, used for linking compiled code into an application.
.obj Compiled object file, intermediate step before linking into an executable.
.exp Export file generated during DLL compilation, contains function addresses.
.bsp Compiled Source Engine map file used in gameplay.
.vmf Valve Map Format, the editable version of a map created in Hammer.
.vmt Valve Material Type file, defines surface properties and textures.
.vtf Valve Texture Format file, contains image data used in materials.
.mdl Compiled 3D model used by the Source Engine.
.vtx / .vvd / .phy Model mesh, vertex, and physics data files associated with .mdl.
.qc Model compile script file used by Studiomdl.
.smd / .dmx Model and animation source files used before compiling into .mdl.
.wav Waveform audio file, used for sound effects and dialogue.
.mp3 / .ogg Compressed audio formats, used for music and longer voiceovers.
.vcd Choreography file used in Faceposer for scripted scenes.
.res Resource file defining map-specific asset requirements.
.cfg / .txt / .kv Configuration and key-value files for scripting and settings.
.fgd Forge Game Definition file, used by Hammer to define entity classes.
.log Log file generated by the engine or compile tools.
.vpk Valve Pak archive file, used to package game assets.
.gma Garry’s Mod Addon file, a packed collection of assets and scripts.
.pak Generic package file format used by some Source mods.
.cache / .bin Compiled or cached game data files.
.tga / .dds / .bmp / .jpg / .png Image formats used for textures and UI.
.psd / .tif / .exr / .hdr High-quality image formats used in texture workflows.
.bat / .sh Script files used to automate build or launch processes.
.zip / .rar / .7z Compressed archive files for distributing mods or assets.