112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
import logging
|
|
import random
|
|
import string
|
|
|
|
import click
|
|
from caprover_api import caprover_api
|
|
from environs import Env
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
|
|
def generate_random_string(length):
|
|
base_characters = string.ascii_letters + string.digits
|
|
random_string = "".join(random.choice(base_characters) for _ in range(length))
|
|
return random_string
|
|
|
|
|
|
@click.command()
|
|
@click.option(
|
|
"-a",
|
|
"--app-name",
|
|
required=True,
|
|
help="app name to deploy should start with vbv-feature-, use slugified branch name",
|
|
)
|
|
@click.option(
|
|
"-i",
|
|
"--image-name",
|
|
default=None,
|
|
help="docker image name to deploy (like docker.io/iterativ/vbv-lernwelt-django)",
|
|
)
|
|
@click.option(
|
|
"-e",
|
|
"--environment-file",
|
|
default=None,
|
|
help="path to environment file to use for deployment (like ./env_secrets/caprover_feature.env)",
|
|
)
|
|
def main(app_name, image_name, environment_file):
|
|
env = Env()
|
|
|
|
if environment_file is not None:
|
|
env.read_env(environment_file, recurse=False, override=True)
|
|
|
|
cap = caprover_api.CaproverAPI(
|
|
dashboard_url=env.str("CAPROVER_DOMAIN"),
|
|
password=env.str("CAPROVER_PASSWORD"),
|
|
)
|
|
|
|
db_pass = env.str("POSTGRES_PASSWORD", generate_random_string(63))
|
|
db_user = env.str("POSTGRES_USER", "postgres")
|
|
db_name = env.str("POSTGRES_DB", "vbv_lernwelt")
|
|
|
|
cap.deploy_one_click_app(
|
|
one_click_app_name="postgres",
|
|
namespace=app_name,
|
|
# check https://github.com/caprover/one-click-apps/blob/master/public/v4/apps/postgres.yml
|
|
app_variables={
|
|
"$$cap_postgres_version": "14.2",
|
|
"$$cap_pg_user": db_user,
|
|
"$$cap_pg_pass": db_pass,
|
|
"$$cap_pg_db": db_name,
|
|
},
|
|
automated=True,
|
|
)
|
|
|
|
default_allowed_hosts = f"{app_name}.iterativ.ch,{app_name}.control.iterativ.ch"
|
|
|
|
cap.create_and_update_app(
|
|
app_name=app_name,
|
|
enable_ssl=True,
|
|
force_ssl=True,
|
|
expose_as_web_app=True,
|
|
image_name=image_name,
|
|
environment_variables={
|
|
# 'DJANGO_SETTINGS_MODULE': 'config.settings.base',
|
|
"IT_APP_ENVIRONMENT": env.str("IT_APP_ENVIRONMENT", "caprover_feature"),
|
|
"POSTGRES_HOST": f"srv-captain--{app_name}-postgres",
|
|
"POSTGRES_PORT": 5432,
|
|
"POSTGRES_DB": db_name,
|
|
"POSTGRES_USER": db_user,
|
|
"POSTGRES_PASSWORD": db_pass,
|
|
"IT_DJANGO_ALLOWED_HOSTS": env.str(
|
|
"IT_DJANGO_ALLOWED_HOSTS", default_allowed_hosts
|
|
),
|
|
"IT_DJANGO_SECRET_KEY": env.str(
|
|
"IT_DJANGO_SECRET_KEY", generate_random_string(63)
|
|
),
|
|
"IT_DJANGO_ADMIN_URL": env.str("IT_DJANGO_ADMIN_URL", "admin/"),
|
|
"IT_DJANGO_DEBUG": "false",
|
|
"IT_SERVE_VUE": "false",
|
|
"IT_ALLOW_LOCAL_LOGIN": "true",
|
|
# used for deployment of "real" environments, not used now for feature branches
|
|
# 'IT_ALLOW_LOCAL_LOGIN': env.str('IT_ALLOW_LOCAL_LOGIN'),
|
|
# 'IT_SENTRY_DSN': env.str('IT_SENTRY_DSN'),
|
|
# 'IT_OAUTH_CLIENT_NAME': env.str('IT_OAUTH_CLIENT_NAME'),
|
|
# 'IT_OAUTH_CLIENT_ID': env.str('IT_OAUTH_CLIENT_ID'),
|
|
# 'IT_OAUTH_CLIENT_SECRET': env.str('IT_OAUTH_CLIENT_SECRET'),
|
|
# 'IT_OAUTH_ACCESS_TOKEN_URL': env.str('IT_OAUTH_ACCESS_TOKEN_URL'),
|
|
# 'IT_OAUTH_AUTHORIZE_URL': env.str('IT_OAUTH_AUTHORIZE_URL'),
|
|
# 'IT_OAUTH_API_BASE_URL': env.str('IT_OAUTH_API_BASE_URL'),
|
|
# 'IT_OAUTH_LOCAL_DIRECT_URI': env.str('IT_OAUTH_LOCAL_DIRECT_URI'),
|
|
# 'IT_OAUTH_TENANT_ID': env.str('IT_OAUTH_TENANT_ID'),
|
|
# 'IT_OAUTH_SCOPE': env.str('IT_OAUTH_SCOPE'),
|
|
# 'IT_OAUTH_SERVER_METADATA_URL': env.str('IT_OAUTH_SERVER_METADATA_URL'),
|
|
# 'IT_OAUTH_TOKEN_NAME': env.str('IT_OAUTH_TOKEN_NAME'),
|
|
# 'IT_OAUTH_LOGOUT_URL': env.str('IT_OAUTH_LOGOUT_URL'),
|
|
},
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|