mirror of
https://codeberg.org/icewind/haze.git
synced 2026-06-03 09:04:12 +02:00
add oracle support
This commit is contained in:
parent
9f8a3b1be8
commit
a1c8e3c338
9 changed files with 92 additions and 14 deletions
|
|
@ -36,8 +36,8 @@ See the [configuration section](#configuration) for more options.
|
||||||
haze start [database] [php-version]
|
haze start [database] [php-version]
|
||||||
```
|
```
|
||||||
|
|
||||||
Where `database` is one of `sqlite`, `mysql`, `mariadb` or `pgsql` with an optional version (e.g. `pgsql:12`), defaults to `sqlite`.
|
Where `database` is one of `sqlite`, `mysql`, `mariadb`, `pgsql` or `oracle` with an optional version (e.g. `pgsql:12`), defaults to `sqlite`.
|
||||||
And `php-version` is one of `7.3`, `7.4`, `8.0`, `8.1`, `7` or `8`, defaults to `8.1`
|
And `php-version` is one of `8.0`, `8.1`, `8.2`, defaults to `8.1`. `7.3` and `7.4` are still supported but the docker images for those versions aren't being updated anymore so they might be missing some newer features.
|
||||||
|
|
||||||
Additionally, you can use the following options when starting an instance:
|
Additionally, you can use the following options when starting an instance:
|
||||||
- `s3`: setup an S3 server and configure to Nextcloud to use it as primary storage
|
- `s3`: setup an S3 server and configure to Nextcloud to use it as primary storage
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ set -e
|
||||||
|
|
||||||
export DOCKER_BUILDKIT=1
|
export DOCKER_BUILDKIT=1
|
||||||
|
|
||||||
versions=("7.3" "7.4" "8.0" "8.1")
|
versions=("8.0" "8.1" "8.2")
|
||||||
|
|
||||||
for version in "${versions[@]}"; do
|
for version in "${versions[@]}"; do
|
||||||
echo "building haze-php-$version"
|
echo "building haze-php-$version"
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
$AUTOCONFIG = [
|
$AUTOCONFIG = [
|
||||||
'dbname' => 'xe',
|
'dbname' => 'xe',
|
||||||
'dbhost' => 'oci',
|
'dbhost' => 'oracle',
|
||||||
'dbuser' => 'system',
|
'dbuser' => 'system',
|
||||||
'dbpass' => 'oracle',
|
'dbpass' => 'haze',
|
||||||
'dbtype' => 'oci'
|
'dbtype' => 'oci'
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ cd $WEBROOT
|
||||||
|
|
||||||
if [ "$SQL" = "oci" ]; then
|
if [ "$SQL" = "oci" ]; then
|
||||||
# oracle is a special snowflake
|
# oracle is a special snowflake
|
||||||
occ maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=$SQL --database-name=xe --database-host=$SQL --database-user=system --database-pass=oracle
|
occ maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=$SQL --database-name=xe --database-host=$SQL --database-user=system --database-pass=haze
|
||||||
elif [ "$SQL" = "mariadb" ]; then
|
elif [ "$SQL" = "mariadb" ]; then
|
||||||
occ maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=mysql --database-name=haze --database-host=$SQL --database-user=haze --database-pass=haze
|
occ maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=mysql --database-name=haze --database-host=$SQL --database-user=haze --database-pass=haze
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,11 @@ RUN echo "extension=imagick.so" > $PHP_INI_DIR/conf.d/imagick.ini \
|
||||||
&& echo "memory_limit = 512M" > $PHP_INI_DIR/conf.d/memory_limit.ini \
|
&& echo "memory_limit = 512M" > $PHP_INI_DIR/conf.d/memory_limit.ini \
|
||||||
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
|
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
|
||||||
|
|
||||||
|
ADD install-oci.sh /
|
||||||
|
RUN /install-oci.sh \
|
||||||
|
&& echo "extension=oci8.so" > $PHP_INI_DIR/conf.d/oci8.ini
|
||||||
|
|
||||||
|
|
||||||
ADD apcu.ini opcache.ini redis.ini $PHP_INI_DIR/conf.d/
|
ADD apcu.ini opcache.ini redis.ini $PHP_INI_DIR/conf.d/
|
||||||
|
|
||||||
ADD nginx.conf nginx-app.conf /etc/nginx/
|
ADD nginx.conf nginx-app.conf /etc/nginx/
|
||||||
|
|
|
||||||
25
images/php/install-oci.sh
Executable file
25
images/php/install-oci.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PHP=$(echo "$PHP_VERSION" | cut -c -3)
|
||||||
|
|
||||||
|
echo "php $PHP"
|
||||||
|
|
||||||
|
case $PHP in
|
||||||
|
"7.4") OCI_VERSION="-2.2.0" ;;
|
||||||
|
"8.0") OCI_VERSION="-3.0.1" ;;
|
||||||
|
"8.1") OCI_VERSION="-3.2.1" ;;
|
||||||
|
*) status=$status ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "using oci8$OCI_VERSION"
|
||||||
|
|
||||||
|
mkdir /opt/oracle
|
||||||
|
cd /opt/oracle
|
||||||
|
wget https://download.oracle.com/otn_software/linux/instantclient/2110000/instantclient-basiclite-linux.x64-21.10.0.0.0dbru.zip
|
||||||
|
wget https://download.oracle.com/otn_software/linux/instantclient/2110000/instantclient-sdk-linux.x64-21.10.0.0.0dbru.zip
|
||||||
|
unzip instantclient-basiclite-linux.x64-21.10.0.0.0dbru.zip
|
||||||
|
unzip instantclient-sdk-linux.x64-21.10.0.0.0dbru.zip
|
||||||
|
rm instantclient*.zip
|
||||||
|
echo /opt/oracle/instantclient_21_10 > /etc/ld.so.conf.d/oracle-instantclient.conf
|
||||||
|
ldconfig
|
||||||
|
pecl install -D 'with-oci8="instantclient,/opt/oracle/instantclient_21_10"' oci8$OCI_VERSION
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
versions=("7.3" "7.4" "8.0" "8.1" "7.3-dbg" "7.4-dbg" "8.0-dbg" "8.1-dbg")
|
versions=("8.0" "8.1" "8.2" "8.0-dbg" "8.1-dbg" "8.2-dbg")
|
||||||
|
|
||||||
for version in "${versions[@]}"; do
|
for version in "${versions[@]}"; do
|
||||||
docker push "icewind1991/haze-php:$version"
|
docker push "icewind1991/haze-php:$version"
|
||||||
|
|
|
||||||
|
|
@ -11,11 +11,13 @@ use std::str::FromStr;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::time::{sleep, timeout};
|
use tokio::time::{sleep, timeout};
|
||||||
|
|
||||||
|
#[derive(Eq, PartialEq)]
|
||||||
pub enum DatabaseFamily {
|
pub enum DatabaseFamily {
|
||||||
Sqlite,
|
Sqlite,
|
||||||
Mysql,
|
Mysql,
|
||||||
MariaDB,
|
MariaDB,
|
||||||
Postgres,
|
Postgres,
|
||||||
|
Oracle,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DatabaseFamily {
|
impl DatabaseFamily {
|
||||||
|
|
@ -25,6 +27,7 @@ impl DatabaseFamily {
|
||||||
DatabaseFamily::Mysql => "mysql",
|
DatabaseFamily::Mysql => "mysql",
|
||||||
DatabaseFamily::MariaDB => "mariadb",
|
DatabaseFamily::MariaDB => "mariadb",
|
||||||
DatabaseFamily::Postgres => "pgsql",
|
DatabaseFamily::Postgres => "pgsql",
|
||||||
|
DatabaseFamily::Oracle => "oci",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -50,6 +53,7 @@ pub enum Database {
|
||||||
Postgres12,
|
Postgres12,
|
||||||
Postgres13,
|
Postgres13,
|
||||||
Postgres14,
|
Postgres14,
|
||||||
|
Oracle,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Database {
|
impl Default for Database {
|
||||||
|
|
@ -96,6 +100,8 @@ impl FromStr for Database {
|
||||||
"postgresql:12" => Ok(Database::Postgres12),
|
"postgresql:12" => Ok(Database::Postgres12),
|
||||||
"postgresql:13" => Ok(Database::Postgres13),
|
"postgresql:13" => Ok(Database::Postgres13),
|
||||||
"postgresql:14" => Ok(Database::Postgres14),
|
"postgresql:14" => Ok(Database::Postgres14),
|
||||||
|
"oracle" => Ok(Database::Oracle),
|
||||||
|
"oci" => Ok(Database::Oracle),
|
||||||
_ => Err(Report::msg("Unknown db type")),
|
_ => Err(Report::msg("Unknown db type")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -122,6 +128,7 @@ impl Database {
|
||||||
Database::Postgres12 => "postgres:12",
|
Database::Postgres12 => "postgres:12",
|
||||||
Database::Postgres13 => "postgres:13",
|
Database::Postgres13 => "postgres:13",
|
||||||
Database::Postgres14 => "postgres:14",
|
Database::Postgres14 => "postgres:14",
|
||||||
|
Database::Oracle => "gvenzl/oracle-xe:21-faststart",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -148,6 +155,7 @@ impl Database {
|
||||||
| Database::Postgres12
|
| Database::Postgres12
|
||||||
| Database::Postgres13
|
| Database::Postgres13
|
||||||
| Database::Postgres14 => DatabaseFamily::Postgres,
|
| Database::Postgres14 => DatabaseFamily::Postgres,
|
||||||
|
Database::Oracle => DatabaseFamily::Oracle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -165,6 +173,7 @@ impl Database {
|
||||||
"POSTGRES_USER=haze",
|
"POSTGRES_USER=haze",
|
||||||
"POSTGRES_DATABASE=haze",
|
"POSTGRES_DATABASE=haze",
|
||||||
],
|
],
|
||||||
|
DatabaseFamily::Oracle => vec!["ORACLE_PASSWORD=haze"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,9 +186,15 @@ impl Database {
|
||||||
if matches!(self, Database::Sqlite) {
|
if matches!(self, Database::Sqlite) {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
pull_image(docker, &format!("library/{}", self.image()))
|
if self.image().contains('/') {
|
||||||
.await
|
pull_image(docker, self.image())
|
||||||
.wrap_err("Failed to pull database image")?;
|
.await
|
||||||
|
.wrap_err("Failed to pull database image")?;
|
||||||
|
} else {
|
||||||
|
pull_image(docker, &format!("library/{}", self.image()))
|
||||||
|
.await
|
||||||
|
.wrap_err("Failed to pull database image")?;
|
||||||
|
}
|
||||||
let options = Some(CreateContainerOptions {
|
let options = Some(CreateContainerOptions {
|
||||||
name: format!("{}-db", cloud_id),
|
name: format!("{}-db", cloud_id),
|
||||||
});
|
});
|
||||||
|
|
@ -280,19 +295,35 @@ impl Database {
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
DatabaseFamily::Oracle => {
|
||||||
|
exec_tty(
|
||||||
|
docker,
|
||||||
|
format!("{}-db", cloud_id),
|
||||||
|
"root",
|
||||||
|
vec!["sqlplus", "system/haze"],
|
||||||
|
vec![],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn wait_for_start(&self, docker: &mut Docker, cloud_id: &str) -> Result<()> {
|
pub async fn wait_for_start(&self, docker: &mut Docker, cloud_id: &str) -> Result<()> {
|
||||||
timeout(Duration::from_secs(15), async {
|
let time = if self.family() == DatabaseFamily::Oracle {
|
||||||
|
45
|
||||||
|
} else {
|
||||||
|
15
|
||||||
|
};
|
||||||
|
|
||||||
|
timeout(Duration::from_secs(time), async {
|
||||||
while !self.is_healthy(docker, cloud_id).await? {
|
while !self.is_healthy(docker, cloud_id).await? {
|
||||||
sleep(Duration::from_millis(100)).await
|
sleep(Duration::from_millis(250)).await
|
||||||
}
|
}
|
||||||
Ok(())
|
Result::<(), Report>::Ok(())
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.into_diagnostic()
|
.into_diagnostic()
|
||||||
.wrap_err("Timeout after 15 seconds")?
|
.wrap_err(format!("Timeout after {time} seconds"))?
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn ip(&self, docker: &mut Docker, cloud_id: &str) -> Option<IpAddr> {
|
pub async fn ip(&self, docker: &mut Docker, cloud_id: &str) -> Option<IpAddr> {
|
||||||
|
|
@ -355,6 +386,20 @@ impl Database {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DatabaseFamily::Oracle => {
|
||||||
|
let mut output = Vec::new();
|
||||||
|
exec(
|
||||||
|
docker,
|
||||||
|
format!("{}-db", cloud_id),
|
||||||
|
"root",
|
||||||
|
vec!["sh", "-c", r#"echo "show user" | sqlplus -S system/haze"#],
|
||||||
|
vec![],
|
||||||
|
Some(&mut output),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let output = String::from_utf8(output).into_diagnostic()?;
|
||||||
|
Ok(output.contains(r#"USER is "SYSTEM""#))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -310,6 +310,9 @@ async fn main() -> Result<()> {
|
||||||
DatabaseFamily::Sqlite => {
|
DatabaseFamily::Sqlite => {
|
||||||
return Err(Report::msg("sqlite is not supported with `haze env`"))
|
return Err(Report::msg("sqlite is not supported with `haze env`"))
|
||||||
}
|
}
|
||||||
|
DatabaseFamily::Oracle => {
|
||||||
|
return Err(Report::msg("oracle is not supported with `haze env`"))
|
||||||
|
}
|
||||||
DatabaseFamily::Mysql | DatabaseFamily::MariaDB => "mysql",
|
DatabaseFamily::Mysql | DatabaseFamily::MariaDB => "mysql",
|
||||||
DatabaseFamily::Postgres => "postgresql",
|
DatabaseFamily::Postgres => "postgresql",
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue