[{"data":1,"prerenderedAt":816},["ShallowReactive",2],{"docs-nav":3,"/docs/installation/alwaysdata":60},[4],{"title":5,"path":6,"stem":7,"children":8,"page":59},"Docs","/docs","docs",[9,27,45],{"title":10,"path":11,"stem":12,"children":13,"page":-1},"Premiers pas","/docs/getting-started","docs/1.getting-started/index",[14,15,19,23],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Introduction","/docs/getting-started/introduction","docs/1.getting-started/1.introduction",{"title":20,"path":21,"stem":22},"Claim, Adopt, Fork","/docs/getting-started/concepts","docs/1.getting-started/2.concepts",{"title":24,"path":25,"stem":26},"Architecture","/docs/getting-started/architecture","docs/1.getting-started/3.architecture",{"title":28,"path":29,"stem":30,"children":31,"page":-1},"Installation","/docs/installation","docs/2.installation/index",[32,33,37,41],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Déploiement Docker","/docs/installation/docker","docs/2.installation/1.docker",{"title":38,"path":39,"stem":40},"Déploiement VPS","/docs/installation/vps","docs/2.installation/2.vps",{"title":42,"path":43,"stem":44},"Déploiement Alwaysdata","/docs/installation/alwaysdata","docs/2.installation/3.alwaysdata",{"title":46,"path":47,"stem":48,"children":49,"page":-1},"Administration","/docs/administration","docs/3.administration/index",[50,51,55],{"title":46,"path":47,"stem":48},{"title":52,"path":53,"stem":54},"Configuration","/docs/administration/configuration","docs/3.administration/1.configuration",{"title":56,"path":57,"stem":58},"Maintenance","/docs/administration/maintenance","docs/3.administration/2.maintenance",false,{"id":61,"title":42,"body":62,"description":810,"extension":811,"meta":812,"navigation":813,"path":43,"seo":814,"stem":44,"__hash__":815},"docs/docs/2.installation/3.alwaysdata.md",{"type":63,"value":64,"toc":795},"minimark",[65,69,81,84,99,102,107,123,125,129,193,195,199,271,273,277,288,290,294,297,364,388,457,459,463,537,574,586,594,596,600,603,605,609,616,622,628,634,640,646,652,661,663,667,670,703,718,721,772,779,781,785,791],[66,67,42],"h1",{"id":68},"déploiement-alwaysdata",[70,71,72,76,77,80],"p",{},[73,74,75],"strong",{},"Difficulté"," : Facile | ",[73,78,79],{},"Coût"," : ~10 €/mois",[70,82,83],{},"Alwaysdata est une plateforme d'hébergement managé qui simplifie le déploiement. Elle gère le serveur web, la base de données PostgreSQL et les certificats SSL automatiquement.",[85,86,87],"blockquote",{},[70,88,89,90,94,95,98],{},"Alwaysdata ne propose pas Redis — Suddenly bascule automatiquement sur le cache base de données si ",[91,92,93],"code",{},"REDIS_URL"," est absent. Celery tourne en mode synchrone (",[91,96,97],{},"CELERY_TASK_ALWAYS_EAGER=True",").",[100,101],"hr",{},[103,104,106],"h2",{"id":105},"_1-créer-les-ressources-dans-le-panel","1. Créer les ressources dans le panel",[108,109,110,117],"ol",{},[111,112,113,116],"li",{},[73,114,115],{},"Base de données PostgreSQL"," — noter l'hôte, le port, le nom, l'utilisateur et le mot de passe",[111,118,119,122],{},[73,120,121],{},"Site Python WSGI"," — créer un site (voir configuration à l'étape 6)",[100,124],{},[103,126,128],{"id":127},"_2-cloner-le-dépôt-en-ssh","2. Cloner le dépôt en SSH",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-bash shiki shiki-themes github-light github-dark","ssh user@ssh-user.alwaysdata.net\ncd /home/\u003Cuser>/www/\ngit clone https://github.com/RebelliousSmile/suddenly.git soudainement\n","bash","",[91,137,138,151,178],{"__ignoreMap":135},[139,140,143,147],"span",{"class":141,"line":142},"line",1,[139,144,146],{"class":145},"sScJk","ssh",[139,148,150],{"class":149},"sZZnC"," user@ssh-user.alwaysdata.net\n",[139,152,154,158,161,165,168,172,175],{"class":141,"line":153},2,[139,155,157],{"class":156},"sj4cs","cd",[139,159,160],{"class":149}," /home/",[139,162,164],{"class":163},"szBVR","\u003C",[139,166,167],{"class":149},"use",[139,169,171],{"class":170},"sVt8B","r",[139,173,174],{"class":163},">",[139,176,177],{"class":149},"/www/\n",[139,179,181,184,187,190],{"class":141,"line":180},3,[139,182,183],{"class":145},"git",[139,185,186],{"class":149}," clone",[139,188,189],{"class":149}," https://github.com/RebelliousSmile/suddenly.git",[139,191,192],{"class":149}," soudainement\n",[100,194],{},[103,196,198],{"id":197},"_3-installer-les-dépendances","3. Installer les dépendances",[130,200,202],{"className":132,"code":201,"language":134,"meta":135,"style":135},"cd /home/\u003Cuser>/www/soudainement\npython3.12 -m venv venv\nsource venv/bin/activate\npip install --upgrade pip\npip install -e \".[federation]\"\n",[91,203,204,221,235,243,258],{"__ignoreMap":135},[139,205,206,208,210,212,214,216,218],{"class":141,"line":142},[139,207,157],{"class":156},[139,209,160],{"class":149},[139,211,164],{"class":163},[139,213,167],{"class":149},[139,215,171],{"class":170},[139,217,174],{"class":163},[139,219,220],{"class":149},"/www/soudainement\n",[139,222,223,226,229,232],{"class":141,"line":153},[139,224,225],{"class":145},"python3.12",[139,227,228],{"class":156}," -m",[139,230,231],{"class":149}," venv",[139,233,234],{"class":149}," venv\n",[139,236,237,240],{"class":141,"line":180},[139,238,239],{"class":156},"source",[139,241,242],{"class":149}," venv/bin/activate\n",[139,244,246,249,252,255],{"class":141,"line":245},4,[139,247,248],{"class":145},"pip",[139,250,251],{"class":149}," install",[139,253,254],{"class":156}," --upgrade",[139,256,257],{"class":149}," pip\n",[139,259,261,263,265,268],{"class":141,"line":260},5,[139,262,248],{"class":145},[139,264,251],{"class":149},[139,266,267],{"class":156}," -e",[139,269,270],{"class":149}," \".[federation]\"\n",[100,272],{},[103,274,276],{"id":275},"_4-clés-activitypub","4. Clés ActivityPub",[70,278,279,280,283,284,287],{},"Rien à faire : Suddenly génère lui-même les clés d'instance (",[91,281,282],{},"keys/private.pem",", ",[91,285,286],{},"keys/public.pem",") au premier besoin, et une paire RSA par acteur à sa création. Assurez-vous seulement que le processus a le droit d'écrire dans le répertoire du projet.",[100,289],{},[103,291,293],{"id":292},"_5-initialiser-la-base-de-données","5. Initialiser la base de données",[70,295,296],{},"Les variables d'environnement du panel ne sont pas disponibles en SSH. Il faut les exporter manuellement :",[130,298,300],{"className":132,"code":299,"language":134,"meta":135,"style":135},"export DJANGO_SETTINGS_MODULE=config.settings.production\nexport SECRET_KEY=\"votre-cle-secrete\"\nexport DOMAIN=soudainement.fr\nexport ALLOWED_HOSTS=soudainement.fr,www.soudainement.fr\nexport DATABASE_URL=\"postgresql://user:password_encodé@host:5432/dbname\"\n",[91,301,302,316,328,340,352],{"__ignoreMap":135},[139,303,304,307,310,313],{"class":141,"line":142},[139,305,306],{"class":163},"export",[139,308,309],{"class":170}," DJANGO_SETTINGS_MODULE",[139,311,312],{"class":163},"=",[139,314,315],{"class":170},"config.settings.production\n",[139,317,318,320,323,325],{"class":141,"line":153},[139,319,306],{"class":163},[139,321,322],{"class":170}," SECRET_KEY",[139,324,312],{"class":163},[139,326,327],{"class":149},"\"votre-cle-secrete\"\n",[139,329,330,332,335,337],{"class":141,"line":180},[139,331,306],{"class":163},[139,333,334],{"class":170}," DOMAIN",[139,336,312],{"class":163},[139,338,339],{"class":170},"soudainement.fr\n",[139,341,342,344,347,349],{"class":141,"line":245},[139,343,306],{"class":163},[139,345,346],{"class":170}," ALLOWED_HOSTS",[139,348,312],{"class":163},[139,350,351],{"class":170},"soudainement.fr,www.soudainement.fr\n",[139,353,354,356,359,361],{"class":141,"line":260},[139,355,306],{"class":163},[139,357,358],{"class":170}," DATABASE_URL",[139,360,312],{"class":163},[139,362,363],{"class":149},"\"postgresql://user:password_encodé@host:5432/dbname\"\n",[85,365,366,372],{},[70,367,368,371],{},[73,369,370],{},"Important"," : encoder les caractères spéciaux du mot de passe :",[130,373,375],{"className":132,"code":374,"language":134,"meta":135,"style":135},"python3 -c \"from urllib.parse import quote_plus; print(quote_plus('mot_de_passe'))\"\n",[91,376,377],{"__ignoreMap":135},[139,378,379,382,385],{"class":141,"line":142},[139,380,381],{"class":145},"python3",[139,383,384],{"class":156}," -c",[139,386,387],{"class":149}," \"from urllib.parse import quote_plus; print(quote_plus('mot_de_passe'))\"\n",[130,389,391],{"className":132,"code":390,"language":134,"meta":135,"style":135},"cd /home/\u003Cuser>/www/soudainement\nsource venv/bin/activate\npython manage.py migrate\npython manage.py createcachetable\npython manage.py collectstatic --noinput\npython manage.py createsuperuser\n",[91,392,393,409,415,426,435,447],{"__ignoreMap":135},[139,394,395,397,399,401,403,405,407],{"class":141,"line":142},[139,396,157],{"class":156},[139,398,160],{"class":149},[139,400,164],{"class":163},[139,402,167],{"class":149},[139,404,171],{"class":170},[139,406,174],{"class":163},[139,408,220],{"class":149},[139,410,411,413],{"class":141,"line":153},[139,412,239],{"class":156},[139,414,242],{"class":149},[139,416,417,420,423],{"class":141,"line":180},[139,418,419],{"class":145},"python",[139,421,422],{"class":149}," manage.py",[139,424,425],{"class":149}," migrate\n",[139,427,428,430,432],{"class":141,"line":245},[139,429,419],{"class":145},[139,431,422],{"class":149},[139,433,434],{"class":149}," createcachetable\n",[139,436,437,439,441,444],{"class":141,"line":260},[139,438,419],{"class":145},[139,440,422],{"class":149},[139,442,443],{"class":149}," collectstatic",[139,445,446],{"class":156}," --noinput\n",[139,448,450,452,454],{"class":141,"line":449},6,[139,451,419],{"class":145},[139,453,422],{"class":149},[139,455,456],{"class":149}," createsuperuser\n",[100,458],{},[103,460,462],{"id":461},"_6-configurer-le-site-dans-le-panel","6. Configurer le site dans le panel",[464,465,466,479],"table",{},[467,468,469],"thead",{},[470,471,472,476],"tr",{},[473,474,475],"th",{},"Champ",[473,477,478],{},"Valeur",[480,481,482,493,503,513,523],"tbody",{},[470,483,484,488],{},[485,486,487],"td",{},"Chemin de l'application",[485,489,490],{},[91,491,492],{},"www/soudainement/suddenly/wsgi.py",[470,494,495,498],{},[485,496,497],{},"Répertoire de travail",[485,499,500],{},[91,501,502],{},"www/soudainement/",[470,504,505,508],{},[485,506,507],{},"Version Python",[485,509,510],{},[91,511,512],{},"3.12",[470,514,515,518],{},[485,516,517],{},"Répertoire du virtualenv",[485,519,520],{},[91,521,522],{},"www/soudainement/venv",[470,524,525,528],{},[485,526,527],{},"Chemins statiques",[485,529,530,533,534],{},[91,531,532],{},"/static/ staticfiles/"," et ",[91,535,536],{},"/media/ media/",[85,538,539,545],{},[70,540,541,544],{},[73,542,543],{},"Pièges"," :",[546,547,548,561,568],"ul",{},[111,549,550,551,283,554,557,558],{},"Le fichier WSGI est ",[91,552,553],{},"suddenly/wsgi.py",[73,555,556],{},"pas"," ",[91,559,560],{},"config/wsgi.py",[111,562,563,564,567],{},"Les chemins statiques sont ",[73,565,566],{},"relatifs au répertoire de travail"," (ne pas mettre le chemin absolu)",[111,569,570,573],{},[91,571,572],{},"DATABASE_URL"," : encoder les caractères spéciaux du mot de passe",[575,576,578,579,582,583,585],"h3",{"id":577},"variables-denvironnement-format-foobar-sans-export","Variables d'environnement (format ",[91,580,581],{},"FOO=bar",", sans ",[91,584,306],{},")",[130,587,592],{"className":588,"code":590,"language":591},[589],"language-text","DJANGO_SETTINGS_MODULE=config.settings.production\nSECRET_KEY=votre-cle-generee\nDOMAIN=soudainement.fr\nALLOWED_HOSTS=soudainement.fr,www.soudainement.fr\nDATABASE_URL=postgresql://user:password_encodé@host:5432/dbname\n","text",[91,593,590],{"__ignoreMap":135},[100,595],{},[103,597,599],{"id":598},"_7-ssl","7. SSL",[70,601,602],{},"Activer Let's Encrypt via le panel Alwaysdata pour le domaine.",[100,604],{},[103,606,608],{"id":607},"_8-tâches-planifiées","8. Tâches planifiées",[70,610,611,612,615],{},"Dans le panel → ",[73,613,614],{},"Tâches planifiées",". Renseigner les variables d'environnement dans chaque tâche (même format que le site).",[70,617,618,621],{},[73,619,620],{},"Nettoyage des sessions"," (quotidien à 3h) :",[130,623,626],{"className":624,"code":625,"language":591},[589],"Fréquence : 0 3 * * *\nCommande  : /home/\u003Cuser>/www/soudainement/venv/bin/python /home/\u003Cuser>/www/soudainement/manage.py clearsessions\n",[91,627,625],{"__ignoreMap":135},[70,629,630,633],{},[73,631,632],{},"Nettoyage des citations éphémères"," (toutes les heures) :",[130,635,638],{"className":636,"code":637,"language":591},[589],"Fréquence : 0 * * * *\nCommande  : /home/\u003Cuser>/www/soudainement/venv/bin/python /home/\u003Cuser>/www/soudainement/manage.py shell -c \"from suddenly.activitypub.tasks import cleanup_expired_quotes; cleanup_expired_quotes()\"\n",[91,639,637],{"__ignoreMap":135},[70,641,642,645],{},[73,643,644],{},"Rafraîchissement des acteurs distants"," (quotidien) :",[130,647,650],{"className":648,"code":649,"language":591},[589],"Fréquence : 30 4 * * *\nCommande  : /home/\u003Cuser>/www/soudainement/venv/bin/python /home/\u003Cuser>/www/soudainement/manage.py shell -c \"from suddenly.activitypub.tasks import refresh_remote_actors; refresh_remote_actors()\"\n",[91,651,649],{"__ignoreMap":135},[85,653,654],{},[70,655,656,657,660],{},"Ces deux tâches sont normalement planifiées par Celery Beat. Sans Redis, Celery tourne en mode synchrone et ",[73,658,659],{},"Beat ne tourne pas"," : ces tâches planifiées sont le seul moyen de les exécuter.",[100,662],{},[103,664,666],{"id":665},"mise-à-jour","Mise à jour",[70,668,669],{},"Le dépôt fournit un script qui fait tout (dépendances, migrations, table de cache, statiques, redémarrage) :",[130,671,673],{"className":132,"code":672,"language":134,"meta":135,"style":135},"cd /home/\u003Cuser>/www/soudainement\ngit pull\n./scripts/deploy-alwaysdata.sh\n",[91,674,675,691,698],{"__ignoreMap":135},[139,676,677,679,681,683,685,687,689],{"class":141,"line":142},[139,678,157],{"class":156},[139,680,160],{"class":149},[139,682,164],{"class":163},[139,684,167],{"class":149},[139,686,171],{"class":170},[139,688,174],{"class":163},[139,690,220],{"class":149},[139,692,693,695],{"class":141,"line":153},[139,694,183],{"class":145},[139,696,697],{"class":149}," pull\n",[139,699,700],{"class":141,"line":180},[139,701,702],{"class":145},"./scripts/deploy-alwaysdata.sh\n",[70,704,705,706,709,710,713,714,717],{},"Il suppose un virtualenv en ",[91,707,708],{},"venv/"," et un ",[91,711,712],{},".env"," à la racine du projet. Le redémarrage se fait par un ",[91,715,716],{},"touch suddenly/wsgi.py"," — inutile de passer par le panel.",[70,719,720],{},"À la main, si vous préférez :",[130,722,724],{"className":132,"code":723,"language":134,"meta":135,"style":135},"cd /home/\u003Cuser>/www/soudainement\ngit pull\nsource venv/bin/activate\npython manage.py migrate\npython manage.py collectstatic --noinput\n",[91,725,726,742,748,754,762],{"__ignoreMap":135},[139,727,728,730,732,734,736,738,740],{"class":141,"line":142},[139,729,157],{"class":156},[139,731,160],{"class":149},[139,733,164],{"class":163},[139,735,167],{"class":149},[139,737,171],{"class":170},[139,739,174],{"class":163},[139,741,220],{"class":149},[139,743,744,746],{"class":141,"line":153},[139,745,183],{"class":145},[139,747,697],{"class":149},[139,749,750,752],{"class":141,"line":180},[139,751,239],{"class":156},[139,753,242],{"class":149},[139,755,756,758,760],{"class":141,"line":245},[139,757,419],{"class":145},[139,759,422],{"class":149},[139,761,425],{"class":149},[139,763,764,766,768,770],{"class":141,"line":260},[139,765,419],{"class":145},[139,767,422],{"class":149},[139,769,443],{"class":149},[139,771,446],{"class":156},[70,773,774,775,778],{},"Puis ",[73,776,777],{},"redémarrer le site"," depuis le panel Alwaysdata.",[100,780],{},[103,782,784],{"id":783},"checklist-post-déploiement","Checklist post-déploiement",[130,786,789],{"className":787,"code":788,"language":591},[589],"[ ] https://votre-domaine.fr répond\n[ ] https://votre-domaine.fr/.well-known/webfinger?resource=acct:admin@votre-domaine.fr\n[ ] https://votre-domaine.fr/.well-known/nodeinfo\n[ ] Création de compte fonctionne\n[ ] Upload de média fonctionne\n[ ] Fédération testée avec une autre instance\n",[91,790,788],{"__ignoreMap":135},[792,793,794],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":135,"searchDepth":153,"depth":153,"links":796},[797,798,799,800,801,802,806,807,808,809],{"id":105,"depth":153,"text":106},{"id":127,"depth":153,"text":128},{"id":197,"depth":153,"text":198},{"id":275,"depth":153,"text":276},{"id":292,"depth":153,"text":293},{"id":461,"depth":153,"text":462,"children":803},[804],{"id":577,"depth":180,"text":805},"Variables d'environnement (format FOO=bar, sans export)",{"id":598,"depth":153,"text":599},{"id":607,"depth":153,"text":608},{"id":665,"depth":153,"text":666},{"id":783,"depth":153,"text":784},"Déployer Suddenly sur Alwaysdata (PaaS Python WSGI).","md",{},true,{"title":42,"description":810},"RuPg7Yddi7OYiebjecm7e2P-1gk8EXcciem21VJ8BS0",1784021864437]