76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| """This file needs to be run from the root of the project to correctly
 | |
| import authentik. This is done by the dockerfile."""
 | |
| from sys import exit as sysexit
 | |
| from time import sleep
 | |
| 
 | |
| from psycopg import OperationalError, connect
 | |
| from redis import Redis
 | |
| from redis.exceptions import RedisError
 | |
| 
 | |
| from authentik.lib.config import CONFIG, redis_url
 | |
| 
 | |
| CHECK_THRESHOLD = 30
 | |
| 
 | |
| 
 | |
| def check_postgres():
 | |
|     attempt = 0
 | |
|     while True:
 | |
|         if attempt >= CHECK_THRESHOLD:
 | |
|             sysexit(1)
 | |
|         try:
 | |
|             conn = connect(
 | |
|                 dbname=CONFIG.refresh("postgresql.name"),
 | |
|                 user=CONFIG.refresh("postgresql.user"),
 | |
|                 password=CONFIG.refresh("postgresql.password"),
 | |
|                 host=CONFIG.refresh("postgresql.host"),
 | |
|                 port=CONFIG.get_int("postgresql.port"),
 | |
|                 sslmode=CONFIG.get("postgresql.sslmode"),
 | |
|                 sslrootcert=CONFIG.get("postgresql.sslrootcert"),
 | |
|                 sslcert=CONFIG.get("postgresql.sslcert"),
 | |
|                 sslkey=CONFIG.get("postgresql.sslkey"),
 | |
|             )
 | |
|             conn.cursor()
 | |
|             break
 | |
|         except OperationalError as exc:
 | |
|             sleep(1)
 | |
|             CONFIG.log("info", f"PostgreSQL connection failed, retrying... ({exc})")
 | |
|         finally:
 | |
|             attempt += 1
 | |
|     CONFIG.log("info", "PostgreSQL connection successful")
 | |
| 
 | |
| 
 | |
| def check_redis():
 | |
|     url = CONFIG.get("cache.url") or redis_url(CONFIG.get("redis.db"))
 | |
|     attempt = 0
 | |
|     while True:
 | |
|         if attempt >= CHECK_THRESHOLD:
 | |
|             sysexit(1)
 | |
|         try:
 | |
|             redis = Redis.from_url(url)
 | |
|             redis.ping()
 | |
|             break
 | |
|         except RedisError as exc:
 | |
|             sleep(1)
 | |
|             CONFIG.log("info", f"Redis Connection failed, retrying... ({exc})")
 | |
|         finally:
 | |
|             attempt += 1
 | |
|     CONFIG.log("info", "Redis Connection successful")
 | |
| 
 | |
| 
 | |
| def wait_for_db():
 | |
|     CONFIG.log("info", "Starting authentik bootstrap")
 | |
|     # Sanity check, ensure SECRET_KEY is set before we even check for database connectivity
 | |
|     if CONFIG.get("secret_key") is None or len(CONFIG.get("secret_key")) == 0:
 | |
|         CONFIG.log("info", "----------------------------------------------------------------------")
 | |
|         CONFIG.log("info", "Secret key missing, check https://goauthentik.io/docs/installation/.")
 | |
|         CONFIG.log("info", "----------------------------------------------------------------------")
 | |
|         sysexit(1)
 | |
|     check_postgres()
 | |
|     check_redis()
 | |
|     CONFIG.log("info", "Finished authentik bootstrap")
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     wait_for_db()
 | 
