summaryrefslogtreecommitdiff
path: root/src/project.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/project.rs')
-rw-r--r--src/project.rs48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/project.rs b/src/project.rs
index 6ef619a..57185b1 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -65,6 +65,8 @@ pub(crate) struct Service {
environment: Vec<String>,
#[serde(default)]
drop_capabilities: bool,
+ #[serde(default)]
+ read_only: bool,
health: Vec<String>,
mounts: Vec<Mount>,
#[serde(default)]
@@ -236,18 +238,23 @@ impl Project {
pub(crate) fn initialize(&self, settings: &Settings) -> Result<()> {
files::private_dir(&self.root.join("var/data"))?;
let env_file = self.root.join(".env");
- if !Config::load(&self.root)?.is_explicit("SEARXNG_SECRET") {
- let mut random = [0; 32];
- File::open("/dev/urandom")?.read_exact(&mut random)?;
- let mut file = OpenOptions::new()
- .create(true)
- .append(true)
- .mode(0o600)
- .open(&env_file)?;
- writeln!(file, "\nSEARXNG_SECRET={}", hex::encode(random))?;
+ for key in ["SEARXNG_SECRET", "CHAT_SETUP_TOKEN"] {
+ if !Config::load(&self.root)?.is_explicit(key) {
+ let mut random = [0; 32];
+ File::open("/dev/urandom")?.read_exact(&mut random)?;
+ let mut file = OpenOptions::new()
+ .create(true)
+ .append(true)
+ .mode(0o600)
+ .open(&env_file)?;
+ writeln!(file, "\n{key}={}", hex::encode(random))?;
+ }
}
stack_config::initialize_public(&self.root)?;
fs::set_permissions(&env_file, Permissions::from_mode(0o600))?;
+ for name in ["chat", "chat-local"] {
+ files::private_dir(&self.root.join("var/data").join(name))?;
+ }
for name in ["repos", "caddy/data", "caddy/config", "searxng"] {
fs::create_dir_all(self.root.join("var/data").join(name))?;
}
@@ -350,6 +357,9 @@ impl Project {
&& (settings.online || !self.root.join("var/image-lock.json").exists())
&& let Some(context) = &service.build
{
+ if context == "bin/chat" && !self.root.join("bin/chat/server").is_file() {
+ crate::chat::build(self)?;
+ }
return process::run(
self.command("podman")?
.args(["build", "--tag", &service.image])
@@ -400,6 +410,9 @@ impl Project {
"--security-opt",
"no-new-privileges",
]);
+ if service.read_only {
+ command.args(["--read-only", "--read-only-tmpfs=false"]);
+ }
if service.drop_capabilities {
command.args(["--cap-drop", "ALL"]);
}
@@ -416,9 +429,12 @@ impl Project {
let http = environment.port("HTTP_PORT")?;
let https = environment.port("HTTPS_PORT")?;
vec![
- format!("[::]:{http}:{http}"),
- format!("[::]:{https}:{https}"),
- format!("[::]:{https}:{https}/udp"),
+ format!("{}:{http}:{http}", crate::chat::web_bind(environment)?),
+ format!("{}:{https}:{https}", crate::chat::web_bind(environment)?),
+ format!(
+ "{}:{https}:{https}/udp",
+ crate::chat::web_bind(environment)?
+ ),
]
};
for port in ports {
@@ -431,11 +447,19 @@ impl Project {
.arg(key)
.env(key, environment.value(key)?);
}
+ if name == "chat" {
+ crate::chat::environment(&mut command, environment, settings)?;
+ }
for mount in &service.mounts {
let source = match mount.source.as_str() {
"@caddy" => crate::render::directory(self, settings).join("Caddyfile"),
"@web" => crate::render::directory(self, settings).join("web"),
"@cgit" => crate::render::directory(self, settings).join("cgitrc"),
+ "@chat" => self.root.join(if settings.mode == Mode::Local {
+ "var/data/chat-local"
+ } else {
+ "var/data/chat"
+ }),
other => self.path(other)?,
};
let mode = if mount.read_only { "ro,z" } else { "rw,z" };