Skip to content
This repository was archived by the owner on Aug 16, 2025. It is now read-only.

Commit 92d7422

Browse files
committed
Merge branch 'develop'
2 parents c3449e3 + f81adad commit 92d7422

63 files changed

Lines changed: 803 additions & 105 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bin/projectinit.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ source ../src/filesystem/directory_management.sh
66
source ../src/info_print.sh
77
source ../src/language/flow.sh
88
source ../src/language/ask_flow.sh
9+
source ../src/tools/documentation/documentation.sh
910

1011
check_user_configuration
1112

@@ -40,12 +41,13 @@ configure_gitattributes
4041
#---
4142

4243
run_flow
44+
setup_documentation
4345
generate_project_id_card_text
4446

4547
echo ""
4648
echo "-------------------------------------------------"
4749
echo "ProjectInit completed setting up your project at: ${project_root_dir}"
48-
echo "Take a look at ${project_root_dir}/PROJECTINIT_README.adoc for more info and maintenance instructions."
50+
echo "Take a look at ${project_root_dir}/doc/projectinit/index.adoc for more info and maintenance instructions."
4951
if [ "${projectinit_generate_id_card_text}" = 1 ]; then
5052
echo "Text version of the Project ID card is available at ${project_root_dir}/projectinit_id_card.txt"
5153
fi

doc/dev/globals.adoc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ contains your application
8989
|0/1 flag
9090
|Flag to show if Docker compose file has secrets.
9191

92+
|`projectinit_compose_has_root_volumes`
93+
|0/1 flag
94+
|Flag to show if Docker compose file has root volumes.
95+
9296
|===
9397

9498
== Project
@@ -222,9 +226,13 @@ contains your application
222226
|Autogenerated from `projectinit_project_name` by adding `_database` suffix. Database container service name
223227

224228
|`projectinit_database_host_port`
225-
|string value
229+
|integer (string representation)
226230
|Database container host port
227231

232+
|`projectinit_database_x_plugin_host_port`
233+
|integer (string representation)
234+
|X Plugin host port. Available for MySQL and its forks (MariaDB, Percona for MySQL).
235+
228236
|===
229237

230238
== Caching

src/container/docker/dev.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
#!/bin/bash
22

33
build_dev() {
4+
echo ""
5+
echo "Performing configuration cleanup..."
6+
cleanup_before_build
7+
echo "Configuration ready..."
48
echo ""
59
echo "Building Dev container..."
610
cd "${project_root_dir}" || exit 1
711
docker compose --env-file .env.docker build
812
echo " Dev container built..."
13+
}
14+
15+
cleanup_before_build() {
16+
if [ "${projectinit_compose_has_root_volumes}" = 1 ]; then
17+
perl -pi -e "s/~~~root volumes~~~/volumes:/g" "${project_root_dir}/compose.yaml"
18+
else
19+
perl -pi -e "s/~~~root volumes~~~//g" "${project_root_dir}/compose.yaml"
20+
fi
921
}

src/database/database_flow.sh

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,42 @@ setup_database_docker_compose_dev() {
99
"pgsql" )
1010
# shellcheck source=../database/pgsql/v1/pqsql.sh
1111
source "${tool_dir}/src/database/pgsql/v1/pqsql.sh"
12-
setup_docker_compose_dev
12+
setup_pgsql_docker_compose_dev
1313
;;
1414
"mysql" )
15+
projectinit_compose_has_root_volumes=1
16+
projectinit_compose_has_secrets=1
1517
# shellcheck source=../database/mysql/v1/mysql.sh
1618
source "${tool_dir}/src/database/mysql/v1/mysql.sh"
17-
setup_docker_compose_dev
19+
setup_mysql_docker_compose_dev
20+
setup_mysql_my_cnf_dev
21+
setup_mysql_dev_entrypoint
22+
setup_mysql_dev_dockerfile
1823
;;
1924
"percona" )
25+
projectinit_compose_has_root_volumes=1
26+
projectinit_compose_has_secrets=1
2027
# shellcheck source=../database/percona/v1/percona.sh
2128
source "${tool_dir}/src/database/percona/v1/percona.sh"
22-
setup_docker_compose_dev
29+
setup_percona_docker_compose_dev
30+
setup_percona_my_cnf_dev
31+
setup_percona_dev_entrypoint
32+
setup_percona_dev_dockerfile
2333
;;
2434
"mariadb" )
35+
projectinit_compose_has_root_volumes=1
36+
projectinit_compose_has_secrets=1
2537
# shellcheck source=../database/mariadb/v1/mariadb.sh
2638
source "${tool_dir}/src/database/mariadb/v1/mariadb.sh"
27-
setup_docker_compose_dev
39+
setup_mariadb_docker_compose_dev
40+
setup_mariadb_my_cnf_dev
41+
setup_mariadb_dev_entrypoint
42+
setup_mariadb_dev_dockerfile
2843
;;
2944
esac
3045

3146
if [ ! "${projectinit_database_type}" = "no database" ]; then
32-
perl -pi -e "s/(.*depends_on:.*)/\1\n - ${projectinit_database_service_name}/" "${project_root_dir}/compose.yaml"
47+
perl -pi -e "s/(.*depends_on:.*)/\1\n ${projectinit_database_service_name}:\n condition: service_healthy/" "${project_root_dir}/compose.yaml"
3348
fi
3449
}
3550

@@ -42,22 +57,31 @@ setup_database_docker_compose_prod() {
4257
"pgsql" )
4358
# shellcheck source=../database/pgsql/v1/pqsql.sh
4459
source "${tool_dir}/src/database/pgsql/v1/pqsql.sh"
45-
setup_docker_compose_prod
60+
setup_pgsql_docker_compose_prod
4661
;;
4762
"mysql" )
4863
# shellcheck source=../database/mysql/v1/mysql.sh
4964
source "${tool_dir}/src/database/mysql/v1/mysql.sh"
50-
setup_docker_compose_prod
65+
setup_mysql_docker_compose_prod
66+
setup_mysql_my_cnf_prod
67+
setup_mysql_prod_entrypoint
68+
setup_mysql_prod_dockerfile
5169
;;
5270
"percona" )
5371
# shellcheck source=../database/percona/v1/percona.sh
5472
source "${tool_dir}/src/database/percona/v1/percona.sh"
55-
setup_docker_compose_prod
73+
setup_percona_docker_compose_prod
74+
setup_percona_my_cnf_prod
75+
setup_percona_prod_entrypoint
76+
setup_percona_prod_dockerfile
5677
;;
5778
"mariadb" )
5879
# shellcheck source=../database/mariadb/v1/mariadb.sh
5980
source "${tool_dir}/src/database/mariadb/v1/mariadb.sh"
60-
setup_docker_compose_prod
81+
setup_mariadb_docker_compose_prod
82+
setup_mariadb_my_cnf_prod
83+
setup_mariadb_prod_entrypoint
84+
setup_mariadb_prod_dockerfile
6185
;;
6286
esac
6387

src/database/mariadb/ask_mariadb.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ ask_mariadb_config() {
1616
projectinit_database_password=$(read_password)
1717
echo " Root password:"
1818
projectinit_database_root_password=$(read_password)
19-
echo " Host port:"
19+
echo " Host port for MariaDB server (container port is 3306):"
2020
read -r -e projectinit_database_host_port
21+
echo " Host port for X plugin (container port is 33060)"
22+
read -r -e projectinit_database_x_plugin_host_port
2123
}

src/database/mariadb/v1/mariadb.sh

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
#!/bin/bash
22

3-
setup_docker_compose_dev() {
3+
setup_mariadb_docker_compose_dev() {
44
local target_file
55
target_file="${project_root_dir}/compose.yaml"
66

77
perl -pi -e "s/~~~database service~~~/$(<"${tool_dir}/src/database/mariadb/v1/template/dev" perl -pe 's/([\/\& \t])/\\$1/g')/g" "${target_file}"
88
perl -pi -e "s/~~~database service name~~~/${projectinit_database_service_name}/g" "${target_file}"
99
perl -pi -e "s/~~~database container name~~~/${projectinit_database_service_name}/g" "${target_file}"
10-
perl -pi -e "s/~~~database server version~~~/${projectinit_database_version}/g" "${target_file}"
1110
perl -pi -e "s/~~~database host port~~~/${projectinit_database_host_port}/g" "${target_file}"
11+
perl -pi -e "s/~~~x plugin host port~~~/${projectinit_database_x_plugin_host_port}/g" "${target_file}"
12+
perl -pi -e "s/~~~root volumes~~~/~~~root volumes~~~\n ${projectinit_database_service_name}_volume:/g" "${target_file}"
1213

13-
projectinit_compose_has_secrets=1
1414
mkdir -p "${project_root_dir}/compose_secrets"
1515
touch "${project_root_dir}/compose_secrets/mariadb_password.txt"
1616
echo "${projectinit_database_password}" >> "${project_root_dir}/compose_secrets/mariadb_password.txt"
@@ -24,7 +24,7 @@ setup_docker_compose_dev() {
2424
perl -pi -e "s/~~~compose secrets~~~/$(<"${tool_dir}/src/database/mariadb/v1/template/secrets" perl -pe 's/([\/\& \t])/\\$1/g')/g" "${target_file}"
2525
}
2626

27-
setup_docker_compose_prod() {
27+
setup_mariadb_docker_compose_prod() {
2828
local target_file
2929
target_file="${project_root_dir}/projectinit_docker/prod/compose.yaml"
3030
if [ ! -d "${project_root_dir}/projectinit_docker/prod" ]; then
@@ -34,8 +34,59 @@ setup_docker_compose_prod() {
3434
perl -pi -e "s/~~~database service~~~/$(<"${tool_dir}/src/database/mariadb/v1/template/prod" perl -pe 's/([\/\& \t])/\\$1/g')/g" "${target_file}"
3535
perl -pi -e "s/~~~database service name~~~/${projectinit_database_service_name}/g" "${target_file}"
3636
perl -pi -e "s/~~~database container name~~~/${projectinit_database_service_name}/g" "${target_file}"
37-
perl -pi -e "s/~~~database server version~~~/${projectinit_database_version}/g" "${target_file}"
3837
perl -pi -e "s/~~~database host port~~~/${projectinit_database_host_port}/g" "${target_file}"
38+
perl -pi -e "s/~~~x plugin host port~~~/${projectinit_database_x_plugin_host_port}/g" "${target_file}"
39+
perl -pi -e "s/~~~root volumes~~~/~~~root volumes~~~\n ${projectinit_database_service_name}_volume:/g" "${target_file}"
3940

4041
perl -pi -e "s/~~~compose secrets~~~/$(<"${tool_dir}/src/database/mariadb/v1/template/secrets" perl -pe 's/([\/\& \t])/\\$1/g')/g" "${target_file}"
42+
}
43+
44+
setup_mariadb_dev_dockerfile() {
45+
local target_file
46+
target_file="${project_root_dir}/projectinit_docker/dev/mariadb/Dockerfile"
47+
48+
cp -f "${tool_dir}/src/database/mariadb/v1/template/dockerfile/dev" "${target_file}"
49+
perl -pi -e "s/~~~database server version~~~/${projectinit_database_version}/g" "${target_file}"
50+
}
51+
52+
setup_mariadb_prod_dockerfile() {
53+
local target_file
54+
target_file="${project_root_dir}/projectinit_docker/prod/mariadb/Dockerfile"
55+
56+
cp -f "${tool_dir}/src/database/mariadb/v1/template/dockerfile/prod" "${target_file}"
57+
perl -pi -e "s/~~~database server version~~~/${projectinit_database_version}/g" "${target_file}"
58+
}
59+
60+
setup_mariadb_my_cnf_dev() {
61+
if [ ! -d "${project_root_dir}/projectinit_docker/dev/mariadb/etc/mysql/conf.d" ]; then
62+
mkdir -p "${project_root_dir}/projectinit_docker/dev/mariadb/etc/mysql/conf.d"
63+
fi
64+
65+
cp -f "${tool_dir}/src/database/mariadb/v1/template/my_cnf/dev_my.cnf" "${project_root_dir}/projectinit_docker/dev/mariadb/etc/mysql/conf.d/my.cnf"
66+
chmod 644 "${project_root_dir}/projectinit_docker/dev/mariadb/etc/mysql/conf.d/my.cnf"
67+
}
68+
69+
setup_mariadb_my_cnf_prod() {
70+
if [ ! -d "${project_root_dir}/projectinit_docker/prod/mariadb/etc/mysql/conf.d" ]; then
71+
mkdir -p "${project_root_dir}/projectinit_docker/prod/mariadb/etc/mysql/conf.d"
72+
fi
73+
74+
cp -f "${tool_dir}/src/database/mariadb/v1/template/my_cnf/prod_my.cnf" "${project_root_dir}/projectinit_docker/prod/mariadb/etc/mysql/conf.d/my.cnf"
75+
chmod 644 "${project_root_dir}/projectinit_docker/prod/mariadb/etc/mysql/conf.d/my.cnf"
76+
}
77+
78+
setup_mariadb_dev_entrypoint() {
79+
if [ ! -d "${project_root_dir}/projectinit_docker/dev/mariadb" ]; then
80+
mkdir -p "${project_root_dir}/projectinit_docker/dev/mariadb"
81+
fi
82+
83+
cp -f "${tool_dir}/src/database/mariadb/v1/template/entrypoint/dev.sh" "${project_root_dir}/projectinit_docker/dev/mariadb/entrypoint.sh"
84+
}
85+
86+
setup_mariadb_prod_entrypoint() {
87+
if [ ! -d "${project_root_dir}/projectinit_docker/prod/mariadb" ]; then
88+
mkdir -p "${project_root_dir}/projectinit_docker/prod/mariadb"
89+
fi
90+
91+
cp -f "${tool_dir}/src/database/mariadb/v1/template/entrypoint/prod.sh" "${project_root_dir}/projectinit_docker/prod/mariadb/entrypoint.sh"
4192
}

src/database/mariadb/v1/template/dev

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
~~~database service name~~~:
22
container_name: ~~~database container name~~~
3-
image: mariadb:~~~database server version~~~
3+
build:
4+
context: ./
5+
dockerfile: ./projectinit_docker/dev/mariadb/Dockerfile
46
restart: always
57
environment:
68
MARIADB_DATABASE_FILE: /run/secrets/mariadb_database
79
MARIADB_USER_FILE: /run/secrets/mariadb_user
810
MARIADB_PASSWORD_FILE: /run/secrets/mariadb_password
911
MARIADB_ROOT_PASSWORD_FILE: /run/secrets/mariadb_root_password
1012
ports:
11-
- '~~~database host port~~~:3306'
13+
- "~~~database host port~~~:3306"
14+
- "~~~x plugin host port~~~:33060"
1215
volumes:
13-
- ./database_volume:/var/lib/mysql
16+
- ~~~database service name~~~_volume:/var/lib/mysql
17+
healthcheck:
18+
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
19+
timeout: 10s
20+
start_period: 1m
1421
secrets:
1522
- mariadb_database
1623
- mariadb_user
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM mariadb:~~~database server version~~~
2+
3+
ENV MARIADB_MYSQL_LOCALHOST_USER=1
4+
5+
COPY --chown=mysql:mysql --chmod=644 ./projectinit_docker/dev/mariadb/etc/mysql/conf.d/*.cnf /etc/mysql/conf.d/
6+
COPY --chown=mysql:mysql ./projectinit_docker/dev/mariadb/entrypoint.sh /entrypoint.sh
7+
8+
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM mariadb:~~~database server version~~~
2+
3+
ENV MARIADB_MYSQL_LOCALHOST_USER=1
4+
5+
COPY --chown=mysql:mysql --chmod=644 ./projectinit_docker/dev/mariadb/etc/mysql/conf.d/*.cnf /etc/mysql/conf.d/
6+
COPY --chown=mysql:mysql ./projectinit_docker/dev/mariadb/entrypoint.sh /entrypoint.sh
7+
8+
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
== Implemented configuration
2+
3+
The following configuration has been implemented by ProjectInit:
4+
5+
* Database credentials as Docker compose secrets.
6+
* Docker volume is used for persisting data on the host.
7+
* Healthcheck is implemented in Docker Compose.
8+
* Custom `my.cnf` MariaDB configuration file and directory are prepared.
9+
10+
=== Configuration files
11+
12+
* Database credentials (Docker Compose secrets):
13+
** link:../../compose_secrets/mysql_database.txt[`compose_secrets/mysql_database.txt`]
14+
** link:../../compose_secrets/mysql_password.txt[`compose_secrets/mysql_password.txt`]
15+
** link:../../compose_secrets/mysql_root_password.txt[`compose_secrets/mysql_root_password.txt`]
16+
** link:../../compose_secrets/mysql_user.txt[`compose_secrets/mysql_user.txt`]
17+
* Dockerfile:
18+
** link:../../projectinit_docker/dev/mariadb/Dockerfile[`projectinit_docker/dev/mariadb/Dockerfile`]
19+
** link:../../projectinit_docker/prod/mariadb/Dockerfile[`projectinit_docker/prod/mariadb/Dockerfile`]
20+
* Entry point:
21+
** link:../../projectinit_docker/dev/mariadb/entrypoint.sh[`projectinit_docker/dev/mariadb/entrypoint.sh`]
22+
** link:../../projectinit_docker/prod/mariadb/entrypoint.sh[`projectinit_docker/prod/mariadb/entrypoint.sh`]
23+
* Custom MariaDB configuration directory:
24+
** link:../../projectinit_docker/dev/mariadb/etc/mysql/conf.d/[`projectinit_docker/dev/mariadb/etc/mysql/conf.d/`]
25+
** link:../../projectinit_docker/prod/mariadb/etc/mysql/conf.d/[`projectinit_docker/prod/mariadb/etc/mysql/conf.d/`]
26+
* Custom MariaDB configuration file:
27+
** link:../../projectinit_docker/dev/mariadb/etc/mysql/conf.d/my.cnf[`projectinit_docker/dev/mariadb/etc/mysql/conf.d/my.cnf`]
28+
** link:../../projectinit_docker/prod/mariadb/etc/mysql/conf.d/my.cnf[`projectinit_docker/prod/mariadb/etc/mysql/conf.d/my.cnf`]
29+
30+
=== Database credentials
31+
32+
Database credentials are stored as Docker Compose secrets. The secrets are available in
33+
link:../../compose_secrets[`compose_secrets`] directory of your project.
34+
35+
Resources:
36+
37+
* link:https://docs.docker.com/compose/how-tos/use-secrets/[How to use secrets in Docker Compose]
38+
39+
=== Persisting data on the host
40+
41+
Docker volume is used for persisting data on the host. This is the default method recommended in the documentation of
42+
the official Docker image. Volume file and directory permissions are managed by Docker. You are free to mount a local
43+
directory instead (bind mount), however, you will need to set up the directory, its owner (user), permissions and other
44+
security mechanisms yourself.
45+
46+
Resources:
47+
48+
* link:https://docs.docker.com/engine/storage/volumes/[Docker Volumes]
49+
* link:https://docs.docker.com/engine/storage/bind-mounts/[Docker bind mounts]
50+
51+
=== Healthcheck
52+
53+
Official MariaDB healthcheck script is implemented in Docker Compose. It makes sure that the MariaDB container is up
54+
before allowing your application to run.
55+
56+
Resources:
57+
58+
* link:https://mariadb.com/kb/en/using-healthcheck-sh/[`healthcheck.sh` Official MariaDB documentation]
59+
* link:https://docs.docker.com/reference/compose-file/services/#healthcheck[Healthcheck Docker service property]
60+
61+
=== Custom MariaDB configuration
62+
63+
Custom MariaDB configuration directory is implemented and ready in
64+
link:../../projectinit_docker/dev/mariadb/etc/mysql/conf.d/[`projectinit_docker/dev/mariadb/etc/mysql/conf.d/`] and
65+
link:../../projectinit_docker/prod/mariadb/etc/mysql/conf.d/[`projectinit_docker/prod/mariadb/etc/mysql/conf.d/`]. `*.cnf` files in
66+
this directory will be added to the container when you build it.
67+
68+
You can also use already added `my.cnf` file.

0 commit comments

Comments
 (0)