Skip to content

Commit 0a77ea7

Browse files
authored
Merge pull request #18 from EmanuelCR03/main
Improved cross-platform setup and deployment:
2 parents 8926d86 + 9bd2562 commit 0a77ea7

File tree

3 files changed

+309
-37
lines changed

3 files changed

+309
-37
lines changed

install.sh

Lines changed: 297 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,308 @@
11
#!/bin/bash
22

3+
# Function to install curl
4+
install_curl() {
5+
echo "➡️ Installing curl..."
6+
if [[ $(uname) == "Darwin" ]]; then
7+
# Running on macOS
8+
if ! command -v brew &>/dev/null; then
9+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
10+
eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null || eval "$(/usr/local/bin/brew shellenv)"
11+
fi
12+
brew install curl
13+
else
14+
# Assuming Linux
15+
sudo apt-get update
16+
sudo apt-get install curl -y
17+
fi
18+
}
19+
20+
# Function to install docker
21+
install_docker(){
22+
echo "➡️ Installing docker..."
23+
# Uninstall conflicting packages
24+
echo "🧹 Removing conflicting Docker-related packages..."
25+
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
26+
sudo apt-get remove -y "$pkg" 2>/dev/null || true
27+
done
28+
if [[ $(uname) == "Darwin" ]]; then
29+
# Running on macOS
30+
echo "❗ Docker Engine cannot run natively on macOS without a VM."
31+
echo "💡 Docker Desktop provides a full environment (Docker Engine, CLI, Compose, etc.) via a lightweight VM."
32+
echo "➡️ Official download page: https://docs.docker.com/desktop/install/mac/"
33+
34+
read -p "❓ Would you like to download Docker Desktop automatically now? (Y/n) " answer
35+
if [ "$answer" != "n" ]; then
36+
echo "⬇️ Downloading Docker Desktop installer..."
37+
38+
ARCH=$(uname -m)
39+
if [[ "$ARCH" == "arm64" ]]; then
40+
# Mac with Apple Silicon (M1, M2, M3)
41+
DMG_URL="https://desktop.docker.com/mac/main/arm64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-arm64"
42+
else
43+
# Mac with Intel chip (x86_64 = amd64)
44+
DMG_URL="https://desktop.docker.com/mac/main/amd64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-amd64"
45+
fi
46+
47+
curl -L -o Docker.dmg "$DMG_URL" || {
48+
echo "❌ Failed to download Docker.dmg"
49+
exit 1
50+
}
51+
echo "✅ Docker.dmg has been downloaded successfully."
52+
53+
echo "📦 Mounting the DMG file..."
54+
sudo hdiutil attach Docker.dmg || {
55+
echo "❌ Failed to mount Docker.dmg"
56+
exit 1
57+
}
58+
59+
echo "⚙️ Installing Docker Desktop into /Applications..."
60+
sudo /Volumes/Docker/Docker.app/Contents/MacOS/install || {
61+
echo "❌ Docker installation failed"
62+
sudo hdiutil detach /Volumes/Docker
63+
exit 1
64+
}
65+
66+
echo "🔌 Unmounting the DMG..."
67+
sudo hdiutil detach /Volumes/Docker || {
68+
echo "⚠️ Failed to unmount the volume"
69+
}
70+
71+
echo "🚀 Launching Docker Desktop..."
72+
open -a Docker || {
73+
echo "⚠️ Could not launch Docker Desktop"
74+
}
75+
echo "🚀 Docker Desktop has been launched. If this is your first time, please authorize it manually in the pop-up or in System Preferences > Security & Privacy."
76+
77+
echo "⏳ Waiting for Docker to become available..."
78+
while ! docker info >/dev/null 2>&1; do
79+
echo "⏳ Waiting for Docker to start..."
80+
sleep 2
81+
done
82+
83+
echo "✅ Docker is running and ready to use."
84+
else
85+
echo "🔁 Once installed manually, start Docker Desktop and use the CLI as usual."
86+
exit 1
87+
fi
88+
else
89+
# Assuming Linux
90+
echo "📦 Installing Docker from official Docker repo..."
91+
sudo apt-get update
92+
sudo apt-get install -y ca-certificates
93+
# Add Docker’s official GPG key
94+
sudo install -m 0755 -d /etc/apt/keyrings 2>/dev/null || true
95+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
96+
sudo chmod a+r /etc/apt/keyrings/docker.asc
97+
# Set up the repository
98+
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
99+
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
100+
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
101+
# Install Docker packages
102+
sudo apt-get update
103+
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
104+
# Add user to docker group
105+
sudo groupadd docker 2>/dev/null || true
106+
sudo usermod -aG docker "$USER" || true
107+
108+
# Apply group change in current shell
109+
newgrp docker <<EONG
110+
echo "✅ Docker is installed and group membership applied in this session."
111+
EONG
112+
fi
113+
}
114+
115+
# Funtion to install docker compose plugin
116+
install_docker_compose(){
117+
echo "➡️ Installing Docker Compose plugin..."
118+
119+
if [[ $(uname) == "Darwin" ]]; then
120+
# macOS
121+
if docker compose version &>/dev/null; then
122+
echo "✅ Docker Compose is already available on macOS (via Docker Desktop)."
123+
else
124+
echo "❌ 'docker compose' is not available. Make sure Docker Desktop is installed and running."
125+
exit 1
126+
fi
127+
else
128+
# Assuming Linux
129+
sudo apt-get update
130+
sudo apt-get install -y docker-compose-plugin
131+
echo "✅ Docker Compose plugin installed on Linux."
132+
fi
133+
}
134+
135+
# Function to start Docker
136+
start_docker() {
137+
if [[ $(uname) == "Darwin" ]]; then
138+
echo "🚀 Launching Docker Desktop..."
139+
open -a Docker || {
140+
echo "⚠️ Could not launch Docker Desktop"
141+
}
142+
else
143+
echo "🚀 Starting Docker service..."
144+
sudo systemctl start docker
145+
fi
146+
}
147+
148+
# Function to Install/Update docker-compose
149+
install_docker_stand_alone(){
150+
echo "⬇️ Downloading latest docker-compose version..."
151+
if sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; then
152+
sudo chmod +x /usr/local/bin/docker-compose
153+
else
154+
echo "❌ Failed to download docker-compose binary."
155+
exit 1
156+
fi
157+
}
158+
3159
echo "🔧 Checking dependencies..."
160+
if ! command -v curl &>/dev/null; then
161+
echo -e "\t❌ Curl is not installed or not in PATH.\n\t\tOn macOS: brew install curl\n\t\tOn Linux: sudo apt install curl"
162+
read -p "❓ Would you like to install it automatically? (Y/n) " answer
163+
if [ "$answer" != "n" ]; then
164+
install_curl
165+
if command -v curl &>/dev/null; then
166+
curl_version=$(curl --version | head -n 1 | awk '{print $2}')
167+
echo "✅ curl is already installed (version $curl_version)"
168+
else
169+
echo "❌ curl installation failed or still not available in PATH."
170+
exit 1
171+
fi
172+
else
173+
echo "❌ curl is required to continue. Exiting..."
174+
exit 1
175+
fi
176+
fi
4177
if ! command -v docker &>/dev/null; then
5178
echo -e "\t❌ Docker is not installed or not in PATH. Please install Docker first.\n\t\tSee https://docs.docker.com/get-docker/"
6-
exit 1
7-
fi
8-
# Check if docker compose plugin is installed
9-
if ! docker compose version &>/dev/null; then
10-
echo -e "\t❌ Docker Compose is not installed or not in PATH (n.b. docker-compose is deprecated)\n\t\tUpdate docker or install docker-compose-plugin\n\t\tOn Linux: sudo apt-get install docker-compose-plugin\n\t\tSee https://docs.docker.com/compose/install/"
11-
exit 1
179+
read -p "❓ Would you like to install it automatically? (Y/n) " answer
180+
if [ "$answer" != "n" ]; then
181+
install_docker
182+
if command -v docker &>/dev/null; then
183+
docker_version=$(docker --version | head -n 1 | awk '{print $3}')
184+
echo "✅ Docker is now installed (version $docker_version)."
185+
else
186+
echo "❌ Docker installation failed or still not available in PATH."
187+
exit 1
188+
fi
189+
else
190+
echo "❌ Docker is required to continue. Exiting..."
191+
exit 1
192+
fi
12193
fi
194+
195+
13196
# Check if docker is started
14-
if ! docker info &>/dev/null; then
197+
if ! systemctl is-active --quiet docker; then
15198
echo -e "\t❌ Docker is not running.\n\t\tPlease start Docker Desktop, Docker or check documentation at https://docs.docker.com/config/daemon/start/"
16-
exit 1
199+
read -p "❓ Would you like to try starting Docker automatically? (Y/n) " answer
200+
if [ "$answer" != "n" ]; then
201+
start_docker
202+
203+
timeout=60
204+
elapsed=0
205+
206+
echo "⏳ Waiting for Docker to start (timeout: ${timeout}s)..."
207+
208+
until docker info &>/dev/null; do
209+
sleep 2
210+
elapsed=$((elapsed + 2))
211+
if [ "$elapsed" -ge "$timeout" ]; then
212+
echo "❌ Timeout reached. Docker did not start within $timeout seconds."
213+
exit 1
214+
fi
215+
done
216+
echo "✅ Docker is now running."
217+
else
218+
echo "❌ Docker must be running to continue. Exiting..."
219+
exit 1
220+
fi
17221
fi
18-
if ! command -v curl &>/dev/null; then
19-
echo -e "\t❌ Curl is not installed or not in PATH.\n\t\tOn macOS: brew install curl\n\t\tOn Linux: sudo apt install curl"
20-
exit 1
222+
223+
# Check if docker compose plugin is installed
224+
if ! docker compose version &>/dev/null; then
225+
echo -e "\t❌ Docker Compose is not installed or not in PATH (n.b. docker-compose is deprecated)\n\t\tUpdate docker or install docker-compose-plugin\n\t\tOn Linux: sudo apt-get install docker-compose-plugin\n\t\tSee https://docs.docker.com/compose/install/"
226+
read -p "❓ Would you like to install it automatically? (Y/n) " answer
227+
if [ "$answer" != "n" ]; then
228+
install_docker_compose
229+
if docker compose version &>/dev/null; then
230+
docker_compose_version=$(docker compose version --short 2>/dev/null || docker compose --version | awk '{print $3}')
231+
echo "✅ docker compose plugin is already installed (version $docker_compose_version)"
232+
else
233+
echo "❌ docker compose plugin installation failed or still not available in PATH."
234+
exit 1
235+
fi
236+
else
237+
echo "❌ docker compose plugin is required to continue. Exiting..."
238+
exit 1
239+
fi
21240
fi
22241

23242
# Check if docker compose version is >= 2
24-
if [ "$(docker compose version --short | cut -d' ' -f3 | cut -d'.' -f1)" -lt 2 ]; then
25-
echo -e "\t❌ Docker Compose is outdated. Please update Docker Compose to version 2 or higher.\n\t\tSee https://docs.docker.com/compose/install/linux/"
26-
exit 1
243+
compose_major_version=$(docker compose version --short | cut -d'.' -f1)
244+
if [ "$compose_major_version" -lt 2 ]; then
245+
echo -e "\t❌ Docker Compose is outdated. Please update to version 2 or higher.\n\t\tSee https://docs.docker.com/compose/install/"
246+
read -p "❓ Would you like to update it automatically? (Y/n) " answer
247+
if [ "$answer" != "n" ]; then
248+
install_docker_compose
249+
compose_major_version=$(docker compose version --short | cut -d'.' -f1)
250+
if [ "$compose_major_version" -ge 2 ]; then
251+
docker_compose_version=$(docker compose version --short 2>/dev/null || docker compose --version | awk '{print $3}')
252+
echo "✅ Docker Compose plugin has been updated (version $docker_compose_version)."
253+
else
254+
echo "❌ Docker Compose plugin update failed or the required version is still not available."
255+
exit 1
256+
fi
257+
else
258+
echo "❌ A compatible version of Docker Compose (2.x or higher) is required to continue. Exiting..."
259+
exit 1
260+
fi
27261
fi
262+
28263
# Check if docker-compose is installed, if so issue a warning if version is < 2
29-
if command -v docker-compose &>/dev/null; then
30-
if [ "$(docker-compose version --short | cut -d' ' -f3 | cut -d'.' -f1)" -lt 2 ]; then
31-
echo -e "\n\t⚠️ 'docker-compose' is installed but outdated. Make sure to use 'docker compose' or to upgrade 'docker-compose' to version 2.\n\t\tSee https://docs.docker.com/compose/install/standalone/\n"
264+
if ! command -v docker-compose &>/dev/null; then
265+
echo "⬇️ 'docker-compose' not found."
266+
read -p "❓ Would you like to install it automatically? (Y/n) " answer
267+
if [ "$answer" != "n" ]; then
268+
install_docker_stand_alone
269+
if command -v docker-compose &>/dev/null; then
270+
version=$(docker-compose version --short)
271+
echo "✅ 'docker-compose' installed successfully (version $version)."
272+
else
273+
echo "❌ Failed to install 'docker-compose'."
274+
exit 1
275+
fi
276+
else
277+
echo -e "\n\t⚠️ 'docker-compose' is not installed. Some optional features may not be available."
278+
fi
279+
else
280+
compose_legacy_version=$(docker-compose version --short)
281+
compose_legacy_major=$(echo "$compose_legacy_version" | cut -d'.' -f1)
282+
283+
if [ "$compose_legacy_major" -lt 2 ]; then
284+
echo -e "\n\t⚠️ 'docker-compose' is installed but outdated (version $compose_legacy_version)."
285+
echo -e "\t📚 See: https://docs.docker.com/compose/install/standalone/\n"
286+
287+
read -p "❓ Would you like to update 'docker-compose' now? (Y/n) " answer
288+
if [ "$answer" != "n" ]; then
289+
install_docker_stand_alone
290+
if command -v docker-compose &>/dev/null; then
291+
new_version=$(docker-compose version --short)
292+
echo "✅ 'docker-compose' has been updated to version $new_version."
293+
else
294+
echo "❌ Failed to update 'docker-compose'."
295+
exit 1
296+
fi
297+
else
298+
echo "🔁 You can update or remove 'docker-compose' manually later."
299+
fi
300+
else
301+
echo "✅ 'docker-compose' standalone is already installed and up to date (version $compose_legacy_version)."
32302
fi
33303
fi
34304

305+
35306
# Catch errors
36307
set -e
37308
function on_exit {
@@ -232,20 +503,21 @@ else
232503
docker compose up -d
233504
# Check if port is listening
234505
echo "Waiting for server to be healthy, it might take a few minutes while we initialize the database..."
235-
# Tail logs of the server until it's ready
236-
# Start logs with timeout (will automatically stop after N seconds)
237-
#docker compose logs -f fineract-server &
238-
timeout 110 docker compose logs -f fineract-server &
239-
pid=$!
240506

241507
# Fixed: Use correct container name based on directory
242-
container_name=$(docker compose ps -q fineract-server)
243-
if [ -z "$container_name" ]; then
508+
container_id=$(docker compose ps -q fineract-server)
509+
if [ -z "$container_id" ]; then
244510
echo "❌ Could not find fineract-server container"
245511
exit 1
246512
fi
247513

248-
while [ "$(docker inspect --format='{{.State.Health.Status}}' $container_name 2>/dev/null)" != "healthy" ]; do
514+
# Tail logs of the server until it's ready
515+
# Start logs with timeout (will automatically stop after N seconds)
516+
#docker compose logs -f fineract-server &
517+
docker compose logs -f fineract-server &
518+
log_pid=$!
519+
520+
while [ "$(docker inspect --format='{{.State.Health.Status}}' "$container_id" 2>/dev/null)" != "healthy" ]; do
249521
sleep 1
250522
done
251523
# Kill the logs process if still running

mariadb/docker-compose.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ services:
55
image: openmf/web-app:dev
66
restart: always
77
environment:
8-
- FINERACT_API_URLS=${SERVER_URL:-http://localhost:8080}
9-
- FINERACT_API_URL=${SERVER_URL:-http://localhost:8080}
8+
- FINERACT_API_URLS=${SERVER_URL:-http://localhost:3000}
9+
- FINERACT_API_URL=${SERVER_URL:-http://localhost:3000}
1010
- FINERACT_API_PROVIDER=/fineract-provider/api
1111
- FINERACT_API_VERSION=/v1
1212
- FINERACT_PLATFORM_TENANT_IDENTIFIER=default
@@ -15,7 +15,7 @@ services:
1515
- MIFOS_PRELOAD_CLIENTS=true
1616
- MIFOS_DEFAULT_CHAR_DELIMITER=,
1717
ports:
18-
- ${WEB_APP_PORT:-80}:${WEB_APP_PORT:-80}
18+
- ${WEB_APP_PORT:-80}:80
1919
# Database service
2020
fineractmysql:
2121
image: mariadb:11.8.2
@@ -42,11 +42,11 @@ services:
4242
volumes:
4343
- ./fineract-server/data:/data
4444
healthcheck:
45-
test: ["CMD", 'sh', '-c', 'echo -e "Checking for the availability of Fineract server deployment"; while ! nc -z "fineract-server" 8443; do sleep 1; printf "-"; done; echo -e " >> Fineract server has started";' ]
45+
test: ["CMD", 'sh', '-c', 'echo -e "Checking for the availability of Fineract server deployment"; while ! nc -z "fineract-server" ${FINERACT_PORT:-3000}; do sleep 1; printf "-"; done; echo -e " >> Fineract server has started";' ]
4646
timeout: 10s
4747
retries: 10
4848
ports:
49-
- ${FINERACT_PORT:-8080}:${FINERACT_PORT:-8080}
49+
- ${FINERACT_PORT:-3000}:8080
5050
depends_on:
5151
fineractmysql:
5252
condition: service_healthy
@@ -88,5 +88,5 @@ services:
8888
- FINERACT_DEFAULT_TENANTDB_NAME=fineract_default
8989
- FINERACT_DEFAULT_TENANTDB_DESCRIPTION=Default Demo Tenant
9090
- FINERACT_SERVER_SSL_ENABLED=false
91-
- FINERACT_SERVER_PORT=${FINERACT_PORT:-8080}
91+
- FINERACT_SERVER_PORT=8080
9292
- FINERACT_LOGGING_LEVEL=INFO

0 commit comments

Comments
 (0)