Skip to content

Commit f916971

Browse files
committed
update scripts to use env variable, add sync gateway support
1 parent 951d43a commit f916971

File tree

17 files changed

+336
-40
lines changed

17 files changed

+336
-40
lines changed

src/couchbase-server/devcontainer-feature.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"id": "couchbase-server",
44
"version": "1.0.0",
55
"description": "Installs Couchbase Server along with needed dependencies.",
6+
"documentationURL": "https://github.com/couchbase-starter-kit/devcontainer-features/tree/main/src/couchbase-server",
67
"options": {
78
"cbversion": {
89
"type": "string",
@@ -22,7 +23,7 @@
2223
}
2324
],
2425
"containerEnv": {
25-
"PATH": "${PATH}:/opt/couchbase/bin:/opt/couchbase/bin/tools:/opt/couchbase/bin/install",
26+
"PATH": "/opt/couchbase/bin:/opt/couchbase/bin/tools:/opt/couchbase/bin/install:${PATH}",
2627
"COUCHBASE_CONNECTION_STRING": "couchbase://localhost",
2728
"COUCHBASE_USERNAME": "Administrator",
2829
"COUCHBASE_PASSWORD": "password",

src/couchbase-server/install.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ setup_couchbase() {
8787
cp $BASE_DIR/entrypoint.sh /entrypoint.sh
8888

8989
# Add couchbase-shell config
90-
cp $BASE_DIR/cbshconfig /opt/couchbase/cbshconfig
9190
cp $BASE_DIR/installCbshConfig.sh /opt/couchbase/installCbshConfig.sh
9291
}
9392

src/couchbase-server/scripts/cbshconfig

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/couchbase-server/scripts/configure-node.sh

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/bin/sh
1+
#!/bin/bash
22

33
# Log all subsequent commands to logfile. FD 3 is now the console
44
# for things we want to show up in "docker logs".
@@ -9,7 +9,7 @@ CONFIG_DONE_FILE=/opt/couchbase/var/lib/couchbase/container-configured
99
config_done() {
1010
touch ${CONFIG_DONE_FILE}
1111
echo "Couchbase Admin UI: http://localhost:8091" \
12-
"\nLogin credentials: Administrator / password" | tee /dev/fd/3
12+
"\nLogin credentials: $COUCHBASE_USERNAME / $COUCHBASE_PASSWORD" | tee /dev/fd/3
1313
echo "Stopping config-couchbase service"
1414
sv stop /etc/service/config-couchbase
1515
}
@@ -39,6 +39,19 @@ wait_for_uri() {
3939
echo "$uri ready, continuing"
4040
}
4141

42+
wait_for_response() {
43+
echo "Waiting for $expected response to be available..."
44+
while true; do
45+
status=$(curl http://127.0.0.1:8091/pools/default/buckets/$COUCHBASE_DEFAULT_BUCKET/scopes -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD | jq -c $*)
46+
if [ "$status" = "null" ]; then
47+
break
48+
fi
49+
echo "$expected reponse not up yet, waiting 2 seconds..."
50+
sleep 2
51+
done
52+
echo "$expected reponse ready, continuing"
53+
}
54+
4255
panic() {
4356
cat <<EOF 1>&3
4457
@@ -50,6 +63,7 @@ EOF
5063
cat $LOGFILE 1>&3
5164
echo 1>&3
5265
kill -HUP 1
66+
sv stop /etc/service/config-couchbase &
5367
exit
5468
}
5569

@@ -82,36 +96,62 @@ curl_check http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2C
8296
echo
8397

8498
echo "Setting up credentials with curl:"
85-
curl_check http://127.0.0.1:8091/settings/web -d port=8091 -d username=Administrator -d password=password
99+
curl_check http://127.0.0.1:8091/settings/web -d port=8091 -d username=$COUCHBASE_USERNAME -d $COUCHBASE_PASSWORD=$COUCHBASE_PASSWORD
86100
echo
87101

88102
echo "Enabling memory-optimized indexes with curl:"
89-
curl_check -u Administrator:password -X POST http://127.0.0.1:8091/settings/indexes -d 'storageMode=memory_optimized'
103+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X POST http://127.0.0.1:8091/settings/indexes -d 'storageMode=memory_optimized'
90104
echo
91105

92106
echo "Loading travel-sample with curl:"
93-
curl_check -u Administrator:password -X POST http://127.0.0.1:8091/sampleBuckets/install -d '["travel-sample"]'
107+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X POST http://127.0.0.1:8091/sampleBuckets/install -d '["travel-sample"]'
94108
echo
95109

96-
wait_for_uri 200 http://127.0.0.1:8091/pools/default/buckets/travel-sample -u Administrator:password
110+
wait_for_uri 200 http://127.0.0.1:8091/pools/default/buckets/travel-sample -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD
97111

98112
echo "Creating hotels FTS index with curl:"
99-
curl_check -u Administrator:password -X PUT http://127.0.0.1:8094/api/index/hotels -H Content-Type:application/json -d @/opt/couchbase/create-index.json
113+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X PUT http://127.0.0.1:8094/api/index/hotels -H Content-Type:application/json -d @/opt/couchbase/create-index.json
100114
rm /opt/couchbase/create-index.json
101115
echo
102116

103117
echo "Creating RBAC 'admin' user on travel-sample bucket"
104118
couchbase_cli_check user-manage --set \
105-
--rbac-username admin --rbac-password password \
119+
--rbac-username admin --rbac-password $COUCHBASE_PASSWORD \
106120
--roles 'bucket_full_access[travel-sample]' --auth-domain local \
107-
-c 127.0.0.1 -u Administrator -p password
121+
-c 127.0.0.1 -u $COUCHBASE_USERNAME -p $COUCHBASE_PASSWORD
108122
echo
109123

110-
# Configure Couchbase Shell
111-
ls /home | xargs -i mkdir /home/{}/.cbsh
112-
ls /home | xargs -i cp opt/couchbase/cbshconfig /home/{}/.cbsh/config
113-
mkdir /root/.cbsh
114-
cp /opt/couchbase/cbshconfig /root/.cbsh/config
124+
125+
if [ -z "${COUCHBASE_DEFAULT_BUCKET}" ]; then
126+
echo "COUCHBASE_DEFAULT_BUCKET not defined, skip Bucket creation" | tee /dev/fd/3
127+
else
128+
echo "COUCHBASE_DEFAULT_BUCKET found, creating bucket $COUCHBASE_DEFAULT_BUCKET" | tee /dev/fd/3
129+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets/ -d name=$COUCHBASE_DEFAULT_BUCKET -d bucketType=couchbase -d ramQuota=256
130+
wait_for_uri 200 http://127.0.0.1:8091/pools/default/buckets/$COUCHBASE_DEFAULT_BUCKET -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD
131+
if [ -z "${COUCHBASE_DEFAULT_SCOPE}" ]; then
132+
echo "COUCHBASE_DEFAULT_SCOPE not defined, skip Scope creation" | tee /dev/fd/3
133+
else
134+
echo "COUCHBASE_DEFAULT_SCOPE found, creating scope $COUCHBASE_DEFAULT_SCOPE." | tee /dev/fd/3
135+
if [ ${COUCHBASE_DEFAULT_SCOPE:0:1} == "_" ] || [ ${COUCHBASE_DEFAULT_SCOPE:0:1} == "%" ]; then
136+
echo "Skip because name starts with _ or %"| tee /dev/fd/3
137+
else
138+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets/$COUCHBASE_DEFAULT_BUCKET/scopes -d name=$COUCHBASE_DEFAULT_SCOPE
139+
wait_for_response ".scopes | map(select(.name ==\"$COUCHBASE_DEFAULT_SCOPE\"))[0]"
140+
fi
141+
if [ -z "${COUCHBASE_DEFAULT_COLLECTION}" ]; then
142+
echo "COUCHBASE_DEFAULT_COLLECTION not defined, skip Collection creation" | tee /dev/fd/3
143+
else
144+
echo "COUCHBASE_DEFAULT_COLLECTION found, creating scope $COUCHBASE_DEFAULT_COLLECTION." | tee /dev/fd/3
145+
if [ ${COUCHBASE_DEFAULT_COLLECTION:0:1} == "_" ] || [ ${COUCHBASE_DEFAULT_COLLECTION:0:1} == "%" ]; then
146+
echo "Skip because name starts with _ or %"| tee /dev/fd/3
147+
else
148+
curl_check -u $COUCHBASE_USERNAME:$COUCHBASE_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets/$COUCHBASE_DEFAULT_BUCKET/scopes/$COUCHBASE_DEFAULT_SCOPE -d name=$COUCHBASE_DEFAULT_COLLECTION
149+
wait_for_response ".scopes | map(select(.name ==\"$COUCHBASE_DEFAULT_SCOPE\"))[0].collections | map(select(.name == \"$COUCHBASE_DEFAULT_COLLECTION\"))[0]"
150+
fi
151+
fi
152+
fi
153+
fi
154+
115155

116156
echo "Configuration completed!" | tee /dev/fd/3
117157

src/couchbase-server/scripts/installCbshConfig.sh

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,27 @@
1-
#!/bin/sh
1+
#!/bin/bash
2+
3+
cat << EOF > /opt/couchbase/cbshconfig
4+
5+
version = 1
6+
7+
[[cluster]]
8+
identifier = "local"
9+
connstr = "$COUCHBASE_CONNECTION_STRING"
10+
default-bucket = "$COUCHBASE_DEFAULT_BUCKET"
11+
default-scope = "$COUCHBASE_DEFAULT_SCOPE"
12+
default-collection = "$COUCHBASE_DEFAULT_COLLECTION"
13+
username = "$COUCHBASE_USERNAME"
14+
password = "$COUCHBASE_PASSWORD"
15+
data-timeout = "5s"
16+
connect-timeout = "1m 15s"
17+
search-timeout = "1m 15s"
18+
analytics-timeout = "1m 15s"
19+
management-timeout = "1m 15s"
20+
tls-enabled = false
21+
tls-accept-all-certs = false
22+
23+
EOF
24+
225

326
# Configure Couchbase Shell for Root and any found users
427
ls /home | xargs -i mkdir /home/{}/.cbsh

src/couchbase-sg/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
# Couchbase Sync Gateway (couchbase-sg)
3+
4+
Install Couchbase Sync Gateway
5+
6+
## Example Usage
7+
8+
```json
9+
"features": {
10+
"ghcr.io/couchbase-starter-kit/devcontainer-features/couchbase-sg:1": {}
11+
}
12+
```
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "Couchbase Sync Gateway",
3+
"id": "couchbase-sg",
4+
"version": "1.0.0",
5+
"description": "Installs Couchbase Sync Gateway along with needed dependencies.",
6+
"documentationURL": "https://github.com/couchbase-starter-kit/devcontainer-features/tree/main/src/couchbase-sg",
7+
"options": {
8+
"sgversion": {
9+
"type": "string",
10+
"proposals": [
11+
"3.2.0"
12+
],
13+
"default": "3.2.0",
14+
"description": "Select or enter a version of Couchbase Sync Gateway"
15+
}
16+
},
17+
"containerEnv": {
18+
"PATH": "/opt/couchbase-sync-gateway/bin:${PATH}"
19+
},
20+
"privileged": true,
21+
"installsAfter": [
22+
"ghcr.io/devcontainers/features/common-utils"
23+
]
24+
}

src/couchbase-sg/install.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/usr/bin/env bash
2+
# Default: Exit on any failure.
3+
set -e
4+
5+
# Clean up
6+
rm -rf /var/lib/apt/lists/*
7+
8+
# Setup STDERR.
9+
err() {
10+
echo "(!) $*" >&2
11+
}
12+
13+
if [ "$(id -u)" -ne 0 ]; then
14+
err 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
15+
exit 1
16+
fi
17+
18+
# Determine the appropriate non-root user
19+
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
20+
USERNAME=""
21+
POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)")
22+
for CURRENT_USER in "${POSSIBLE_USERS[@]}"; do
23+
if id -u ${CURRENT_USER} > /dev/null 2>&1; then
24+
USERNAME=${CURRENT_USER}
25+
break
26+
fi
27+
done
28+
if [ "${USERNAME}" = "" ]; then
29+
USERNAME=root
30+
fi
31+
elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
32+
USERNAME=root
33+
fi
34+
35+
apt_get_update()
36+
{
37+
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
38+
echo "Running apt-get update..."
39+
apt-get update -y
40+
fi
41+
}
42+
43+
# Checks if packages are installed and installs them if not
44+
check_packages() {
45+
if ! dpkg -s "$@" > /dev/null 2>&1; then
46+
apt_get_update
47+
apt-get -y install --no-install-recommends "$@"
48+
fi
49+
}
50+
51+
setup_sg() {
52+
mkdir /opt/couchbase-sync-gateway/data
53+
mkdir -p /etc/service/couchbase-sg/supervise
54+
cp $BASE_DIR/scripts/run /etc/service/couchbase-sg/run
55+
chown -R couchbase:couchbase /etc/service /etc/service/couchbase-sg/supervise
56+
mkdir /etc/sync_gateway
57+
cp $BASE_DIR/scripts/config.json /etc/sync_gateway/config.json
58+
chown -R sync_gateway:sync_gateway /etc/sync_gateway
59+
mkdir -p /var/log/sync_gateway
60+
chown sync_gateway:sync_gateway /var/log/sync_gateway
61+
}
62+
63+
install_sg() {
64+
# Install dependencies
65+
check_packages curl lsb-release systemctl wget
66+
SG_VERSION=${SGVERSION:-"3.2.0"}
67+
SGW_PACKAGE="http://packages.couchbase.com/releases/couchbase-sync-gateway/${SG_VERSION}/couchbase-sync-gateway-enterprise_${SG_VERSION}_@@ARCH@@.deb"
68+
69+
SGW_PACKAGE=$(echo "${SGW_PACKAGE}" | sed -e "s/@@ARCH@@/$(uname -m)/")
70+
SGW_PACKAGE_FILENAME=$(echo "couchbase-sync-gateway-enterprise_${SG_VERSION}_@@ARCH@@.deb" | sed -e "s/@@ARCH@@/$(uname -m)/")
71+
wget "${SGW_PACKAGE}"
72+
apt install -y ./"${SGW_PACKAGE_FILENAME}"
73+
rm "${SGW_PACKAGE_FILENAME}"
74+
apt autoremove
75+
apt clean
76+
}
77+
78+
export DEBIAN_FRONTEND=noninteractive
79+
80+
export BASE_DIR=$PWD
81+
CLEANUP_COMMAND="rm -rf /var/lib/apt/lists/* /var/tmp/*" # /tmp/*
82+
83+
84+
install_sg
85+
setup_sg
86+
87+
# Clean up
88+
rm -f ./$SGW_PACKAGE
89+
${CLEANUP_COMMAND}
90+
91+
echo "Done!"
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"bootstrap": {
3+
"server": "${COUCHBASE_CONNECTION_STRING}",
4+
"username": "${COUCHBASE_USERNAME}",
5+
"password": "${COUCHBASE_PASSWORD}",
6+
"server_tls_skip_verify": true,
7+
"use_tls_server": false
8+
},
9+
"logging": {
10+
"log_file_path": "/var/tmp/sglogs",
11+
"redaction_level": "partial",
12+
"console": {
13+
"log_level": "error",
14+
"log_keys": ["*"]
15+
},
16+
"error": {
17+
"enabled": true,
18+
"rotation": {
19+
"max_size": 20,
20+
"max_age": 180
21+
}
22+
},
23+
"warn": {
24+
"enabled": true,
25+
"rotation": {
26+
"max_size": 20,
27+
"max_age": 90
28+
}
29+
},
30+
"info": {
31+
"enabled": false
32+
},
33+
"debug": {
34+
"enabled": false
35+
}
36+
}
37+
}
38+
39+

0 commit comments

Comments
 (0)