first plume on staging with S3 backend
This commit is contained in:
parent
04464f632f
commit
5c7a8c72d8
10 changed files with 360 additions and 0 deletions
8
cluster/staging/app/plume/build/docker-compose.yml
Normal file
8
cluster/staging/app/plume/build/docker-compose.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
version: '3.4'
|
||||
services:
|
||||
plume:
|
||||
build:
|
||||
context: ./plume
|
||||
args:
|
||||
VERSION: 24d3b289da085261966fb338113610905dfca8c9
|
||||
image: lxpz/plume_dev:v1
|
61
cluster/staging/app/plume/build/plume/Dockerfile
Normal file
61
cluster/staging/app/plume/build/plume/Dockerfile
Normal file
|
@ -0,0 +1,61 @@
|
|||
#FROM rust:1.69-bullseye as builder
|
||||
FROM debian:bullseye-slim as builder
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y \
|
||||
pkg-config \
|
||||
git \
|
||||
curl \
|
||||
postgresql \
|
||||
postgresql-contrib \
|
||||
libpq-dev \
|
||||
gettext \
|
||||
git \
|
||||
python \
|
||||
curl \
|
||||
gcc \
|
||||
make \
|
||||
openssl \
|
||||
libssl-dev \
|
||||
libclang-dev \
|
||||
libsqlite3-dev
|
||||
|
||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain nightly -y
|
||||
ENV PATH=/root/.cargo/bin:$PATH
|
||||
RUN cargo install wasm-pack
|
||||
|
||||
ARG PLUME_VERSION
|
||||
WORKDIR /opt
|
||||
RUN git clone -n https://git.joinplu.me/lx/Plume.git plume
|
||||
|
||||
WORKDIR /opt/plume
|
||||
RUN git checkout ${PLUME_VERSION}
|
||||
RUN rm rust-toolchain
|
||||
|
||||
WORKDIR /opt/plume/script
|
||||
RUN chmod a+x ./wasm-deps.sh && ./wasm-deps.sh
|
||||
|
||||
WORKDIR /opt/plume
|
||||
RUN chmod a+x ./script/plume-front.sh && ./script/plume-front.sh
|
||||
RUN cargo install --path ./ --force --no-default-features --features sqlite,s3
|
||||
RUN cargo install --path plume-cli --force --no-default-features --features sqlite,s3
|
||||
RUN cargo clean
|
||||
|
||||
#-----------------------------
|
||||
FROM debian:bullseye-slim
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
libpq5 \
|
||||
libssl1.1 \
|
||||
rclone \
|
||||
fuse \
|
||||
sqlite3
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /opt/plume /app
|
||||
COPY --from=builder /root/.cargo/bin/plm /usr/local/bin/
|
||||
COPY --from=builder /root/.cargo/bin/plume /usr/local/bin/
|
||||
|
||||
CMD ["plume"]
|
3
cluster/staging/app/plume/build/plume/README.md
Normal file
3
cluster/staging/app/plume/build/plume/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
Try build:
|
||||
|
||||
sudo docker build -t superboum/plume:v1 --build-arg VERSION=003dcf861a9f55720b03d52f2f95f5f59e338809 .
|
38
cluster/staging/app/plume/config/app.env
Normal file
38
cluster/staging/app/plume/config/app.env
Normal file
|
@ -0,0 +1,38 @@
|
|||
BASE_URL=plume.staging.deuxfleurs.org
|
||||
# generate one with openssl rand -base64 32
|
||||
ROCKET_SECRET_KEY={{ key "secrets/plume/secret_key" | trimSpace }}
|
||||
|
||||
# Mail settings
|
||||
#MAIL_SERVER=smtp.example.org
|
||||
#MAIL_USER=example
|
||||
#MAIL_PASSWORD=123456
|
||||
#MAIL_HELO_NAME=example.org
|
||||
|
||||
# S3 settings
|
||||
S3_BUCKET=plume
|
||||
AWS_ACCESS_KEY_ID={{ key "secrets/plume/s3_access_key" | trimSpace }}
|
||||
AWS_SECRET_ACCESS_KEY={{ key "secrets/plume/s3_secret_key" | trimSpace }}
|
||||
S3_REGION=garage-staging
|
||||
S3_HOSTNAME={{ env "attr.unique.network.ip-address" }}:3990
|
||||
S3_PROTOCOL=http
|
||||
S3_PATH_STYLE=true
|
||||
|
||||
# DATABASE SETUP
|
||||
DATABASE_URL=/ephemeral/plume.db
|
||||
MIGRATION_DIRECTORY=migrations/sqlite
|
||||
|
||||
USE_HTTPS=0
|
||||
ROCKET_ADDRESS=::
|
||||
ROCKET_PORT={{ env "NOMAD_PORT_web_port" }}
|
||||
|
||||
MEDIA_UPLOAD_DIRECTORY=/app/static/media
|
||||
SEARCH_INDEX=/app/search_index
|
||||
|
||||
LDAP_ADDR=ldap://bottin.service.staging.consul:389
|
||||
LDAP_BASE_DN=ou=users,dc=staging,dc=deuxfleurs,dc=org
|
||||
LDAP_USER_NAME_ATTR=cn
|
||||
LDAP_USER_MAIL_ATTR=mail
|
||||
LDAP_TLS=false
|
||||
|
||||
RUST_BACKTRACE=1
|
||||
RUST_LOG=debug
|
11
cluster/staging/app/plume/config/litestream.yml
Normal file
11
cluster/staging/app/plume/config/litestream.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
|
||||
dbs:
|
||||
- path: /ephemeral/plume.db
|
||||
replicas:
|
||||
- url: s3://plume/plume.db
|
||||
region: garage-staging
|
||||
endpoint: http://{{ env "attr.unique.network.ip-address" }}:3990
|
||||
access-key-id: {{ key "secrets/plume/s3_access_key" | trimSpace }}
|
||||
secret-access-key: {{ key "secrets/plume/s3_secret_key" | trimSpace }}
|
||||
force-path-style: true
|
||||
sync-interval: 60s
|
139
cluster/staging/app/plume/deploy/plume.hcl
Normal file
139
cluster/staging/app/plume/deploy/plume.hcl
Normal file
|
@ -0,0 +1,139 @@
|
|||
job "plume-blog" {
|
||||
datacenters = ["neptune"]
|
||||
type = "service"
|
||||
|
||||
constraint {
|
||||
attribute = "${attr.cpu.arch}"
|
||||
value = "amd64"
|
||||
}
|
||||
|
||||
group "plume" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "web_port" { }
|
||||
}
|
||||
|
||||
task "restore-db" {
|
||||
lifecycle {
|
||||
hook = "prestart"
|
||||
sidecar = false
|
||||
}
|
||||
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "litestream/litestream:0.3.7"
|
||||
args = [
|
||||
"restore", "-config", "/etc/litestream.yml", "/ephemeral/plume.db"
|
||||
]
|
||||
volumes = [
|
||||
"../alloc/data:/ephemeral",
|
||||
"secrets/litestream.yml:/etc/litestream.yml"
|
||||
]
|
||||
}
|
||||
user = "0"
|
||||
|
||||
template {
|
||||
data = file("../config/litestream.yml")
|
||||
destination = "secrets/litestream.yml"
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 100
|
||||
memory_max = 1000
|
||||
cpu = 1000
|
||||
}
|
||||
}
|
||||
|
||||
task "plume" {
|
||||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "="
|
||||
value = "carcajou"
|
||||
}
|
||||
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "lxpz/devplume:v3"
|
||||
network_mode = "host"
|
||||
ports = [ "web_port" ]
|
||||
command = "sh"
|
||||
args = [ "-c", "plm search init; plm search refill; plume" ]
|
||||
volumes = [
|
||||
"/mnt/ssd/plume/search_index:/app/search_index",
|
||||
"../alloc/data:/ephemeral"
|
||||
]
|
||||
}
|
||||
user = "0"
|
||||
|
||||
template {
|
||||
data = file("../config/app.env")
|
||||
destination = "secrets/app.env"
|
||||
env = true
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 200
|
||||
memory_max = 800
|
||||
cpu = 100
|
||||
}
|
||||
|
||||
service {
|
||||
name = "plume"
|
||||
tags = [
|
||||
"plume",
|
||||
"tricot plume.staging.deuxfleurs.org",
|
||||
"d53-cname plume.staging.deuxfleurs.org",
|
||||
]
|
||||
port = "web_port"
|
||||
address_mode = "host"
|
||||
check {
|
||||
type = "http"
|
||||
protocol = "http"
|
||||
port = "web_port"
|
||||
path = "/"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "600s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
restart {
|
||||
interval = "30m"
|
||||
attempts = 20
|
||||
delay = "15s"
|
||||
mode = "delay"
|
||||
}
|
||||
}
|
||||
|
||||
task "replicate-db" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "litestream/litestream:0.3.7"
|
||||
args = [
|
||||
"replicate", "-config", "/etc/litestream.yml"
|
||||
]
|
||||
volumes = [
|
||||
"../alloc/data:/ephemeral",
|
||||
"secrets/litestream.yml:/etc/litestream.yml"
|
||||
]
|
||||
}
|
||||
user = "0"
|
||||
|
||||
template {
|
||||
data = file("../config/litestream.yml")
|
||||
destination = "secrets/litestream.yml"
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 200
|
||||
memory_max = 1000
|
||||
cpu = 100
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
31
cluster/staging/app/plume/integration/bottin.json
Normal file
31
cluster/staging/app/plume/integration/bottin.json
Normal file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"suffix": "dc=deuxfleurs,dc=fr",
|
||||
"bind": "0.0.0.0:389",
|
||||
"consul_host": "http://consul:8500",
|
||||
"log_level": "debug",
|
||||
"acl": [
|
||||
"*,dc=deuxfleurs,dc=fr::read:*:* !userpassword",
|
||||
"*::read modify:SELF:*",
|
||||
"ANONYMOUS::bind:*,ou=users,dc=deuxfleurs,dc=fr:",
|
||||
"ANONYMOUS::bind:cn=admin,dc=deuxfleurs,dc=fr:",
|
||||
"*,ou=services,ou=users,dc=deuxfleurs,dc=fr::bind:*,ou=users,dc=deuxfleurs,dc=fr:*",
|
||||
"*,ou=services,ou=users,dc=deuxfleurs,dc=fr::read:*:*",
|
||||
|
||||
"*:cn=asso_deuxfleurs,ou=groups,dc=deuxfleurs,dc=fr:add:*,ou=invitations,dc=deuxfleurs,dc=fr:*",
|
||||
"ANONYMOUS::bind:*,ou=invitations,dc=deuxfleurs,dc=fr:",
|
||||
"*,ou=invitations,dc=deuxfleurs,dc=fr::delete:SELF:*",
|
||||
|
||||
"*:cn=asso_deuxfleurs,ou=groups,dc=deuxfleurs,dc=fr:add:*,ou=users,dc=deuxfleurs,dc=fr:*",
|
||||
"*,ou=invitations,dc=deuxfleurs,dc=fr::add:*,ou=users,dc=deuxfleurs,dc=fr:*",
|
||||
|
||||
"*:cn=asso_deuxfleurs,ou=groups,dc=deuxfleurs,dc=fr:modifyAdd:cn=email,ou=groups,dc=deuxfleurs,dc=fr:*",
|
||||
"*,ou=invitations,dc=deuxfleurs,dc=fr::modifyAdd:cn=email,ou=groups,dc=deuxfleurs,dc=fr:*",
|
||||
"*:cn=asso_deuxfleurs,ou=groups,dc=deuxfleurs,dc=fr:modifyAdd:cn=seafile,ou=groups,dc=deuxfleurs,dc=fr:*",
|
||||
"*,ou=invitations,dc=deuxfleurs,dc=fr::modifyAdd:cn=seafile,ou=groups,dc=deuxfleurs,dc=fr:*",
|
||||
"*:cn=asso_deuxfleurs,ou=groups,dc=deuxfleurs,dc=fr:modifyAdd:cn=nextcloud,ou=groups,dc=deuxfleurs,dc=fr:*",
|
||||
"*,ou=invitations,dc=deuxfleurs,dc=fr::modifyAdd:cn=seafile,ou=nextcloud,dc=deuxfleurs,dc=fr:*",
|
||||
|
||||
"cn=admin,dc=deuxfleurs,dc=fr::read add modify delete:*:*",
|
||||
"*:cn=admin,ou=groups,dc=deuxfleurs,dc=fr:read add modify delete:*:*"
|
||||
]
|
||||
}
|
28
cluster/staging/app/plume/integration/docker-compose.yml
Normal file
28
cluster/staging/app/plume/integration/docker-compose.yml
Normal file
|
@ -0,0 +1,28 @@
|
|||
version: '3.4'
|
||||
services:
|
||||
plume:
|
||||
image: superboum/plume:v1
|
||||
env_file:
|
||||
- plume.env
|
||||
depends_on:
|
||||
- consul
|
||||
- postgres
|
||||
ports:
|
||||
- "7878:7878"
|
||||
|
||||
postgres:
|
||||
image: postgres:9.6.19
|
||||
environment:
|
||||
- POSTGRES_DB=plume
|
||||
- POSTGRES_USER=plume
|
||||
- POSTGRES_PASSWORD=plume
|
||||
|
||||
bottin:
|
||||
image: lxpz/bottin_amd64:14
|
||||
depends_on:
|
||||
- consul
|
||||
volumes:
|
||||
- ./bottin.json:/config.json
|
||||
|
||||
consul:
|
||||
image: consul:1.8.4
|
31
cluster/staging/app/plume/integration/plume.env
Normal file
31
cluster/staging/app/plume/integration/plume.env
Normal file
|
@ -0,0 +1,31 @@
|
|||
BASE_URL=integration.env
|
||||
# generate one with openssl rand -base64 32
|
||||
ROCKET_SECRET_KEY=cXZbKoxWIBo0wdaD8tbA1B3BlH2LBSUmgzdyZZr8QxI=
|
||||
|
||||
# Mail settings
|
||||
#MAIL_SERVER=smtp.example.org
|
||||
#MAIL_USER=example
|
||||
#MAIL_PASSWORD=123456
|
||||
#MAIL_HELO_NAME=example.org
|
||||
|
||||
# DATABASE SETUP
|
||||
POSTGRES_PASSWORD=plume
|
||||
POSTGRES_USER=plume
|
||||
POSTGRES_DB=plume
|
||||
DATABASE_URL=postgres://plume:plume@postgres:5432/plume
|
||||
MIGRATION_DIRECTORY=migrations/postgres
|
||||
|
||||
USE_HTTPS=0
|
||||
ROCKET_ADDRESS=0.0.0.0
|
||||
ROCKET_PORT=7878
|
||||
|
||||
MEDIA_UPLOAD_DIRECTORY=/app/static/media
|
||||
SEARCH_INDEX=/app/search_index
|
||||
DOMAIN_NAME="integration.env"
|
||||
INSTANCE_NAME="Integration Instance"
|
||||
|
||||
LDAP_ADDR=ldap://bottin:389
|
||||
LDAP_BASE_DN=ou=users,dc=deuxfleurs,dc=fr
|
||||
LDAP_USER_NAME_ATTR=cn
|
||||
LDAP_USER_MAIL_ATTR=mail
|
||||
LDAP_TLS=false
|
10
cluster/staging/app/plume/secrets.toml
Normal file
10
cluster/staging/app/plume/secrets.toml
Normal file
|
@ -0,0 +1,10 @@
|
|||
[service_user."plume"]
|
||||
password_secret = "plume/pgsql_pw"
|
||||
|
||||
|
||||
[secrets."plume/secret_key"]
|
||||
type = 'command'
|
||||
rotate = true
|
||||
command = 'openssl rand -base64 32'
|
||||
|
||||
|
Loading…
Reference in a new issue